Docker


Docker

概述

Docker为什么会出现?

环境配置麻烦,每一台机器都要部署环境,费时费力

Docker给以上问题提出了解决方案

Docker核心思想:隔离

能干嘛

容器化技术

容器化技术不是模拟一个完整的操作系统

比较Docker和虚拟机技术的不同:

  • 传统虚拟机:虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器: 应用直接运行在宿主机的内核中,容器没有自己的内核,也没有虚拟硬件,所以轻便
  • 每个容器间相互隔离,每个容器内都有属于自己的文件系统,互不影响

Docker安装

Docker组成

  • 镜像(image):好比一个模板,可以通过这个模板来创建容器服务,一个镜像可以创建多个容器
  • 容器(container):独立运行一个或一组应用,通过镜像来创建。启动、停止、删除等基本命令
  • 仓库(repository):存放镜像。分为公有仓库和私有仓库

安装Docker

环境查看

系统内核是3.10以上

1
2
[root@izbp159tpwttz5ehtj9eh7z ~]# uname -r
3.10.0-1160.24.1.el7.x86_64

系统版本CentOS 7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@izbp159tpwttz5ehtj9eh7z ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

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
#1.卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo#下载地址默认国外

yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#阿里云
#更新软件包索引
yum makecache fast
#4.安装Docker相关的
yum install docker-ce docker-ce-cli containerd.io
#5. 启动Docker
systemctl start docker
#6.测试HelloWorld
docker run hello-world
#7.查看下载的HelloWorld镜像
docker image

阿里云镜像加速

  1. 登录阿里云,找到容器服务

  2. 找到镜像加速地址

  3. 配置使用

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

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://zr459l1k.mirror.aliyuncs.com"]
    }
    EOF

    sudo systemctl daemon-reload

    sudo systemctl restart docker

底层原理

Docker是怎么工作的?

Docker是一个Client-Server的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问

DockerServer收到DockerClient的指令,就会执行这个命令

Docker为什么比VM快?

  1. Docker有更少的抽象层
  2. Docker利用的是宿主机的内核,VM需要Guest OS

所以说,新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导

Docker的常用命令

帮助命令

1
2
3
docker version
docker info
docker 命令 --help #万能命令

帮助文档地址:https://docs.docker.com/reference/

镜像命令

docker images 查看所有本地的主机上的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@izbp159tpwttz5ehtj9eh7z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 4 months ago 13.3kB
mongo latest 995ccc33e58f 9 months ago 449MB
redis latest 739b59b96069 9 months ago 105MB
mongo <none> 30b3be246e39 10 months ago 449MB
hello-world latest d1165f221234 11 months ago 13.3kB

#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 创建时间
SIZE 大小

#可选项
-a, --all Show all images (default hides intermediate images)#列出所有镜像
-q, --quiet Only show image IDs#只显示ID

docker search 搜索镜像

1
2
3
4
5
6
7
8
9
10
11
[root@izbp159tpwttz5ehtj9eh7z ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12096 [OK]
mariadb MariaDB Server is a high performing open sou… 4634 [OK]

#可选项 通过搜索来过滤
--filter=STARS=3000 搜索结果都是STARS大于3000的
[root@izbp159tpwttz5ehtj9eh7z ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12096 [OK]
mariadb MariaDB Server is a high performing open sou… 4634 [OK]

docker pull 下载镜像

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
#docker pull 镜像名[:tag]
[root@izbp159tpwttz5ehtj9eh7z ~]# docker pull mysql
Using default tag: latest #不写tag,默认为latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载,docker images的核心 联合文件系统
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

#指定版本下载
[root@izbp159tpwttz5ehtj9eh7z ~]# docker pull mysql: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

docker rmi 删除镜像

1
[root@izbp159tpwttz5ehtj9eh7z ~]# docker rmi -f 镜像ID #删除指定镜像

容器命令

有镜像才可以创建容器

1
docker pull centos

新建容器并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker run [可选参数] image

#参数说明
--name="name" 容器名字,用来区分名字
-d 以后台方式运行
-i/-t 使用交互方式运行,进入容器,查看内容
-p 指定容器端口
-p IP:主机端口:容器端口
-p 主机端口:容器端口 #最常用
-p 容器端口
容器端口
-P 随机指定端口

#测试、启动并进入容器
[root@izbp159tpwttz5ehtj9eh7z ~]# docker run -it centos /bin/bash
[root@41517a3cc1df /]# ls #查看容器内的centos
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr

[root@41517a3cc1df /]# exit #从容器退回主机
exit

列出所有运行的容器

1
2
3
4
5
6
7
8
9
[root@izbp159tpwttz5ehtj9eh7z ~]# docker ps #正在运行
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

[root@izbp159tpwttz5ehtj9eh7z ~]# docker ps -a #正在运行+历史运行
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41517a3cc1df centos "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago stupefied_colden

docker ps -a -n=? #最近?个容器
docker ps -a -q #只显示容器的编号

退出容器

1
2
exit #直接退出
Ctrl + P + Q #容器不停止退出

删除容器

1
2
docker rm 容器ID #删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #别瞎搞!!!

启动和停止容器

1
2
3
4
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID

常用其他命令

后台启动容器

1
2
3
4
5
[root@zdogegg ~]# docker run -d centos
06df76d3f00fe00a5dfabc01132782025c0eee1cb61583e0a27fb3cbef5f5074

#问题:发现centos停止了
#docker容器如果使用后台运行,必须要有一个前台进程,Docker发现没有应用,就会自动停止

查看日志

1
docker logs

查看容器中进程信息

1
docker top 容器ID

查看镜像元数据

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
[root@zdogegg ~]# docker inspect 163fdb509342
[
{
"Id": "163fdb50934289d22b0b575cd613ef88379c4bb6d0fa8e86a7df077de97bb35e",
"Created": "2022-02-12T07:25:31.319442774Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 7952,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-02-12T07:25:31.728565242Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/163fdb50934289d22b0b575cd613ef88379c4bb6d0fa8e86a7df077de97bb35e/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/163fdb50934289d22b0b575cd613ef88379c4bb6d0fa8e86a7df077de97bb35e/hostname",
"HostsPath": "/var/lib/docker/containers/163fdb50934289d22b0b575cd613ef88379c4bb6d0fa8e86a7df077de97bb35e/hosts",
"LogPath": "/var/lib/docker/containers/163fdb50934289d22b0b575cd613ef88379c4bb6d0fa8e86a7df077de97bb35e/163fdb50934289d22b0b575cd613ef88379c4bb6d0fa8e86a7df077de97bb35e-json.log",
"Name": "/hungry_gates",
"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/be588a1378c58e687df63b2851d3068392b415333e1d2995eb8fb21802356fd3-init/diff:/var/lib/docker/overlay2/c1479b5062dc7e9d812f0afd32a976291f1b661a3fd91b2157b64f555a185a64/diff",
"MergedDir": "/var/lib/docker/overlay2/be588a1378c58e687df63b2851d3068392b415333e1d2995eb8fb21802356fd3/merged",
"UpperDir": "/var/lib/docker/overlay2/be588a1378c58e687df63b2851d3068392b415333e1d2995eb8fb21802356fd3/diff",
"WorkDir": "/var/lib/docker/overlay2/be588a1378c58e687df63b2851d3068392b415333e1d2995eb8fb21802356fd3/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "163fdb509342",
"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": "bfc0c8d125808ca02e2e57754dfdacc1ffab9cdf1b96a6ebd7ab762afb400043",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/bfc0c8d12580",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "418139e06cdbaec2e914a5bf6f72df4a2523384a7f793235a0f08be6e2ee81ec",
"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": "f8151f23596d176629859bbdfb0c7274306e2fce9d7dd9af22ce62165fed736f",
"EndpointID": "418139e06cdbaec2e914a5bf6f72df4a2523384a7f793235a0f08be6e2ee81ec",
"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
}
}
}
}
]

进入当前正在运行的容器

1
2
3
4
5
6
#方式一
[root@zdogegg ~]# docker exec -it 163fdb509342 /bin/bash
进入容器后打开一个新的终端
#方式二
[root@zdogegg ~]# docker attach 163fdb509342
进入容器正在执行的终端,不会打开新的终端

从容器内拷贝文件到主机

1
2
3
4
5
6
7
8
9
10
[root@163fdb509342 home]# ls   
[root@163fdb509342 home]# touch text.java
[root@163fdb509342 home]# exit
exit
[root@zdogegg ~]# cd /home
[root@zdogegg home]# ls
redis www
[root@zdogegg home]# docker cp 163fdb509342:/home/text.java /home #拷贝
[root@zdogegg home]# ls
redis text.java www

可视化

portainer

1
2
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Docker镜像讲解

分层理解

https://www.bilibili.com/video/BV1og4y1q7M4?p=19&spm_id_from=pageDriver

commit镜像

https://www.bilibili.com/video/BV1og4y1q7M4?p=20&spm_id_from=pageDriver

容器数据卷

什么是容器数据卷

如果数据都在容器中,容器删除,数据也都删除了。需求:数据持久化

容器之间可以有一个数据共享的技术。Docker容器中的数据同步到本地

这就是卷技术。将容器内的目录挂载到系统上

使用数据卷

方式一:使用命令来挂载

1
2
3
docker run -it -v 主机目录:容器目录

[root@zdogegg home]# docker run -it -v /home/ceshi:/home centos /bin/bash

实战:安装MySQL

https://www.bilibili.com/video/BV1og4y1q7M4?p=22&spm_id_from=pageDriver

1
[root@zdogegg home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

具名挂载和匿名挂载

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
#匿名挂载
[root@zdogegg home]# docker run -d -P --name nginx01 -v /etc/nginx nginx
db327d4f4365206f3a0052fb9a886515c1d02cc02c1a6a18fa377aee08eac0c7

#查看所有volume的情况
[root@zdogegg home]# docker volume ls
DRIVER VOLUME NAME
local 7b792d6e5b8eabc19c89990330a694919adbe70786939c9cbb09c87788b6e3b2
local 384b196427580a021b9ba9fdd827565ac83a74c8a5fd7049769c78d9f1f79627
local 2041fd734ac521236a31962da81d1449085d95dd121448383c15145f62f163bf
local c21ad8bda76ad06a6f4576d2decd48529b5140725a296e67d98acdb71bfd8e51
local de00cf584864d24c34ce5b920e3f9d353400eeb876a79e7cf8e60a1f19f07b6f
local ebeaf0cec15be450edbae14135a6ba1af17f0c18c239d358d0d140972579ff0c
local f78460a34483978f8ce854e0d3564dacf53c68b7cc1361258fe175c3d4d8cf72
#这种就是匿名挂载

#具名挂载
[root@zdogegg home]# docker run -d -P --name nginx02 -v juming-nginx:/etx/nginx nginx
58784b5f1865bd076b61f29709eaac44fc86567718fcb1f8fd2b423e13168ac4

[root@zdogegg home]# docker volume ls
DRIVER VOLUME NAME
local 7b792d6e5b8eabc19c89990330a694919adbe70786939c9cbb09c87788b6e3b2
local 384b196427580a021b9ba9fdd827565ac83a74c8a5fd7049769c78d9f1f79627
local 2041fd734ac521236a31962da81d1449085d95dd121448383c15145f62f163bf
local c21ad8bda76ad06a6f4576d2decd48529b5140725a296e67d98acdb71bfd8e51
local de00cf584864d24c34ce5b920e3f9d353400eeb876a79e7cf8e60a1f19f07b6f
local ebeaf0cec15be450edbae14135a6ba1af17f0c18c239d358d0d140972579ff0c
local f78460a34483978f8ce854e0d3564dacf53c68b7cc1361258fe175c3d4d8cf72
local juming-nginx#具名挂载

大多情况使用具名挂载

1
2
3
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 宿主机路径:容器内路径 #指定路径挂载

初识DockerFile

DockerFile就是用来构建Docker镜像的构建文件

通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令是一层

1
2
3
4
5
6
7
#dockerfile 内容
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@zdogegg docker-test-volume]# vim dockerfile1

[root@zdogegg docker-test-volume]# docker build -f dockerfile1 -t dogegg/centos:11.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in fdb3e9fe52a1
Removing intermediate container fdb3e9fe52a1
---> d5e7026648eb
Step 3/4 : CMD echo "----end----"
---> Running in 80ea319f2a3a
Removing intermediate container 80ea319f2a3a
---> 5b52a390c39f
Step 4/4 : CMD /bin/bash
---> Running in da285d77ab63
Removing intermediate container da285d77ab63
---> a25e9de4afb1
Successfully built a25e9de4afb1
Successfully tagged dogegg/centos:11.0

这种方式使用的非常多,因为我们通常会使用自己的镜像

数据卷容器

多个容器同步数据

1
2
3
[root@zdogegg /]# docker run -it --name docker01 dogegg/centos:1.0
[root@zdogegg ~]# docker run -it --name docker02 --volumes-from docker01 dogegg/centos:11.0
[root@zdogegg ~]# docker run -it --name docker03 --volumes-from docker02 dogegg/centos:11.0

DockerFile

DockerFile是构建Docker镜像的文件

构建步骤:

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

DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)必须大写
  2. 从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过DockerFile生成的镜像,最终发布和运行的产品

Docker容器:镜像运行起来提供服务

DockerFile指令

1
2
3
4
5
6
7
8
9
10
11
12
FROM #基础镜像
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建时需要的命令
ADD #添加内容
WORKDIR #镜像工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口
CMD #指定这个容器启动时要运行的命令(只有最后一个会生效, 可被替代)
ENTRYPOINT #指定这个容器启动时要运行的命令(可以追加命令)
ONBUILD #触发指令
COPY #将文件拷贝到镜像中
ENV #构建的时候设置环境变量

实战测试

https://www.bilibili.com/video/BV1og4y1q7M4?p=28&spm_id_from=pageDriver

实战:Tomcat镜像

https://www.bilibili.com/video/BV1og4y1q7M4?p=30&spm_id_from=pageDriver

Docker网络

理解Docker0

https://www.bilibili.com/video/BV1og4y1q7M4?p=34&spm_id_from=pageDriver

自定义网络

网络模式

  • bridge:桥接
  • none:不配置网络
  • host:和宿主机共享网络
  • container:容器内网络连通

测试

1
2
3
4
5
6
7
8
docker run -d -P --name 容器名 --net bridge 镜像名
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@zdogegg ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
96262a61da8c bridge bridge local
25dd065b332e host host local
7b952fcc9d57 mynet bridge local
1a60752ebcc4 none null local

文章作者: ZDogEgg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZDogEgg !