Docker基础

介绍

技术 特性 适用场景 说明
Docker 容器化 - 官网
- Doc
- Ubuntu版下载
Docker-Compose 容器编排 - Doc
dockerize Docker延迟启动 - Github

安装Docker

先决条件

升级内核

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,使用如下命令查看内核版本:

1
$ uname -r

添加国内Docker源

1
2
3
4
5
6
$ yum -y install yum-utils
$ yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件源缓存
$ yum makecache fast

添加内核参数

1
2
3
4
5
6
7
8
9
# 添加内核参数,避免出现如下警告:
# 1. WARNING:bridge-nf-call-iptables is disabled
# 2. WARNING:bridge-nf-call-ip6tables is disabled
$ tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 重新加载 sysctl.conf
$ sysctl -p

Ubuntu中安装Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 升级包管理器
$ sudo apt-get update

# 安装所有必须和可选的包
$ sudo apt-get upgrade
$ sudo apt install docker.io

# 启动
$ systemctl start docker

# 配置开机启动
$ systemctl enable docker

# 检查安装、查看当前安装版本
$ docker --version

CentOS7中安装Docker-1.12.3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 检查wget是否安装
$ rpm -q wget

# 安装wget
$ yum install -y wget

# 安装Docker-1.12.3
$ mkdir -p ~/_src \
&& cd ~/_src \
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.3-1.el7.centos.noarch.rpm \
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.3-1.el7.centos.x86_64.rpm \
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-debuginfo-1.12.3-1.el7.centos.x86_64.rpm \
&& yum localinstall -y docker-engine-selinux-1.12.3-1.el7.centos.noarch.rpm docker-engine-1.12.3-1.el7.centos.x86_64.rpm docker-engine-debuginfo-1.12.3-1.el7.centos.x86_64.rpm

# 启动Docker并设置开机启动
$ systemctl enable docker && systemctl start docker

CentOS中安装指定版本的Docker

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
# 添加Docker的yum源
$ cat>> /etc/yum.repos.d/docker-main.repo <<EOF
[docker-main]
name=docker-main
baseurl=http://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7/
gpgcheck=1
enabled=1
gpgkey=http://mirrors.aliyun.com/docker-engine/yum/gpg
EOF

# 更新源、升级系统
$ yum makecache && yum update -y

# 卸载旧版本Docker
$ yum remove -y docker*

# 列出所有版本
$ yum list docker-engine --showduplicates |sort -r

# 安装指定版本
$ yum -y install docker-engine-<VERSION_STRING>
$ yum -y install docker-engine-selinux-<VERSION_STRING>
$ yum install docker-ce-17.09.0.ce -y

# 启动Docker并设置开机启动
$ systemctl enable docker && systemctl start docker

CentOS7中Docker升级到最新版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 删除旧版本的Docker
$ yum remove docker docker-common docker-selinux docker-engine

# 安装依赖包
$ yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置Docker yum 源
$ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件源缓存
$ yum makecache fast

# 查看所有仓库中的所有docker版本
$ yum list docker-ce --showduplicates | sort -r

# 安装最新版本并跳过公钥检查
$ yum install -y docker-ce --nogpgcheck

# 启动Docker并设置开机启动
$ systemctl enable docker && systemctl start docker

# 查看Docker版本
$ docker version

Docker版本对应

version Docker Engine release
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

Docker网络

网络模式 指定命令 说明
none --network=none 这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
host --network=host 使用host模式的容器可以直接使用docker host的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
bridge 不指定--network 容器的默认网络模式,docker在安装时会创建一个名为docker0的Linux bridge,在不指定--network的情况下,创建的容器都会默认挂到docker0上面。
container --network=container:NAME_or_ID 创建容器时使用--network=container:NAME_or_ID这个模式在创建新的容器的时候指定容器的网络和一个已经存在的容器共享一个Network Namespace,但是并不为docker容器进行任何网络配置,这个docker容器没有网卡、IP、路由等信息,需要手动的去为docker容器添加网卡、配置IP等。
user-defined 用户自定义模式主要可选的有三种网络驱动:bridge、overlay、macvlan。
- bridge驱动用于创建类似于前面提到的bridge网络;
- overlay和macvlan驱动用于创建跨主机的网络。

Docker基础命令

查看Docker信息

1
2
3
4
5
# 查看版本
$ docker version

# 显示系统信息
$ docker info

容器网络

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
# 列出容器网络
$ docker network ls

# 创建网络
$ docker network create <network name>

# 删除网络
$ docker network rm <network name>

# 删除所有未使用的网络
$ docker network prune

# 将容器连接到网络
$ docker network connect <netowrk name> <container name>

# 断开容器的网络
$ docker network disconnect <netowrk name> <container name>

# 配置 none 网络
$ docker run -it --network=none busybox

# 配置 host 网络
$ docker run -it --network=host

# 配置 bridge 网络
$ docker run -it busybox

# 配置 container 网络
$ docker run -d -it --name=web1 httpd
$ docker run -it --network=container:web1 busybox

# 配置 user-defined 网络
## 创建自定义网络(Docker提供三种user-defined网络驱动:bridge,overlay和macvlan。overlay和macvlan用于创建跨主机的网络)
$ docker network create -d bridge --subnet 172.10.0.0/24 --gateway 172.10.0.1 my_net

## 查看 my_net 网络的信息
$ docker network inspect my_net

## 使用自定义网络
$ docker run -it --network my_net --ip 172.10.0.3 busybox

# 为 httpd 容器配置 my_net 网络
$ docker network connect my_net httpd

# 配置 DNS Server
## docker DNS有个限制,只能在user-defined网络中使用。
$ docker run -it --network=my_net --name=bbox1 busybox
$ docker run -it --network=my_net --name=bbox2 busybox

镜像操作

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
# 检索镜像
$ docker search 镜像名

# 下载镜像
$ docker pull 镜像名

# 列出镜像列表
$ docker images

# 显示镜像历史
$ docker history 镜像名称

# 导出镜像到本地
$ docker save -o 要保存的文件名 要导出的镜像
$ docker -o mycentos-mongodb3.tar mycentos-mongodb2

# 从本地导入镜像
$ docker load --input 镜像文件
$ docker load < 镜像文件

# 删除未使用的镜像
## --all, -a:显示所有映像(默认隐藏中间映像)。默认值:false。
## --force, -f:不要提示确认。默认值:false。
$ docker images purne

# 删除所有为<none>的镜像
$ docker rmi $(docker images -q -f dangling=true)

# 删除所有镜像
$ docker rmi -f $(docker images -q)

# 强制删除所有镜像
$ docker rmi $(docker images -q)

# 清理虚悬镜像
$ docker images -q -f dangling=true)

# 格式化输出列
$ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Size}}\t{{.Tag}}"

# 显示库和版本号
$ docker images --format "table {{.Repository}}:{{.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
41
42
43
44
45
46
47
48
49
50
51
52
53
# 从主机拷贝文件到容器
$ docker cp 主机文件的绝对路径 容器id:容器中文件的绝对路径

# 从容器拷贝文件到主机
$ docker cp 容器id:容器中文件的绝对路径 主机文件的绝对

# 从镜像运行容器(交互模式运行)
$ docker run -i -t <镜像名称:tag> /bin/bash #/bin/
$ docker run -d -p port:port <镜像名称:tag>

# 启动已经存在的容器
$ docker start 容器名称

# 停止运行中的容器
$ docker stop 容器名称
# 列出最近一次运行的容器
$ docker ps -l

# 列出所有运行中的容器
$ docker ps

# 列出所有容器
$ docker ps -a

# 删除容器
$ docker rm 容器名称

# 挂载本地磁盘
$ docker run -v 本地磁盘路径:容器中的文件路径

# 设定端口转发
$ docker run -p 转发后的端口:转发前的端口

# 对容器的修改保存为新镜像
$ docker commit 容器名称 新镜像的名称

# 查看容器日志
$ docker log 容器名称

# 连接到已经运行的容器
$ docker attach 容器名称

# 停止所有容器
$ docker stop $(docker ps -a -q)

# 删除所有容器
$ docker rm $(docker ps -a -q)

# 清理所有处于终止状态的容器
$ docker container prune

# 查看日志
$ docker logs 容器ID

仓库操作

1
2
3
4
5
6
7
8
9
10
# 登录Docker Hub
$ docker login -u "username" -p "password" url
$ docker login --username "username" --password="password" url
## --username, -u:用户名
## --password, -p:密码
## --password-stdin:从标准输入中读取密码


# 发布镜像
$ docker push 镜像名称

制作镜像

1
2
3
4
5
6
# 语法
$ docker build -t imagename Dockerfilepath

# 打包镜像示例
$ docker build -t image1 .
$ docker build -f ./Dockerfile -t image1 .

Docker Hub

1
2
3
4
5
6
7
8
9
10
# 登陆
$ docker login --username=YourUsername --email=YourEmail

# 上传镜像
$ docker images
$ docker tag ImageID dockerhubz账号/imagename:[label]
$ docker push dockerhubz账号/imagename:[label]

# 拉取镜像
$ docker pull dockerhubz账号/imagename:[label]

Dockerfile指令

指令 说明
MAINTAINER 为生成的镜像署名作者。
FROM 决定以哪一个镜像作为基准。格式:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
RUN 在镜像的构建过程中执行特定的命令,并生成一个中间镜像。通常用于安装应用和软件包。格式:
#shell格式
RUN <command>
#exec格式
RUN ["executable", "param1", "param2"]
RUN 在构建的时候执行,并生成一个新的镜像
COPY 复制文件。格式:
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
ADD 先复制、再解压。格式:
ADD <源路径>... <目标路径>
ADD ["<源路径>",... "<目标路径>"]
建议:只在复制tar文件时使用。
ENV 设置环境变量。格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
EXPOSE 为构建的镜像设置监听端口,使容器在运行时监听。
目的:用于暴露端口。格式:
EXPOSE <port> [<port>...]
VOLUME 用于创建挂载点。格式:
VOLUME ["/data"]
WORKDIR 指定工作目录。
通过WORKDIR设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。格式:
WORKDIR /path
可以使用多次。
USER 指定运行镜像所使用的用户。可以使用用户名、UID 或 GID,或是两者的组合。格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
CMD 指定在容器启动时所要执行的命令。格式:
#Exec 格式(推荐)
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
# Shell 格式
CMD command param1 param2

- 只允许使用一次,如果有多个,只有最后一个生效。
- CMD 在容器运行的时候执行,在构建时不进行任何操作。
ENTRYPOINT 让容器以应用程序或者服务的形式运行。格式:
# Exec 格式(推荐)
ENTRYPOINT ["executable", "param1", "param2"]
#Shell 格式
ENTRYPOINT command param1 param2

- 只允许使用一次,如果有多个,只有最后一个生效。
- ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。
LABEL 用于为镜像添加元数据。格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
ARG 指定传递给构建运行时的变量。
构建参数和 ENV 的效果一样,都是设置环境变量。
所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。
但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。格式:
ARG <name>[=<default value>]
ONBUILD 用于设置镜像触发器。当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发。格式:
ONBUILD [INSTRUCTION]
STOPSIGNAL 用于设置停止容器所要发送的系统调用信号。格式:
STOPSIGNAL signal
所使用的信号必须是内核系统调用表中的合法的值,如:SIGKILL。
SHELL 用于设置执行命令(shell式)所使用的的默认 shell 类型。格式:
SHELL ["executable", "parameters"]
HEALTHCHECK 健康检查。格式:
# 通过运行容器内的一个指令来检查容器的健康情况
HEALTHCHECK [OPTIONS] CMD command
# 禁用任何(包括基层至父镜像)健康检查指令
HEALTHCHECK NONE

OPTIONS选项可选值:
--interval=DURATION 间隔时间, 默认 30s (30秒)
--timeout=DURATION 超时时间, 默认 30s (30秒)
--start-period=DURATION 启动时间, 默认 0s, 如果指定这个参数, 则必须大于 0s
--retries=N 重试次数, 默认 3

Dockerfile 示例

示例1:java 打包

1
2
3
4
5
6
7
FROM openjdk:8-jre
MAINTAINER wanglibing <iamwanglibing@qq.com>
ENV APP_VERSION 1.0
RUN mkdir /app
COPY springcloudgateway-$APP_VERSION.jar /app/
CMD java -jar /app/springcloudgateway-$APP_VERSION.jar --spring.profile.active=prod
EXPOSE 10000

安装Docker Compose

先决条件

安装python-pip(CentOS)

1
2
3
4
# 安装python-pip 
$ yum -y install epel-release
$ yum -y install python-pip
$ pip -V

使用pip安装Docker Compose

1
2
3
4
5
# 使用pip安装docker compose
$ pip install docker-compose

# 验证Docker Compose安装
$ docker-compose version

Linux安装

1
2
3
4
5
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose version

$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Docker Compose基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 参数
# -f <配置文件路径>
# -d 守护模式运行

# 启动
$ docker-compose up

# 守护模式启动
$ docker-compose up -d

# 编译启动
$ docker-compose up --build

# 停止
$ docker-compose down

配置 docker-compose

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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# 配置 build

## 示例1
version: '3'
services:

webapp:
# 指定Dockerfile所在文件夹的路径
build: ./dir

## 示例2
version: '3'
services:

webapp:
build:
# 指定Dockerfile所在文件夹的路径
context: ./dir
# 指定 Dockerfile 文件名
dockerfile: Dockerfile-alternate
args:
buildno: 1

## 示例3
build:
context: .
# 指定构建镜像的缓存
cache_from:
- alpine:latest
- corp/web_app:3.14

# 指定容器的内核能力(capacity)分配

## 容器拥有所有能力
cap_add:
- ALL

## 去掉 NET_ADMIN 能力
cap_drop:
- NET_ADMIN

# 覆盖容器启动后默认执行的命令
command: echo "hello world"

# configs
## 仅用于 Swarm mode


# 指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: cgroups_1

# 指定容器名称
## 默认将会使用 项目名称_服务名称_序号 这样的格式
## 注意: 指定容器名称后,该服务将无法进行扩展(scale),
## 因为 Docker 不允许多个容器具有相同的名称
container_name: docker-web-container

# deploy
## 仅用于 Swarm mode。

# 指定设备映射关系
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"

# 解决容器的依赖、启动先后的问题
## 以下例子中会先启动 redis db 再启动 web。
## 注意:web 服务不会等待 redis db 「完全启动」之后才启动。
version: '3'

services:
web:
build: .
depends_on:
- db
- redis

redis:
image: redis

db:
image: postgres

# 自定义 DNS 服务器
## 可以是一个值,也可以是一个列表。
dns: 8.8.8.8

dns:
- 8.8.8.8
- 114.114.114.114


# 配置 DNS 搜索域
## 可以是一个值,也可以是一个列表。
dns_search: example.com

dns_search:
- domain1.example.com
- domain2.example.com

# 挂载一个 tmpfs 文件系统到容器。
tmpfs: /run
tmpfs:
- /run
- /tmp


# 从文件中获取环境变量,可以为单独的文件路径或列表。
## 如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,
## 则 env_file 中变量的路径会基于模板文件路径。
## 如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file: .env

env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

## 环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# common.env: Set development environment
PROG_ENV=development

# 设置环境变量。
## 你可以使用数组或字典两种格式。
## 只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
RACK_ENV: development
SESSION_SECRET:

environment:
- RACK_ENV=development
- SESSION_SECRET

## 如果变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,
## 避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,
## 包括:y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|
## on|On|ON|off|Off|OFF

# 暴露端口,但不映射到宿主机,只被连接的服务访问
## 仅可以指定内部端口为参数。
expose:
- "3000"
- "8000"

# 使用已经存在的网络
networks:
default:
external:
name: log_network

# external_links
## 链接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的外部容器。
## 不建议使用该指令。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

# extra_hosts
## 类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"

## 会在启动后的服务容器中 /etc/hosts 文件中添加如下两条条目。
8.8.8.8 googledns
52.1.157.61 dockerhub


# 通过命令检查容器是否健康运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3

# 指定为镜像名称或镜像 ID
## 如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

# 为容器添加 Docker 元数据(metadata)信息
## 例如可以为容器添加辅助说明信息
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"


# links
## 不推荐使用该指令。

# 配置日志选项
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"

## 目前支持三种日志驱动类型
driver: "json-file"
driver: "syslog"
driver: "none"

## options 配置日志驱动的相关参数。
options:
max-size: "200k"
max-file: "10"


# 设置网络模式
## 使用和 docker run 的 --network 参数一样的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"


# 配置容器连接的网络
version: "3"
services:

some-service:
networks:
- some-network
- other-network

networks:
some-network:
other-network:


# 跟主机系统共享进程命名空间。
## 打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
pid: "host"

# 暴露端口信息。
## 使用宿主端口:容器端口 (HOST:CONTAINER) 格式,
## 或者仅仅指定容器的端口(宿主将会随机选择端口)都可以
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
## 注意:当使用 HOST:CONTAINER 格式来映射端口时,
## 如果你使用的容器端口小于 60 并且没放到引号里,
## 可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。
## 为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

# 存储敏感数据,例如 mysql 服务密码。
version: "3.1"
services:

mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret

secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true

# 指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)
## 例如配置标签的用户名和角色名。
security_opt:
- label:user:USER
- label:role:ROLE

# 设置另一个信号来停止容器。
## 在默认情况下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1

# 配置容器内核参数。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0

sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0

# 指定容器的 ulimits 限制值
## 例如,指定最大进程数为 65535,指定文件句柄数为 20000
## (软限制,应用可以随时修改,不能超过硬限制)
## 和 40000(系统硬限制,只能 root 用户提高)
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000

# 数据卷所挂载路径设置。
## 可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)
## 该指令中路径支持相对路径。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro

# 指定容器中运行应用的用户名
entrypoint: /code/entrypoint.sh

# 指定容器中运行应用的用户名
user: nginx

# 指定容器中工作目录
working_dir: /code

# 指定容器中搜索域名、主机名、mac 地址等
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A

# 允许容器中运行一些特权命令
privileged: true

# 指定容器退出后的重启策略为始终重启
## 该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
restart: always

# 以只读模式挂载容器的 root 文件系统,意味着不能对容器内容进行修改。
read_only: true

# 打开标准输入,可以接受外部输入
stdin_open: true

# 模拟一个伪终端
tty: true

# 读取变量
## Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env 文件中的变量。
## 例如,下面的 Compose 文件将从运行它的环境中读取变量 ${MONGO_VERSION} 的值,
## 并写入执行的指令中。
version: "3"
services:

db:
image: "mongo:${MONGO_VERSION}"

## 如果执行 MONGO_VERSION=3.2 docker-compose up 则会启动一个 mongo:3.2 镜像的容器;
## 如果执行 MONGO_VERSION=2.8 docker-compose up 则会启动一个 mongo:2.8 镜像的容器。
## 若当前目录存在 .env 文件,执行 docker-compose 命令时将从该文件中读取变量。
## 在当前目录新建 .env 文件并写入以下内容。
# 支持 # 号注释
MONGO_VERSION=3.6
## 执行 docker-compose up 则会启动一个 mongo:3.6 镜像的容器。

docker-compose.yml 示例

示例1

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.1'
services:
springcloudgateway:
restart: always
image: springcloudgateway
container_name: springcloudgateway
ports:
- 10000:10000
networks:
default:
external:
name: log_network

MacOS下设置Docker代理

配置ShadowsocksX-NG

HTTP代理监听地址:0.0.0.0 或本机ip HTTP代理监听端口:1087 勾选 开启HTTP代理服务器

配置Docker

Web Server(HTTP): http://192.168.100.4:1087 Secure Web Server(HTTPS): http://192.168.100.4:1087 PS:代理地址必须是物理地址,不能是127.0.0.1。

CentOS7中Docker镜像加速

  • Docker官方提供的中国镜像库:https://registry.docker-cn.com
  • 七牛云加速器:https://reg-mirror.qiniu.com

申请阿里云开发者账号

登陆

使用刚刚申请的开发者账号登陆。

获取专属镜像加速器

【点击】管理中心或创建我的容器镜像 【点击】Docker Hub 镜像站点 得到自己专属的镜像加速地址,形如:“https://whxxxxxx.mirror.aliyuncs.com”。

配置Docker镜像加速

1
$ vi /lib/systemd/system/docker.service

找到ExecStart=/usr/bin/dockerd 修改为

1
2
3
4
5
ExecStart=/usr/bin/dockerd --registry-mirror=https://whxxxxxx.mirror.aliyuncs.com
# Docker官方
ExecStart=/usr/bin/dockerd --registry-mirror=https://registry.docker-cn.com
# 七牛云(推荐)
ExecStart=/usr/bin/dockerd --registry-mirror=https://reg-mirror.qiniu.com

重启Docker

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

检查

1
$ ps -ef | grep docker

观察镜像加速是否生效。如果生效,可以在命令中看到镜像加速器的地址

1
2
3
4
$ ps -ef | grep docker
root 1188 1 0 19:39 ? 00:00:00 /usr/bin/dockerd --registry-mirror=https://whxxxxxx.mirror.aliyuncs.com
root 1192 1188 0 19:39 ? 00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
root 1317 1131 0 20:03 pts/0 00:00:00 grep --color=auto docker

常见问题

Docker 容器 与虚拟机对比

对比项 Docker 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 MB GB
性能 接近原生
并发数量 单机上千 几十个

常见错误

image is referenced in multiple repositories

问题描述

删除镜像时报错:

1
2
3
$ docker rmi $(docker images -q)
Error response from daemon: conflict: unable to delete 7257caf71e74 (must be forced) - image is referenced in multiple repositories
Error response from daemon: conflict: unable to delete 7257caf71e74 (must be forced) - image is referenced in multiple repositories

解决办法

1
2
$ docker rmi $(docker images --format "table {{.Repository}}:{{.Tag}}")
$ docker rmi $(docker images -aq)

Your kernel does not support cgroup swap limit

问题描述

在run一个docker时,报如下警告信息:

1
2
3
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
To prevent these messages, enable memory and swap accounting on your system. To enable these on system using GNU GRUB (GNU GRand Unified Bootloader), do the following.

解决办法

修改/etc/default/grub

1
$ sudo vi /etc/default/grub

设置GRUB_CMDLINE_LINUX,如下:

1
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

更新grub

1
2
$ sudo update-grub
$ reboot

Setup script exited with error: command 'gcc' failed with exit status 1异常

这是没有正确安装Python开发环境导致,解决如下:

1
2
3
4
$ yum install python-devel -y
$ yum install libevent-devel -y
$ pip install gevent -y
$ yum install groupinstall 'development tools'

推荐

坚持原创技术分享,您的支持将鼓励我继续创作!
0%