基础环境搭建

  1. 先安装如下contain前置依赖

    1. wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
    2. yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
  2. 然后遵从教程即可https://www.runoob.com/docker/centos-docker-install.html

Helloworld

  • Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
  1. runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
  2. Hello world

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。

运行交互式的容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现“对话”的能力:
runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

注意第二行 root@0123ce188bd8:/#,此时我们已进入一个 ubuntu15.10 系统的容器
我们尝试在容器中运行命令 cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表
root@0123ce188bd8:/# cat /proc/version
Linux version 4.4.0-151-generic (buildd@lgw01-amd64-043) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #178-Ubuntu SMP Tue Jun 11 08:30:22 UTC 2019
root@0123ce188bd8:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@0123ce188bd8:/#
我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
root@0123ce188bd8:/# exit
exit
root@runoob:~#
注意第三行中 root@runoob:~# 表明我们已经退出了当期的容器,返回到当前的主机中。


启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

  1. runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

容器使用

获取镜像

如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
$ docker pull ubuntu

启动容器

以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
$ docker run -it ubuntu /bin/bash

后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
$ docker run -itd —name ubuntu-test ubuntu /bin/bash

导出和导入容器

导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
$ docker export 1e560fca3906 > ubuntu.tarexport 1e560fca3906 > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。
【20200329】CentOS   Docker环境安装 - 图1
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1/ubuntu.tar | docker import - test/ubuntu:v1
【20200329】CentOS   Docker环境安装 - 图2
此外,也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

删除容器使用 docker rm 命令:
$ docker rm -f 1e560fca3906

查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器:
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND … PORTS
d3d5e39ed9d3 training/webapp “python app.py” … 0.0.0.0:32769->5000/tcp
这里多了端口信息。
PORTS
0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用
【20200329】CentOS   Docker环境安装 - 图3
我们也可以通过 -p 参数来设置不一样的端口:
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
:~$ docker run -d -p 5000:5000 training/webapp python app.py
docker ps查看正在运行的容器

  1. runoob@runoob:~# docker ps:~# docker ps
  2. CONTAINER ID IMAGE PORTS NAMES
  3. bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
  4. d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov

容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

列出镜像列表

我们可以使用 docker images 来列出本地主机上的镜像。
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
training/webapp latest 6fae60ef3446 11 months ago 348.8 MB
各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@d77ccb2e5cca:/#
参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:14.04 /bin/bash
root@39e968165990:/#
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。


获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
Crunoob@runoob:~$ docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
6599cadaf950: Pull complete
23eda618d451: Pull complete
f0be3084efe9: Pull complete
52de432f084b: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3
Status: Downloaded newer image for ubuntu:13.10
下载完成后,我们可以直接使用这个镜像来运行容器。


查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
runoob@runoob:~$ docker search httpd
点击图片查看大图:
【20200329】CentOS   Docker环境安装 - 图4
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。


拖取镜像

我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
runoob@runoob:~$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8b87079b7a06: Pulling fs layer
a3ed95caeb02: Download complete
0d62ec9c6a76: Download complete
a329d50397b9: Download complete
ea7c1f032b5c: Waiting
be44112b72c7: Waiting
下载完成后,我们就可以使用这个镜像了。
runoob@runoob:~$ docker run httpd


删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
$ docker rmi hello-world
【20200329】CentOS   Docker环境安装 - 图5


创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像
  • 2、使用 Dockerfile 指令来创建一个新的镜像

    更新镜像

    更新镜像之前,我们需要使用镜像来创建一个容器。
    runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
    root@e218edb10161:/#
    在运行的容器内使用 apt-get update 命令进行更新。
    在完成操作之后,输入 exit 命令来退出这个容器。
    此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
    runoob@runoob:~$ docker commit -m=”has update” -a=”runoob” e218edb10161 runoob/ubuntu:v2
    sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
    各个参数说明:

  • -m: 提交的描述信息

  • -a: 指定镜像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2: 指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v2 70bf1840fd7c 15 seconds ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB
使用我们的新镜像 runoob/ubuntu 来启动一个容器
runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash
root@1a9fbdeb5da3:/#

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher “fisher@sudops.com”

RUN /bin/echo ‘root:123456’ |chpasswd
RUN useradd runoob
RUN /bin/echo ‘runoob:123456’ |chpasswd
RUN /bin/echo -e “LANG=\”en_US.UTF-8\”” >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
—-> d95b5ca17cc3
Step 2 : MAINTAINER Fisher “fisher@sudops.com”
—-> Using cache
—-> 0c92299c6f03
Step 3 : RUN /bin/echo ‘root:123456’ |chpasswd
—-> Using cache
—-> 0397ce2fbd0a
Step 4 : RUN useradd runoob
……
参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 860c279d2fec About a minute ago 190.6 MB
runoob/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
php 5.6 f40e9e0f10c8 10 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB
我们可以使用新的镜像来创建容器
runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash
[root@41c28d18b5fb /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)
从上面看到新镜像已经包含我们创建的用户 runoob。

设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。
runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 860c279d2fec 5 hours ago 190.6 MB
runoob/centos dev 860c279d2fec 5 hours ago 190.6 MB
runoob/ubuntu v2 70bf1840fd7c 22 hours ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
php 5.6 f40e9e0f10c8 10 days ago 444.8 MB
nginx latest 6f8d099c3adc 13 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB

Docker容器连接

前面我们实现了通过网络端口来访问运行在docker容器内的服务。
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P-p参数来指定端口映射。
下面我们来实现通过端口连接到一个docker容器。

网络端口映射

我们创建了一个python应用的容器。
runoob @ runoob:〜$ docker run -d -P training / webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d
另外,我们可以指定容器绑定的网络地址,某些绑定127.0.0.1。
我们使用-P参数创建一个容器,使用docker ps可以看到容器端口5000绑定主机端口32768。
runoob @ runoob:〜$ docker ps
容器ID图像命令…端口名称
fce072cc88ce training / webapp“ python app.py” … 0.0.0.0:32768->5000/tcp grave_hopper
我们也可以使用-p标识来指定容器端口绑定到主机端口。
两种方式的区别是:

  • -P:是容器内部端口随机映射到主机的高端口。
  • -p:是容器内部端口绑定到指定的主机端口。

runoob @ runoob:〜$ docker run -d -p 5000:5000 training / webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
runoob @ runoob:〜$ docker ps
容器ID图像命令…端口名称
33e4523d30aa training / webapp“ python app.py” … 0.0.0.0:5000->5000/tcp berserk_bartik
fce072cc88ce training / webapp“ python app.py” … 0.0.0.0:32768->5000/tcp grave_hopper
另外,我们可以指定容器绑定的网络地址,某些绑定127.0.0.1。
runoob @ runoob:〜$ docker run -d -p 127.0.0.1:5001:5000 training / webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
runoob @ runoob:〜$ docker ps
容器ID图像命令…端口名称
95c6ceef88ca training / webapp“ python app.py” … 5000 / tcp,127.0.0.1:5001->5000/tcp adoring_stonebraker
33e4523d30aa training / webapp“ python app.py” … 0.0.0.0:5000->5000/tcp berserk_bartik
fce072cc88ce training / webapp“ python app.py” … 0.0.0.0:32768->5000/tcp grave_hopper/ webapp “ python app.py” … 0.0 。0.0 :32768 - > 5000 / TCP grave_hopper
这样我们就可以通过访问127.0.0.1:5001来访问容器的5000英尺。
上面的示例中,至少都是绑定tcp范围,如果要绑定UDP扩展,可以在端口后面加上/ udp
runoob @ runoob:〜$ docker run -d -p 127.0.0.1:5000:5000/udp training / webapp python app.py:〜$搬运工运行- d - p 127.0 。0.1 :5000 :5000 / udp培训/ webapp python应用程序。py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
runoob @ runoob:〜$ docker ps:〜$ docker ps
容器ID图像命令…端口名称… 端口名称
6779686f06f6培训/ Web应用程序“ python app.py” … 5000 / tcp,127.0.0.1:5000->5000/udp drunk_visvesvaraya6779686f06f6 培训/ webapp “ python app.py” … 5000 / tcp ,127.0 。0.1 :5000 - > 5000 / UDP drunk_visvesvaraya
95c6ceef88ca training / webapp“ python app.py” … 5000 / tcp,127.0.0.1:5001->5000/tcp adoring_stonebraker95c6ceef88ca 培训/ webapp “ python app.py” … 5000 / tcp ,127.0 。0.1 :5001 - > 5000 / TCP adoring_stonebraker
33e4523d30aa training / webapp“ python app.py” … 0.0.0.0:5000->5000/tcp berserk_bartik33e4523d30aa training / webapp “ python app.py” … 0.0 。0.0 :5000 - > 5000 / TCP berserk_bartik
fce072cc88ce training / webapp“ python app.py” … 0.0.0.0:32768->5000/tcp grave_hopper/ webapp “ python app.py” … 0.0 。0.0 :32768 - > 5000 / TCP grave_hopper
docker port命令可以让我们快捷地查看端口的绑定情况。
runoob @ runoob:〜$ docker端口adoring_stonebraker 5000:〜$ docker port adoring_stonebraker 5000
127.0.0.1:5001127.0 。0.1 :5001


Docker容器互联

进入映射并非唯一把docker连接到另一个容器的方法。
docker有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。


容器命名

当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用—name标识来命名容器,例如:
runoob @ runoob:〜$ docker run -d -P —name runoob training / webapp python app.py:〜$搬运工运行- d - P - 名runoob培训/ webapp的Python应用程序。py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a44143780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
我们可以使用docker ps命令来查看容器名称。
runoob @ runoob:〜$ docker ps -l:〜$ docker ps - l
容器ID图像命令…端口名称
43780a6eabaa培训/网络应用程序“ python app.py” … 0.0.0.0:32769->5000/tcp runoob

新建网络

下面先创建一个新的Docker网络。
$ docker network create -d网桥测试网
【20200329】CentOS   Docker环境安装 - 图6
参数说明:
-d:参数指定Docker网络类型,有网桥,覆盖。
其中overlay网络类型用于Swarm模式,在本小节中你可以忽略它。

连接容器

运行一个容器并连接到新建的test-net网络:
$ docker run -itd —name test1 —network test-net ubuntu / bin / bash
:新的终端,再运行一个容器并加入到test-net网络:
$ docker run -itd —name test2 —network test-net ubuntu / bin / bash
点击图片查看大图:
【20200329】CentOS   Docker环境安装 - 图7
下面通过ping来证明test1容器和test2容器建立了互联关系。
如果test1,test2容器内中无ping命令,则在容器内部执行以下命令安装ping(即学即用:可以在一个容器里安装好,提交容器到容器,在以新的重新运行以上俩个容器)。
apt-get更新
apt安装iputils-ping
在test1容器输入以下命令:
点击图片查看大图:
【20200329】CentOS   Docker环境安装 - 图8
同理在test2容器也会成功连接到:
点击图片查看大图:
【20200329】CentOS   Docker环境安装 - 图9
这样,test1容器和test2容器建立了互联关系。
如果你有多个容器之间需要互相连接,推荐使用Docker Compose,后面会介绍。


配置DNS

我们可以在宿主机的/etc/docker/daemon.json文件中增加以下内容来设置全部容器的DNS:
{
“ dns”:[“ dns” :[
“ 114.114.114.114”,“ 114.114.114.114” ,
“ 8.8.8.8”“ 8.8.8.8”
]]
}}
设置后,启动容器的DNS会自动配置为114.114.114.114和8.8.8.8。
配置完,需要重启docker才能发挥作用。
查看容器的DNS是否有效可以使用以下命令,它会输出容器的DNS信息:
$ docker run -it —rm ubuntu cat etc / resolv.conf- 它- RM Ubuntu的猫等/ RESOLV 。conf
点击图片查看大图:
【20200329】CentOS   Docker环境安装 - 图10
手动指定容器的配置
如果只想在指定的容器设置DNS,则可以使用以下命令:
$ docker run -it —rm host_ubuntu —dns = 114.114.114.114 —dns-search = test.com ubuntu
- 它- RM host_ubuntu - DNS = 114.114 。114.114 - DNS - 搜索= 测试。com ubuntu
参数说明:
-h HOSTNAME或—hostname = HOSTNAME:设置容器的主机名,它会被写到容器内部的/ etc / hostname和/ etc / hosts。
—dns = IP_ADDRESS:添加DNS服务器到容器的/etc/resolv.conf中,让容器使用该服务器来解析所有不在/ etc / hosts中的主机名。
—dns-search = DOMAIN:设置容器的搜索域,当设置搜索域为.example.com时,在搜索一个名为host的主机时,DNS不再搜索host,将会搜索host.example.com 。
点击图片查看大图:
【20200329】CentOS   Docker环境安装 - 图11
如果在容器启动时没有指定—dns—dns-search,则Docker会安装在主机的上/etc/resolv.conf来配置容器的DNS。

Docker 仓库管理

仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。

Docker Hub

目前 Docker 官方维护了一个公共仓库 Docker Hub
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

注册

https://hub.docker.com 免费注册一个 Docker 账号。

登录和退出

登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
$ docker login
【20200329】CentOS   Docker环境安装 - 图12
退出
退出 docker hub 可以使用以下命令:
$ docker logout
拉取镜像
你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。
以 ubuntu 为关键词进行搜索:
$ docker search ubuntu
【20200329】CentOS   Docker环境安装 - 图13
使用 docker pull 将官方 ubuntu 镜像下载到本地:
$ docker pull ubuntu
【20200329】CentOS   Docker环境安装 - 图14

推送镜像

用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。
$ docker tag ubuntu:18.04 username/ubuntu:18.04
$ docker image ls

REPOSITORY TAG IMAGE ID CREATED …
ubuntu 18.04 275d79972a86 6 days ago …
username/ubuntu 18.04 275d79972a86 6 days ago …
$ docker push username/ubuntu:18.04
$ docker search username/ubuntu

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu

Docker Dockerfile

什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用 Dockerfile 定制镜像

这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。
1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
FROM nginx
RUN echo ‘这是一个本地构建的nginx镜像’ > /usr/share/nginx/html/index.html
【20200329】CentOS   Docker环境安装 - 图15
2、FROM 和 RUN 指令的作用
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN [“可执行文件”, “参数1”, “参数2”]
# 例如:
# RUN [“./test.php”, “dev”, “offline”] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz“ \
&& tar -xvf redis.tar.gz
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 nginx:test(镜像名称:镜像标签)。
:最后的 . 代表本次执行的上下文路径,下一节会介绍。
$ docker build -t nginx:test .
【20200329】CentOS   Docker环境安装 - 图16
以上显示,说明已经构建成功。

上下文路径

上一节中,有提到指令最后一个 . 是上下文路径,那么什么是上下文路径呢?
$ docker build -t nginx:test .
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。


指令详解

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [—chown=:] <源路径1>… <目标路径>
COPY [—chown=:] [“<源路径1>”,… “<目标路径>”]
[—chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom /mydir/
COPY hom?.txt /mydir/
*<目标路径>
:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

    CMD

    类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。

  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD
CMD [“<可执行文件或命令>”,”“,”“,…]
CMD [““,”“,…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 —entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT [““,”“,”“,…]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx

ENTRYPOINT [“nginx”, “-c”] # 定参
CMD [“/etc/nginx/nginx.conf”] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV
ENV = =
以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0

RUN curl -SLO “https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz“ \
&& curl -SLO “https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc

ARG

构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 —build-arg <参数名>=<值> 来覆盖。
格式:
ARG <参数名>[=<默认值>]

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:
VOLUME [“<路径1>”, “<路径2>”…]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

仅仅只是声明端口。
作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:
EXPOSE <端口1> [<端口2>…]

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:
USER <用户名>[:<用户组>]

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:
ONBUILD <其它指令>

Docker Compose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程
Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

docker-compose.yml 的配置案例如下(配置参数参考下文):

实例

yaml 配置实例version: ‘3’services: web: build: . ports: - “5000:5000” volumes: - .:/code
- logvolume01:/var/log links: - redis redis: image: redisvolumes: logvolume01: {}


Compose 安装

Linux
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases
运行以下命令以下载 Docker Compose 的当前稳定版本:
$ 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
要安装其他版本的 Compose,请替换 1.24.1。
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose —version
cker-compose version 1.24.1, build 4667896b
注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。

macOS

Mac 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Mac 用户不需要单独安装 Compose。Docker 安装说明可以参阅 MacOS Docker 安装

windows PC

Windows 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。Docker 安装说明可以参阅 Windows Docker 安装


使用

1、准备

创建一个测试目录:
$ mkdir composetest
$ cd composetest
在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:

composetest/app.py 文件代码

import time

import redis
from flask import Flask

app = Flask(name)
cache = redis.Redis(host=’redis’, port=6379)

def get_hit_count():
retries = 5
while True:
try:
return cache.incr(‘hits’)
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)

@app.route(‘/‘)
def hello():
count = get_hit_count()
return ‘Hello World! I have been seen {} times.\n‘.format(count)
在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。
在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:
flask
redis

2、创建 Dockerfile 文件

在 composetest 目录中,创建一个名为的文件 Dockerfile,内容如下:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add —no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD [“flask”, “run”]
Dockerfile 内容解释:

  • FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。
  • WORKDIR /code: 将工作目录设置为 /code。

ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0

  • 设置 flask 命令使用的环境变量。
  • RUN apk add —no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

  • 复制 requirements.txt 并安装 Python 依赖项。
  • COPY . .: 将 . 项目中的当前目录复制到 . 镜像中的工作目录。
  • CMD [“flask”, “run”]: 容器提供默认的执行命令为:flask run。

    3、创建 docker-compose.yml

    在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:

    docker-compose.yml 配置文件

    yaml 配置version: ‘3’services: web: build: . ports: - “5000:5000” redis: image: “redis:alpine”
    该 Compose 文件定义了两个服务:web 和 redis。

  • web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。

  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。

    4、使用 Compose 命令构建和运行您的应用

    在测试目录中,执行以下命令来启动应用程序:
    docker-compose up
    如果你想在后台执行该服务可以加上 -d 参数:
    docker-compose up -d

yml 配置指令参考

version

指定本 yml 依从的 compose 哪个版本制定的。

build

指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: “3.7”
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: “3.7”
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- “com.example.description=Accounting webapp”
- “com.example.department=Finance”
- “com.example.label-with-empty-value”
target: prod

  • context:上下文路径。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。

    cap_add,cap_drop

    添加或删除容器拥有的宿主机的内核功能。
    cap_add:
    - ALL # 开启全部权限

cap_drop:
- SYS_PTRACE # 关闭 ptrace权限

cgroup_parent

为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd

command

覆盖容器启动的默认命令。
command: [“bundle”, “exec”, “thin”, “-p”, “3000”]

container_name

指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container

depends_on

设置依赖关系。

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。

version: “3.7”
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。

deploy

指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
version: “3.7”
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: “This redis service label”
resources:
limits:
cpus: ‘0.50’
memory: 50M
reservations:
cpus: ‘0.25’
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
可以选参数:
endpoint_mode:访问集群服务的方式。
endpoint_mode: vip
# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
mode:指定服务提供的模式。

  • replicated:复制服务,复制指定服务到集群的机器上。
  • global:全局服务,服务将部署至集群的每个节点。
  • 图解:下图中黄色的方块是 replicated 模式的运行情况,灰色方块是 global 模式的运行情况。
    【20200329】CentOS   Docker环境安装 - 图17

replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
restart_policy:配置如何在退出容器时重新启动容器。

  • condition:可选 none,on-failure 或者 any(默认值:any)。
  • delay:设置多久之后重启(默认值:0)。
  • max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
  • window:设置容器重启超时时间(默认值:0)。

rollback_config:配置在更新失败的情况下应如何回滚服务。

  • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
  • delay:每个容器组回滚之间等待的时间(默认为0s)。
  • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。

update_config:配置应如何更新服务,对于配置滚动更新很有用。

  • parallelism:一次更新的容器数。
  • delay:在更新一组容器之间等待的时间。
  • failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在更新过程中可以容忍的故障率。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。

:仅支持 V3.4 及更高版本。

devices

指定设备映射列表。
devices:
- “/dev/ttyUSB0:/dev/ttyUSB0”

dns

自定义 DNS 服务器,可以是单个值或列表的多个值。
dns: 8.8.8.8

dns:
- 8.8.8.8
- 9.9.9.9

dns_search

自定义 DNS 搜索域。可以是单个值或列表。
dns_search: example.com

dns_search:
- dc1.example.com
- dc2.example.com

entrypoint

覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh
也可以是以下格式:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit

env_file

从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment:
RACK_ENV: development
SHOW: ‘true’

expose

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

extra_hosts

添加主机名映射。类似 docker client —add-host。
extra_hosts:
- “somehost:162.242.195.82”
- “otherhost:50.31.209.229”
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost
50.31.209.229 otherhost

healthcheck

用于检测 docker 服务是否健康运行。
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost“] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序

image

指定容器运行的镜像。以下格式都可以:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id

logging

服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: “json-file”
driver: “syslog”
driver: “none”
仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。
logging:
driver: json-file
options:
max-size: “200k” # 单个文件大小为200k
max-file: “10” # 最多10个文件
当达到文件限制上限,会自动删除旧得文件。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging:
driver: syslog
options:
syslog-address: “tcp://192.168.0.42:123”

network_mode

设置网络模式。
network_mode: “bridge”
network_mode: “host”
network_mode: “none”
network_mode: “service:[service name]”
network_mode: “container:[container name/id]”
networks
配置容器连接的网络,引用顶级 networks 下的条目 。
services:
some-service:
networks:
some-network:
aliases:
- alias1
other-network:
aliases:
- alias2
networks:
some-network:
# Use a custom driver
driver: custom-driver-1
other-network:
# Use a custom driver which takes special options
driver: custom-driver-2
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。

restart

  • no:是默认的重启策略,在任何情况下都不会重启容器。
  • always:容器总是重新启动。
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

restart: “no”
restart: always
restart: on-failure
restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。

secrets

存储敏感数据,例如密码:
version: “3.1”
services:

mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret

secrets:
my_secret:
file: ./my_secret.txt

security_opt

修改容器默认的 schema 标签。
security-opt:
- label:user:USER # 设置容器的用户标签
- label:role:ROLE # 设置容器的角色标签
- label:type:TYPE # 设置容器的安全策略标签
- label:level:LEVEL # 设置容器的安全等级标签

stop_grace_period

指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒
默认的等待时间是 10 秒。

stop_signal

设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
stop_signal: SIGUSR1

sysctls

设置容器中的内核参数,可以使用数组或字典格式。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0

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

tmpfs

在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run

tmpfs:
- /run
- /tmp

ulimits

覆盖容器默认的 ulimit。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000

volumes

将主机的数据卷或着文件挂载到容器里。
version: “3.7”
services:
db:
image: postgres:latest
volumes:
- “/localhost/postgres.sock:/var/run/postgres/postgres.sock”
- “/localhost/data:/var/lib/postgresql/data”