Docker

前言:
    根据狂神视频整理

一. Docker概述

1. Docker简介

现在有一个问题,我开发的程序在我的电脑上可以正常运行,版本更新或其他的一些操作可能会导致服务不可用,但是配置环境是十分痛苦的,相信这个大家都有体会😥,在服务器上面配置各种Redis, MySQL, jdk等极其的麻烦,而且还不能跨平台,因此docker诞生了,它给以上的问题给出了一个解决方案。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

下面是Docker的文档和仓库

文档

仓库

2. Docker与虚拟机技术的比较

  • 传统的虚拟机,虚拟出一条硬件,运行出完整的操作系统,然后在这个系统上安装和运行我们的软件、

  • 容器内的应用直接运行在宿主机,容器是没有自己的内核的,也没有虚拟的硬件,所以就会轻便许多

  • 每个容器之间是互相隔离的,每个容器的内部有自己的文件系统,互不影响

二. Docker的安装

  1. 卸载旧版本
1
yum remove docker \
  1. 安装需要的安装包
1
yum install -y yum-utils
  1. 设置镜像仓库
1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  

这里使用的是阿里云的镜像

  1. 这里最好再更新一下
1
yum makecache fast
  1. 开始安装
1
yum install docker-ce docker-ce-cli containerd.io

安装docker相关的

-ce社区

-ee 企业版

  1. 启动docker
1
systemctl start docker
  1. 查看是否安装成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@Mercury /]# docker version

Client: Docker Engine - Community

Version: 20.10.14

API version: 1.41

Go version: go1.16.15

Git commit: a224086

Built: Thu Mar 24 01:49:57 2022

OS/Arch: linux/amd64

Context: default

Experimental: true



Server: Docker Engine - Community

Engine:

Version: 20.10.14

API version: 1.41 (minimum version 1.12)

Go version: go1.16.15

Git commit: 87a90dc

Built: Thu Mar 24 01:48:24 2022

OS/Arch: linux/amd64

Experimental: false

containerd:

Version: 1.5.11

GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8

runc:

Version: 1.0.3

GitCommit: v1.0.3-0-gf46b6ba

docker-init:

Version: 0.19.0

GitCommit: de40ad0

可以打印出以上信息,说明成功了

  1. 测试是否可以正常运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@Mercury /]# docker run hello-world

Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world

2db29710123e: Pull complete

Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67

Status: Downloaded newer image for hello-world:latest



Hello from Docker!

This message shows that your installation appears to be working correctly.



To generate this message, Docker took the following steps:

1. The Docker client contacted the Docker daemon.

2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

(amd64)

3. The Docker daemon created a new container from that image which runs the

executable that produces the output you are currently reading.

4. The Docker daemon streamed that output to the Docker client, which sent it

to your terminal.



To try something more ambitious, you can run an Ubuntu container with:

$ docker run -it ubuntu bash



Share images, automate workflows, and more with a free Docker ID:

https://hub.docker.com/



For more examples and ideas, visit:

https://docs.docker.com/get-started/
  1. 查看镜像
1
2
3
4
5
[root@Mercury /]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hello-world latest feb5d9fea6a5 7 months ago 13.3kB
卸载

首先卸载 Docker 引擎、CLI 和 Containerd 软件包:

1
sudo yum remove docker-ce docker-ce-cli containerd.io

主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:

1
2
sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd

1. 配置阿里云镜像加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://阿里云给你的镜像加速地址.mirror.aliyuncs.com"]

}
EOF


sudo systemctl daemon-reload

sudo systemctl restart docker

三. Docker常用的一些命令

一些基本的命令

docker version 查看docker 版本信息

docker info 查看docker的系统信息,包括镜像和容器的数量

docker --help 查看帮助文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@Mercury ~]# docker images --help                                             # 查看image的帮助

Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:

-a, --all Show all images (default hides intermediate images) # 可以添加的参数以及对应的解释

--digests Show digests

-f, --filter filter Filter output based on conditions provided

--format string Pretty-print images using a Go template

--no-trunc Don't truncate output

-q, --quiet Only show image IDs

1. 镜像命令

1.1 查看镜像

1
2
3
4
5
6
7
8
9
10
11
12
[root@Mercury ~]# docker images                                                    # 查看所有的镜像

REPOSITORY TAG IMAGE ID CREATED SIZE

hello-world latest feb5d9fea6a5 7 months ago 13.3kB

# 释义
REPOSITOPY 镜像的仓库
TAG 镜像的标签
TMAGE 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小

1.2 搜索镜像

docker search

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@Mercury ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12527 [OK]
mariadb MariaDB Server is a high performing open sou… 4819 [OK]
percona Percona Server is a fork of the MySQL relati… 575 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 527 [OK]
bitnami/mysql Bitnami MySQL Docker Image 70 [OK]
linuxserver/mysql-workbench 36
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 35
ubuntu/mysql MySQL open source fast, stable, multi-thread… 31
circleci/mysql MySQL is a widely used, open-source relation… 25
google/mysql MySQL server for Google Compute Engine 21 [OK]
vmware/harbor-db Mysql container for Harbor 10
bitnami/mysqld-exporter 3
ibmcom/mysql-s390x Docker image for mysql-s390x 2
newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK]
vitess/mysqlctld vitess/mysqlctld 1 [OK]
nasqueron/mysql 1 [OK]
cimg/mysql 0
silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK]
drud/mysql-local-57 ddev mysql local container 0
drud/mysql 0
drud/mysql-docker-local-57 This repo has been deprecated, new tags are … 0
drud/mysql-docker-local docker containers for local womysql rk 0 [OK]
docksal/mysql MySQL service images for Docksal - https://d… 0
mirantis/mysql 0
drud/mysqld-exporter



# 可选项 通过搜索来过滤
--filter=STARS=3000 #搜索星星的数量大于3000的
[root@Mercury ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12527 [OK]
mariadb MariaDB Server is a high performing open sou… 4819 [OK]

1.3 下载镜像

docker pull 镜像名[:tag]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@Mercury ~]# docker pull mysql

Using default tag: latest #如果不指定的话,默认给你下载最新的

latest: Pulling from library/mysql

72a69066d2fe: Pull complete # 这里是分层下载,等会再讲

93619dbc5b36: Pull complete

99da31dd6142: Pull complete

626033c43d70: Pull complete

37d5d7efb64e: Pull complete

ac563158d721: Pull complete

d2ba16033dad: Pull complete

688ba7d5c01a: Pull complete

00e060b6d11d: Pull complete

1c04857f594f: Pull complete

4d7cfa90e6ea: Pull complete

e0431212d27d: Pull complete

Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名

Status: Downloaded newer image for mysql:latest

docker.io/library/mysql:latest #真实的地址


# 这两个是等价的
docker pull mysql
docker pull docker.io/library/mysql:latest

指定版本下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@Mercury ~]# docker pull mysql:5.7             # 指定5.7版本的下载

5.7: Pulling from library/mysql

72a69066d2fe: Already exists # 可以看到这里不用再下载,这就是分层下载的优势,可以复用,大大减少内存等的压力

93619dbc5b36: Already exists

99da31dd6142: Already exists

626033c43d70: Already exists

37d5d7efb64e: Already exists

ac563158d721: Already exists

d2ba16033dad: Already exists

0ceb82207cd7: Pull complete

37f2405cae96: Pull complete

e2482e017e53: Pull complete

70deed891d42: Pull complete

Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94

Status: Downloaded newer image for mysql:5.7

docker.io/library/mysql:5.7


[root@Mercury ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mysql 5.7 c20987f18b13 4 months ago 448MB

mysql latest 3218b38490ce 4 months ago 516MB

hello-world latest feb5d9fea6a5 7 months ago 13.3kB

1.4 删除镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@Mercury ~]# docker rmi -f c20987f18b13       # 删除 通过id 或者名字都行

Untagged: mysql:5.7

Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94

Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76

Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989

Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f

Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150

Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92

[root@Mercury ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mysql latest 3218b38490ce 4 months ago 516MB

hello-world latest feb5d9fea6a5 7 months ago 13.3kB

全部删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@Mercury ~]# docker rmi -f $(docker images -aq)   # 里面的那句话是查询全部的dockerid

Untagged: mysql:latest

Untagged: mysql@sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709

Deleted: sha256:3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b

Deleted: sha256:aa81ca46575069829fe1b3c654d9e8feb43b4373932159fe2cad1ac13524a2f5

Deleted: sha256:0558823b9fbe967ea6d7174999be3cc9250b3423036370dc1a6888168cbd224d

Deleted: sha256:a46013db1d31231a0e1bac7eeda5ad4786dea0b1773927b45f92ea352a6d7ff9

Deleted: sha256:af161a47bb22852e9e3caf39f1dcd590b64bb8fae54315f9c2e7dc35b025e4e3

Deleted: sha256:feff1495e6982a7e91edc59b96ea74fd80e03674d92c7ec8a502b417268822ff

Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba

Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7

Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da

Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838

Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0

Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa

Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2

Untagged: hello-world:latest

Untagged: hello-world@sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67

Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

[root@Mercury ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE # 可以看到已经没有镜像了

2. 容器命令

2.1 启动和退出容器

1
2
3
4
5
6
7
8
9
10
11
12
13
root@Mercury ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos latest 5d0da3dc9764 7 months ago 231MB

# 启动并进入容器

[root@Mercury ~]# docker run -it centos /bin/bash

[root@2e2aa125d5c4 /]# ls # 可以看到root后面的主机号已经变了

bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

退出容器

1
2
3
4
5
6
7
[root@2e2aa125d5c4 /]# exit                   # 这个是退出并关闭容器

exit


[root@2e2aa125d5c4 /] [root@Mercury ~] # 按住ctrl + p + q ,退出但是并不关闭

2.2 列出所有运行的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# docker ps   列出当前正在运行的命令
# -a 列出当前运行的容器+历史运行过的容器
# -n=? 显示最近创建过的容器
# -q 只显示容器的编号

[root@Mercury ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3968ef35633d centos "/bin/bash" 25 hours ago Up 25 hours quirky_lewin

[root@Mercury ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3968ef35633d centos "/bin/bash" 25 hours ago Up 25 hours quirky_lewin
2e2aa125d5c4 centos "/bin/bash" 2 days ago Exited (0) 2 days ago nervous_golick
62c5b7704890 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago serene_bohr

[root@Mercury ~]# docker ps -aq
3968ef35633d
2e2aa125d5c4
62c5b7704890

2.3 删除容器

1
2
3
4
5
docker rm 容器id                  #删除指定的容器 不能删除正在运行容器

docker rm -f $(docker ps -aq) #删除所有的容器

docker ps -a -q|xargs docker rm #删除所有的容器

2.4 启动和停止容器的操作

1
2
3
4
docker start 容器id               # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id # 强制停止当前的容器
区别

docker run 后面指定的是一个镜像,而docker start指定的是一个容器,docker run是利用镜像生成容器,并启动容器,而docker start是启动一个之前生成过的容器

3. 常用的其他命令

3.1 后台启动容器

1
2
3
4
# 命令 docker run -d 镜像名
[root@Mercury /]# docker run -d centos
# 这里有个坑
# 容器使用后台运行,就必须要一个后台进程,docker发现没有应用,就会自动停止
docker run -it centos /bin/bash 后面的 bin/bash的作用

首先,docker run -it centos 的意思是,为centos这个镜像创建一个容器, -i和-t这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash,但是有些镜像不适合bash shell风格,会报错。

3.2 查看日志

1
2
3
4
5
6
docker logs -f -t --tail 容器id

-tf # 显示日志
--tail number # 要显示的日志数

docker logs -f -t --tail 10 dce7b86172bf # 显示十条日志

3.3 查看进程信息

1
2
3
4
# 命令docker top 容器id
[root@Mercury ~]# docker top 3968ef35633d
UID PID PPID C STIME TTY TIME CMD
root 10899 10880 0 May07 pts/0 00:00:00 /bin/bash

3.4 查看镜像的元数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# 命令 docker inspect 容器id
[root@Mercury ~]# docker inspect 3968ef35633d
[
{
"Id": "3968ef35633d72bcb0a27b4a29d24f640e02306f196f392cd0d54967a67c11ee",
"Created": "2022-05-07T08:18:55.224515441Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 10899,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-05-07T08:18:55.866857542Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/3968ef35633d72bcb0a27b4a29d24f640e02306f196f392cd0d54967a67c11ee/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/3968ef35633d72bcb0a27b4a29d24f640e02306f196f392cd0d54967a67c11ee/hostname",
"HostsPath": "/var/lib/docker/containers/3968ef35633d72bcb0a27b4a29d24f640e02306f196f392cd0d54967a67c11ee/hosts",
"LogPath": "/var/lib/docker/containers/3968ef35633d72bcb0a27b4a29d24f640e02306f196f392cd0d54967a67c11ee/3968ef35633d72bcb0a27b4a29d24f640e02306f196f392cd0d54967a67c11ee-json.log",
"Name": "/quirky_lewin",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/2a0cabf5bad359705499d87ae235e88f9f35f81a4d990e0ec5cb30de3fe78ded-init/diff:/var/lib/docker/overlay2/c55a40a69f5947ab379bbcf187bb281e1eeaf6bec2e5b85e231ff9c4ba5884aa/diff",
"MergedDir": "/var/lib/docker/overlay2/2a0cabf5bad359705499d87ae235e88f9f35f81a4d990e0ec5cb30de3fe78ded/merged",
"UpperDir": "/var/lib/docker/overlay2/2a0cabf5bad359705499d87ae235e88f9f35f81a4d990e0ec5cb30de3fe78ded/diff",
"WorkDir": "/var/lib/docker/overlay2/2a0cabf5bad359705499d87ae235e88f9f35f81a4d990e0ec5cb30de3fe78ded/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "3968ef35633d",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "ae8f277d769fa5de37a1ba3b41eec18a0dd9377560570375fad7d3ef95d5501b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/ae8f277d769f",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "20bfd8331adfc270031bd6c2e26cbf4e7a215d5af2394fb173953ac0624cf999",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "210f490ac0f5fe787e4a55b53622328897a75ad50fabf976732734b961ddcf4a",
"EndpointID": "20bfd8331adfc270031bd6c2e26cbf4e7a215d5af2394fb173953ac0624cf999",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]

3.5 进入当前正在运行的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方式一
# 命令 docker exec -it 容器id bashshell

[root@Mercury ~]# docker exec -it 3968ef35633d /bin/bash
[root@3968ef35633d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@3968ef35633d /]#

# 方式二
# 命令docker attach 容器id
[root@Mercury ~]# docker attach 3968ef35633d

# docker exec # 进入容器后开启一个新的终端,可以再里里面进行操作
# docker attach # 进入容器正在执行的终端,不会启动新的终端

3.6 从容器拷贝文件到主机上

1
2
# docker cp 容器id : 容器内的路径   目的主机地址
[root@Mercury ~]# docker cp 3968ef35633d:/home/test.java /home

4. 小小的来实战一波

4.1 安装nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 首先docekr pull nginx 就不说了
# 下载好后就开始运行
# -d 后台运行
# -p 映射端口
# --name 起个名字

[root@Mercury ~]# docker run -d --name nginx01 -p 3344:80 nginx

7dfb5ccc4ee6146ca43cfecb66eeb52ad8ee01202e6cf5020b18e5d94e9048f3

[root@Mercury ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

7dfb5ccc4ee6 nginx "/docker-entrypoint.…" 11 seconds ago Up 9 seconds 0.0.0.0:3344->80/tcp nginx01
s
3968ef35633d centos "/bin/bash" 2 days ago Up 2 days quirky_lewin

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@Mercury ~]# curl localhost:3344

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

html { color-scheme: light dark; }

body { width: 35em; margin: 0 auto;

font-family: Tahoma, Verdana, Arial, sans-serif; }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>



<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>



<p><em>Thank you for using nginx.</em></p>

</body>

</html>

# 测试成功!

4.2 安装可视化操作面板portainer

1
2
3
[root@Mercury ~]# docker run -d -p 8080:9000 \

> --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

没什么讲的,尽量不适用可视化面板

四. Docker镜像讲解

1. 镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时的库环境变量和配置文件。所有的应用,直接打包docker镜像,就可以直接跑起来

那么如何得到镜像呢?
  • 从远程仓库下载
  • 拷贝
  • 自己制作一个DockerFile

2. Docker镜像加载原理

UnionFS联合文件系统

UnionFS(联合文件系统)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种集体的应用镜像

特性:一次同时加载多个文件系统,但从外面看起来,只能看到文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包含所有的文件和目录

Docker镜像加载原理

docker的镜像实际上哟一层一层的文件系统组成,这种层级的文件系统UnionFS.

bootfs(boot file system) 主要包含bootloader和kernal,bootloader主要是引导加载kernal,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix 系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时额你存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

rootfs(root file system),在bootfs之上。包含的就是典型Linux系统的 /dev,/proc/,/bin,/etc等标准目录和文件。rootf就是各种不同操作系统发行版。比如Ubuntu,Centos等等

为什么平时安装虚拟机的Centos都是好几个G,但是Docker才200多M?

简单的来说就是,这个centos只有最基本的一些命令,是不完全的centos,是被阉割过的(刀法精准),因此才会比较小

3. 分层理解

从之前的下载就可以看出,docker下载的时候是分层下载的

为什么要采用分层下载这种方式呢?

最大的好处就是资源共享,比如这里有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上面保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

特点

Docker的镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部,这一层就是我们通常所讲的容器层,而容器之下的都叫镜像层。

五. 容器数据卷

总的来说就是容器的持久化和同步操作,容器之间也是可以数据共享的,这里就需要把容器内的内容同步一下

挂载命令:docker run -it -v 主机目录: 容器内的目录

1
docker run -it -v  /home/test:/home  centos /bin/bash
注意:

这里的挂载是双向同步,哪一边修改了,都会进行同步

可以使用inspect命令查看挂载,里面的mount即是挂载相关的配置

1
2
3
4
5
6
7
8
9
10
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]

我们这里就可以想到一个实际的用途(不然发明挂载干什么🤣) ,比如修改容器内的nginx的配置文件,

1. 持久化mysql数据实战

安装mysql

1
docker pull mysql:5.7

启动和配置

1
2
3
4
5
6
7
8
9
10
11
12
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 这个是官方的配置代码

-d 后台运行

-p 端口映射

-v 卷挂载

-e 环境配置

--name 容器的名字

我们再额外配置一下端口映射

1
docker run -d -p 3310:3306 -v /home/mysql:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

假设将容器删除,挂载到本地的数据卷依旧并不会丢失,实现持久化功能

2. 具名挂载和匿名挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 匿名挂载
-v 容器内路径
[root@Mercury dockerfile]# docker run -d -p --name nginx01 -v /et/nginx nginx
# 就是-v的时候只写了容器内的路径没有写容器外的路径,就是匿名挂载


# 查看所有volume 的情况
docker volume ls

# 具名挂载
[root@Mercury dockerfile]# docker run -d -P --name nginx02 -v jumping-nginx:/etc/nginx nginx
[root@Mercury dockerfile]# docker volume ls
DRIVER VOLUME NAME
local 2e6932c90fc933391e4481d1360ee083eb3477ceb7a097b1123d3370f43a7611
local 45d9e1935720bdab02775b3131bffe2a26bacda3090e2ad807d4a94385f52974
local jumping-nginx

# 可以看到最下面的那个有了我们赋值的名字

查看一下这个卷

1
2
3
4
5
6
7
8
9
10
11
12
[root@Mercury dockerfile]# docker volume inspect jumping-nginx
[
{
"CreatedAt": "2022-05-14T19:35:12+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/jumping-nginx/_data",
"Name": "jumping-nginx",
"Options": null,
"Scope": "local"
}
]

所有的docker容器内的卷,没有指定目录情况下都是在/var/lib/docker/volumes/xxxx/_data

1
2
3
-v 容器内路径           # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
拓展
1
2
3
4
5
6
7
# 通过-v 容器内路径 ro rw 改变读写权限
ro read only
rw read write

# 只要有ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的,默认都是rw
docker run -d -P --name nginx02 -v jumping-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v jumping-nginx:/etc/nginx:rw nginx

3. 多个容器数据同步

1
2
3
4
5
[root@Mercury dockerfile]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@Mercury dockerfile]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volume-from mysql01 mysql:5.7

# 以上

容器之间的数据传递,数据卷容器的生命周期一直持续到容器停止使用为止,但如果持久化到了本地,便不会丢失

六. DockerFile

1. 初识Docker

介绍:

构建步骤

  1. 编写dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

基础知识

每个关键字 (指令)都必须是大写字母

执行从上到下顺序执行

# 表示注释

每一个指令都会创建提交一个新的镜像层,并提交

image-20220514195654277

2. dockerfile命令

  • FROM 基础镜像,一切从这里构建

  • MAINTAINER 镜像是谁写的,姓名+邮箱

  • RUN 镜像构建的时候需要运行的命令

  • ADD 步骤,添加镜像内容

  • WORKDIR 镜像的工作目录

  • VOLUME 挂载的目录

  • EXPOSE 暴露端口

  • CMD 指定这个容器启动的时候需要的命令 只有最后一个会生效可以被替代

  • ENTRYPOINT 指定这个容器启动的时候需要的命令可以追加命令

  • ONBUILD 当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令

  • COPY 类似ADD 将我们文件拷贝到镜像中

  • ENV 构建的时候设置环境变量

通过这个脚本生成镜像

1
2
3
4
5
6
7
8
9
10
11
12
FROM centos


VOLUME ["volume01", "volume02 "]


CMD echo "-----end-----"

CMD /bin/bash


docker build -f dockerfilel -t /kuangshen/centos .

3. 构建一个自己的centos

从源码中可以发现dockerhub中大部分的镜像都是从scratch 过来的,然后配置需要的软件来进行构建

  1. 编写一个dockerfile文件
1
vim mydockerfile-centos

编写脚本安装 vim 和 net-tools

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM centos:7

MAINTAINER chenning<chenning_william@163.com>


ENV MYPATH /usr/local

WORKDIR $MYPATH


RUN yum -y install vim

RUN yum -y install net-tools


EXPOSE 80


CMD echo $MYPATH

CMD echo "----end----"

CMD /bin/bash

2.build

1
2
3
4
5
6
7
8
[root@Mercury dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .


# 成功后返回

Successfully built 76804282c147

Successfully tagged mycentos:0.1

3.测试运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 进入容器
[root@4859366666ba local]# pwd
/usr/local
[root@4859366666ba local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.6 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:06 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 可以看到工作路径变成了 /usr/local 而且ipconfig也能正常使用,说明成功了
  1. 我们可以列出变更的历史
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@Mercury dockerfile]# docker history 76804282c147
IMAGE CREATED CREATED BY SIZE COMMENT
76804282c147 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
ef56285a896a 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
f43334273bac 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
9aee7126d86d 7 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
ec21bf9df499 7 minutes ago /bin/sh -c yum -y install net-tools 166MB
61dc5db67561 7 minutes ago /bin/sh -c yum -y install vim 221MB
95e5b666e6fc 8 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
3febcbabfc09 8 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
d08da42f9b1f 8 minutes ago /bin/sh -c #(nop) MAINTAINER chenning<chenn… 0B
eeb6ee3f44bd 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB

4. CMD和ENTRYPOINT区别

CMD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编写dockerfile文件
[root@Mercury dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@Mercury dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest
[root@Mercury dockerfile]# docker run dd8e4401d47f
...
# ls -a命令生效

[root@Mercury dockerfile]# docker run dd8e4401d47f -l
docker:error
# 但是如果追加命令docker run dd8e4401d47f -l 便会报错,因为-l取代了CMD ["ls","-a"]命令

ENTRYPOINT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编写dockerfile文件
[root@Mercury dockerfile]# vim dockerfile-cmd-test
FROM centos
ENTRYPOINT ["ls","-a"]

# 构建镜像
[root@Mercury dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest
[root@Mercury dockerfile]# docker run dd8e4401d47f
...
# ls -a命令生效

[root@Mercury dockerfile]# docker run dd8e4401d47f -l
...
# 如果追加命令docker run dd8e4401d47f -l 可以正常追加命令执行。

5. 实战tomcat镜像

  1. 准备tomcat jdk压缩包

  2. 编写Dockerfile 官方命名Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
FROM centos:7

MAINTAINER chenning<chenning_william@163.com>
COPY readme.txt /usr/local/readme.txt


ADD jdk-8u333-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.62.tar.gz /usr/local


RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH



ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HONE /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HONE/bin


EXPOSE 8080


CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out
  1. 构建镜像
1
[root@Mercury tomcat]# docker build -t diytomcat .

一定需要注意最后面有个点

  1. 启动测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@Mercury tomcat]# docker run -d -p 9090:8080 --name mercurytomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.62/logs diytomcat

[root@Mercury tomcat]# curl localhost:9090

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8" />

<title>Apache Tomcat/9.0.62</title>

<link href="favicon.ico" rel="icon" type="image/x-icon" />

<link href="tomcat.css" rel="stylesheet" type="text/css" />

</head>

可以看到正常加载了,说明成功了,然后就可以在挂载的目录里面直接发布项目了

6. 发布自己的镜像

6.1 DockerHub

  1. 登录
1
docker login -u username
1
2
3
4
5
6
7
[root@Mercury tomcat]# docker login -u 52hzmercury
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  1. 更改项目名

就是在前面加上自己的用户名后面家伙是那个版本号

1
docker tag image-id 52hzmercury/diytomcat:1.0
  1. 推送

尽量带上版本号

1
docker push 52hzmercury/diytomcat:1.0

6.2 阿里云

官方文档里面写得非常的清楚

1
2
3
$ docker login --username=52hz的mercury registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/52hzmercury/mercury:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/52hzmercury/mercury:[镜像版本号]

小结

docker的全部流程

image-20220515205955013

七. Docker网络

1. 初识docker网络

首先我们知道通过ip addr 可以查看IP的相关信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Mercury ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:12:a0:63 brd ff:ff:ff:ff:ff:ff
inet 172.26.25.110/18 brd 172.26.63.255 scope global dynamic eth0
valid_lft 312060333sec preferred_lft 312060333sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:15:a3:19:b8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
41: veth2731295@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ba:f3:19:6f:a2:7e brd ff:ff:ff:ff:ff:ff link-netnsid 0

查看容器相关的ip信息

1
2
3
4
5
6
7
8
9
[root@Mercury ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
42: eth0@if43: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

容器无法执行相关的指令,需要进入容器安装,执行apt update && apt install -y iproute2

发现eth0@if43地址,这就是docker分配的网络

1
2
3
4
5
[root@Mercury ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.114 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.097 ms
原理

每启动一个docker容器 docker就会给docker容器分配一个ip 只要安装了docker 就会有一个网卡docker0桥接模式吗,使用的技术是evth-pair技术

容器带来的网卡都是一对一对的,evth-pair 就是一 对的虚拟设备接口,他们都是承兑出现的,一段连着协议,一段彼此相连

正因为有这个特性,evht-pair充当着桥梁 连接着各种虚拟网络设备启动容器后再次查看容器的ip信息,可以看到多了43这一行,并且后面信息跟着42

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Mercury ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:12:a0:63 brd ff:ff:ff:ff:ff:ff
inet 172.26.25.110/18 brd 172.26.63.255 scope global dynamic eth0
valid_lft 312058161sec preferred_lft 312058161sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:15:a3:19:b8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
43: veth7a74e4d@if42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 9a:72:2b:67:26:e5 brd ff:ff:ff:ff:ff:ff link-netnsid 0

再启动一个tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@Mercury ~]# docker run -d -P --name tomcat02 tomcat
3bbabab9c34a800b7663746f07f2ed9ed27aa292d291cfd6bbb4b5a5e0675899
[root@Mercury ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:12:a0:63 brd ff:ff:ff:ff:ff:ff
inet 172.26.25.110/18 brd 172.26.63.255 scope global dynamic eth0
valid_lft 312058079sec preferred_lft 312058079sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:15:a3:19:b8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
43: veth7a74e4d@if42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 9a:72:2b:67:26:e5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
45: vethccc3ec9@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ce:6b:95:66:9e:f8 brd ff:ff:ff:ff:ff:ff link-netnsid 1

测试tomcat01 ping tomcat02是可以ping通的,原理就是下面这张图

image-20220517161020371

再来一个容器,把它和tomcat02连接起来

1
docker run -d -P --name tomcat03 --link tomcat02 tomcat
如果没提示有ping命令

在容器内执行 apt-get update && apt-get install iputils-ping

再ping一下

1
2
3
4
5
6
7
[root@Mercury ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.182 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.081 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.135 ms

# 可以看到是ping通的

反向来一下子

1
2
3
4
[root@Mercury ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

#ping 不通

我们来看一下tomcat03的容器配置,可以看到tomcat03在本地配置了tomcat02的配置

1
2
3
4
5
6
7
8
9
[root@Mercury ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 3bbabab9c34a #在这里配置了tomcat02的连接
172.17.0.4 76e0fe012ef9

再来看看tomcat02的

1
2
3
4
5
6
7
8
9
10
[root@Mercury ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 3bbabab9c34a

# 并没有配置

因此反向是ping不通的

3. 网络模式

  • bridge: 桥接 docker默认
  • none 不配置网络
  • host 和容器共享网络
  • container 容器网络联通
1
2
3
4
5
6
# 查看所有docker网络
[root@Mercury ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
210f490ac0f5 bridge bridge local
6c94eae8c3c6 host host local
8a937df872e9 none null local

自定义网络

1
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

网络和容器联通

1
docker network connect mynet tomcat01

=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=END~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=


Docker
http://example.com/2022/04/24/Docker/
作者
Mercury
发布于
2022年4月24日
许可协议