docker 是一种 虚拟化容器技术,一个开源的应用容器引擎。
基于镜像,能够秒级启动各类容器(运行一次镜像就生成一个容器,相似于 Java 中 类与对象)。
各容器间相互隔离,且每一个容器均是一个完整的运行环境。
能够很方便的让开发者打包应用以及相关依赖包到一个可移植的轻量级的容器中,并发布到 Linux 上。
参考地址:
https://www.cnblogs.com/l-y-h/p/11337051.html
https://docs.docker.com/
https://www.runoob.com/docker/docker-tutorial.htmlhtml
(1)官方文档地址:
https://docs.docker.com/mysql
(2)找到官方文档位置,根据文档一步步执行便可。
Step1:进入官网,选择 Get Docker,并选择 Docker for Linux。linux
Step2:选择 相应的 Linux 系统,此处我选择 CentOS.git
(3)安装流程
Step1:卸载旧版本。
查看当前系统是否有 docker 旧版本存在,存在则删除旧版本。github
【方式一:(先查找是否存在,再删除)】 rpm -qa | grep docker 【方式二:(直接删除,不论是不是存在,root 用户不须要输入 sudo)】 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
Step2:安装 Docker 仓库。
使用 Docker 仓库进行安装,用来简化安装、升级等操做。也可采用 RPM 方式手动安装。
所需软件包:
yum-config-manager 须要 yum-util。
device mapper 存储驱动程序 须要 device-mapper-persistent-data、 lvm2。redis
【安装所需软件包:(yum-utils、device-mapper-persistent-data、lvm2)】 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 【设置稳定的仓库(用于下载 docker):】 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Step3:安装社区版的 Docker(Docker Engine-Community)
安装最新版本的 Docker Engine-Community 和 containerd.sql
【安装最新的 Docker:】 sudo yum install docker-ce docker-ce-cli containerd.io 【查看当前版本,如有版本数据,则安装成功】 docker -v
Step4:启动 docker,并检查是否成功启动。docker
【启动、关闭 docker:(方式一)】 sudo systemctl start docker sudo systemctl stop docker 【启动、关闭 docker:(方式二)】 sudo service docker start sudo service docker stop 【检查是否启动成功:(方式一,查看本地镜像)】 sudo docker images 【检查是否启动成功:(方式二,运行 hello-world 镜像)】 sudo docker run hello-world
Step5:设置开机自启动。
每次开机都得从新输入命令用于启动 docker,很麻烦,因此通常设置开机自启动。json
【查看是否开机自启动:】 systemctl list-unit-files | grep enable 或者 systemctl list-unit-files | grep docker 【开机自启动:】 sudo systemctl enable docker
(4)配置镜像加速(此处使用 阿里云镜像)
默认下载地址比较慢(dockerhub),使用镜像加速能够提升软件下载速度。
Step1:登录 阿里云官网,而后点击 控制台。vim
Step2:进入控制台,点击列表框,选择产品服务中的 容器镜像服务。
Step3:进入 容器镜像服务后,选择镜像加速器,按照步骤操做便可。
Step4:配置镜像加速器。
【加速器地址:】 https://y5krm9wr.mirror.aliyuncs.com 【修改配置文件:】 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://y5krm9wr.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
用于从 远程镜像仓库下载镜像到本地。
【格式:】 docker pull [选项] 镜像名[:版本号] 选项: -a 拉取全部镜像 注: :版本号 能够不存在,不存在时,获取最新的镜像。 【举例:】 docker pull mysql:8.0.19
【格式:】 docker search [选项] 镜像名 选项: -s 指定数 显示 stars 不小于 指定数的镜像。 【举例:】 docker search -s 20 mysql
用于管理本地的镜像。
【格式:】 docker images [选项] [镜像名] 选项: -a 列出全部镜像 -q 只显示镜像 ID(IMAGE ID) --no-trunc 显示完整的镜像信息 --digests 显示镜像摘要信息 【举例:】 [root@localhost ~]# docker images mysql [root@localhost ~]# docker images --no-trunc
【格式:】 docker rmi [选项] 镜像名 选项: -f 强制删除 【举例:】 docker rmi tomcat
至关于一个镜像的不一样名字。
【格式:】
docker tag 原镜像名 新镜像名
【举例:】
[root@localhost ~]# docker tag tomcat:latest mytomcat
运行一个镜像,就能够生成一个 容器,容器内部是一个完整的运行环境。
一个镜像能够生成多个容器,相似于 Java 中 类 与 对象的关系。
须要对各个容器进行管理。
【格式:】 docker run [选项] 镜像文件名 选项: -d 指在后台运行容器,返回容器 ID。 -i 以交互模式运行容器,一般与 -t 连用(即 -it)。 -t 为容器分配一个伪输入终端。 -P 随机端口映射,将容器内部端口随机映射到主机的端口 -p 指定端口映射,将容器内部端口映射到主机指定端口,格式:-p 主机端口:容器端口 --name 指定启动容器的名字,格式: --name 容器名 -e 指定环境变量,格式:-e 环境变量名=环境变量值 -v 文件挂载,将容器内部文件与主机文件绑定,格式 -v 主机文件路径:容器文件路径 【举例:】 docker run --name mysqlDemo -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8.0.19 上面命令为: docker run mysql:8.0.19 执行 mysql:8.0.19 版本的镜像,生成一个容器 --name mysqlDemo 容器命名为 mysqlDemo -d 后台运行 -e MYSQL_ROOT_PASSWORD=123456 设置登录密码为 123456,登录用户为 root -p 3306:3306 将容器内部 3306 端口映射到 主机的 3306 端口,即经过 主机的 3306 能够访问容器的 3306 端口
【docker start 格式:】
docker start 容器名
【docker stop 格式:】
docker stop 容器名
【docker restart 格式:】
docker restart 容器名
【举例:】
[root@localhost ~]# docker stop mysql
【格式:】 docker kill [选项] 容器名 选项: -s 向容器发送一个信号 【举例:】 [root@localhost ~]# docker kill mysqlDemo
【格式:】 docker rm [选项] 容器名 选项: -f 强制删除一个运行中的容器 -v 删除与容器相关联的 卷 【举例:】 [root@localhost ~]# docker rm -f mysqlDemo
【格式:】 docker create [选项] 镜像名 选项基本与 docker run 同样(没有 -d)。 【举例:】 [root@localhost ~]# docker create --name mysqlDemo1 -e MYSQL_ROOT_PASSWORD=123456 -p 3312:3306 mysql:8.0.19
【格式:】 docker exec [选项] 容器名 命令 选项: -d 以分离模式在后台运行。 -i 以交互模式运行容器,一般与 -t 连用(即 -it)。 -t 为容器分配一个伪输入终端。 【举例:】 [root@localhost ~]# docker exec -it mysql /bin/bash
【格式:】 docker ps [选项] 选项: -a 显示全部容器,包括未运行的容器 -l 显示最近建立的容器 -n 指定数 显示最近建立的 指定数 的容器。好比: -n 7,显示最近建立的 7 个容器 -q 只显示容器 ID 【举例:】 [root@localhost ~]# docker ps -an 10
【格式:】
docker top 容器名
【举例:】
[root@localhost ~]# docker top mysql
【格式:】 docker logs [选项] 容器名 选项: -f 跟踪日志输出 --tail 显示最新的 n 条日志,格式: --tail=指定数 -t 显示时间戳 【举例:】 [root@localhost ~]# docker logs --tail=10 mysql
【格式:】
docker port 容器名
【举例:】
docker port mysql
【格式:】 docker info 【举例:】 [root@localhost ~]# docker info
【格式:】 docker version docker -v 【举例:】 [root@localhost ~]# docker version [root@localhost ~]# docker -v
【方式一:官网搜索】 https://hub.docker.com/ https://hub.docker.com/_/mysql?tab=tags 【方式二:(经过命令行查询)】 docker search mysql
经过官网地址,能够查看到 想要下载的版本,使用 pull 命令拉取镜像便可.
此处我选择 8.0.19 版本的 mysql。
若是没有 设置版本,则会自动下载最新的版本(即 docker pull mysql 会下载最新的版本 latest)。
【命令行下载:】 docker pull mysql:8.0.19 【查看镜像是否成功下载:(即查看本地镜像)】 docker images
【运行容器:】 docker run -p 3306:3306 --name mysql \ -v /usr/mydata/mysql/log:/var/log/mysql \ -v /usr/mydata/mysql/data:/var/lib/mysql \ -v /usr/mydata/mysql/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:8.0.19 分析: docker run -d mysql:8.0.19 之后台的方式运行 mysql 8.0.19 版本的镜像,生成一个容器。 --name mysql 容器名为 mysql -e MYSQL_ROOT_PASSWORD=123456 设置登录密码为 123456,登录用户为 root -p 3306:3306 将容器内部 3306 端口映射到 主机的 3306 端口,即经过 主机的 3306 能够访问容器的 3306 端口 -v /usr/mydata/mysql/log:/var/log/mysql 将容器的 日志文件夹 挂载到 主机的相应位置 -v /usr/mydata/mysql/data:/var/lib/mysql 将容器的 数据文件夹 挂载到 主机的相应位置 -v /usr/mydata/mysql/conf:/etc/mysql/conf.d 将容器的 自定义配置文件夹 挂载到主机的相应位置 【查看容器是否启动:】 docker ps -a
【本机使用:(使用交互式方式进入)】 docker exec -it mysql /bin/bash 【外部访问:(访问主机的 3306 端口便可)】 ifconfig 能够查看 主机的 ip 地址(好比链接 :192.168.217.129:3306)
在启动过程当中,已经将 /etc/mysql/conf.d 挂载到了 /usr/mydata/mysql/conf 上,因此在 /usr/mydata/mysql/conf 目录下 新建一个 my.cnf 文件,并添加配置信息,便可修改 mysql 容器的配置。
【查看 当前 mysql 的字符集:】 show variables like "%character%";
初始字符集。
建立 /usr/mydata/mysql/conf/my.cnf ,并重启容器。
【在 /usr/mydata/mysql/conf 下新建一个 my.cnf 文件】 [client] # 设置字符集为 utf-8 default-character-set=utf8 [mysql] # 设置字符集为 utf-8 default-character-set=utf8 [mysqld] # 设置登录用户 # user=root # 设置字符集编码为 utf-8 character-set-server=utf8 【重启容器】 docker restart mysql
【方式一:官网搜索】 https://hub.docker.com/ https://hub.docker.com/_/redis?tab=tags 【方式二:(经过命令行查询)】 docker search redis
【下载最新的镜像:】
docker pull redis
【运行容器:】 使用 docker run -v 挂载文件时,若想挂载文件,须要先在主机上建立文件,不然会当成目录挂载。 mkdir -p /usr/mydata/redis/conf touch /usr/mydata/redis/conf/redis.conf 须要使用 redis-server /etc/redis/redis.conf 指定配置文件启动 redis。 docker run -p 6379:6379 --name redis \ -v /usr/mydata/redis/conf/redis.conf:/etc/redis/redis.conf \ -v /usr/mydata/redis/conf/data:/data \ -d redis redis-server /etc/redis/redis.conf 分析: docker run -d redis 运行 redis 最新镜像,并生成一个容器 --name redis 容器名为 redis -p 6379:6379 指定端口映射,容器的 6379 端口映射到 主机的 6379 端口, -v /usr/mydata/redis/conf/redis.conf:/etc/redis/redis.conf 挂载 redis 的配置文件到主机的指定位置 -v /usr/mydata/redis/conf/data:/data 挂载 redis 的数据到主机的指定位置 redis-server /etc/redis/redis.conf 表示根据 /etc/redis/redis.conf 配置文件启动。
【使用交互式方式进入 redis 容器】 docker exec -it redis /bin/bash 【使用交互式方式 打开 redis-cli】 docker exec -it redis redis-cli
使用默认配置文件启动 redis 时,数据不会持久化(即 appendonly = no)。
当 redis 重启后,数据就会丢失。
修改配置文件,添加数据持久化(即 appendonly = yes)。
【编辑 /usr/mydata/redis/conf/redis.conf】 vim /usr/mydata/redis/conf/redis.conf appendonly yes
参考地址:
https://www.cnblogs.com/l-y-h/p/12844824.html#_label3
(1)什么是 Docker 数据卷?
【数据卷:】
数据卷本质就是磁盘中的某个目录,其能够与 Docker 容器中某个目录相关联。
能够 理解成 将宿主机的一个目录 映射 到 容器的某个目录中。
【为何使用 数据卷:】
Docker 经过镜像启动一个容器后,容器会产生一些数据,若是不对这些数据进行处理,当容器被删除后,数据将会丢失。
能够将这些数据 映射 到 数据卷中,这样就能够保存在 磁盘。
再次启动容器后,能够挂载到 数据卷,从而获取数据(实现数据持久化、共享等)。
且 操做 数据卷中的数据,容器数据也会随之变化,大大提升修改、查看数据的效率(不用进入容器内部)。
(2)数据卷经常使用命令
【建立数据卷:】 docker volume create 数据卷名称 注: 建立数据卷后,数据默认会存放在 /var/lib/docker/volumes/数据卷名称/_data 目录下。 好比: docker volume create testVolume 会建立一个 /var/lib/docker/volumes/testVolume/_data/ 目录。 【查看数据卷详细信息:】 docker volume inspect 数据卷名称 好比: docker volume inspect testVolume 【查看所有数据卷:】 docker volume ls 【输出数据卷:】 docker volume rm 数据卷名称 好比: docker volume rm testVolume
(3)数据卷 映射到 容器目录中
【格式:】 -v 数据卷:容器内部指定目录 注: 将数据卷 映射到 容器指定目录 【方式一:(不推荐)】 docker run 镜像ID(镜像名)-v 数据卷名称:容器内部指定目录 注: 当 数据卷不存在时,Docker 会自动建立,且将容器内部自带文件存放在 默认路径中。 好比: docker run -d mysql:8.0.19 -v mysqlLog:/var/log/mysql 【方式二:(推荐)】 docker run 镜像ID(镜像名)-v 磁盘路径:容器内部指定目录 注: 直接指定磁盘路径做为数据卷时,路径下是空的。 好比: docker run -d mysql:8.0.19 v /usr/mydata/mysql/log:/var/log/mysql
(4)补充命令
docker stop $(docker ps) 查询全部容器并中止。 【cp 从主机 复制文件到 容器中】 docker cp 磁盘目录(文件) 容器名:容器目录(文件) 注: 将文件从磁盘目录 复制到 容器目录中。 好比: docker cp test2.txt mysql2:/var/log/mysql 将当前目录下 test2.txt 复制到 mysql2 容器的 /var/log/mysql 目录下。
(1)说明
Docker 仓库中存在各类各样的镜像,每次下载同一个镜像后,还得从新配置一遍,很是麻烦。
能够经过 Dockerfile 文件自定义镜像,按照指令 构建镜像。
(2)Dockerfile 经常使用指令
【FROM(from)】 指定当前镜像 是基于 哪一个镜像建立的。 格式: from 镜像 好比: from mysql:8.0.19 此镜像基于 mysql:8.0.19 构建 【RUN(run)】 容器构建(docker build)时须要运行的命令。 格式: run 命令一 && 命令二 run ["文件", "参数一", "参数二"] 好比: run echo '开始构建镜像 ========== ' && echo ' ========== 开始构建镜像' 【CMD(cmd)】 指定容器启动(docker run)时运行的命令。 若存在多个 CMD,则以最后一个 CMD 为主。 能够被 docker run 传入的参数覆盖。 格式: cmd 命令 cmd ["命令", "参数1", "参数2"] cmd ["参数1", "参数2"] 此写法做为 ENTRYPOINT 的默认参数 好比: cmd echo '开始启动容器 ========== ' && echo ' ========== 开始启动容器' 【ENTRYPOINT(entrypoint)】 相似于 cmd,可是其不会被 docker run 传入的参数覆盖(可是若使用了 --entrypoint 的参数能够覆盖)。 格式: entrypoint 命令 entrypoint ["命令", "参数1", "参数2"] 好比: entrypoint ["echo", "hello"] cmd ["world"] 注: 此时,若 docker run 不传入任何参数时,则 cmd 将做为 entrypoint 参数, 即 entrypoint ["echo", "hello", "world"] 【COPY(copy)】 将 指定文件或目录 复制到 镜像中的指定位置。 格式: copy src desc 好比: copy test.txt /root/test 将当前目录下 test.txt 复制到 容器 /root/test 目录下 【ADD(add)】 将 指定文件或目录 复制到 镜像中的指定位置。 会自动处理 URL 以及 解压 tar 文件。 格式: add src desc 好比: add test2.txt /root/test 将当前目录下 test.txt 复制到 容器 /root/test 目录下 【MAINTAINER(maintainer)】 设置维护者信息(姓名、邮箱等) 格式: maintainer 数据1 数据2 好比: maintainer lyh lyh@163.com 设置维护者 姓名、邮箱 【EXPOSE(expose)】 设置当前容器对外暴露的端口号。 格式: expose port1 port2 好比: expose 8080 容器对外暴露端口号为 8080 【ENV(env)】 设置环境变量。 格式: env key value 好比: env map helloworld 经过 $map 能够获取环境变量值为 helloworld 【WORKDIR(workdir)】 指定镜像默认的工做目录。 格式: workdir 目录 好比: workdir /root/work 【VOLUME(volume)】 定义默认数据卷,若启动容器时忘记经过 -v 进行数据卷映射到 容器目录,将会自动挂载到 默认数据卷。 持久书数据,避免数据丢失。 格式: volume 路径 volume ["路径1", "路径2"]
(3)制做镜像
将编写好的 Dockerfile 文件以及须要复制的文件 制做成镜像。
【docker build】 docker build -t 镜像名称 . 或者 docker build -t 镜像名称[:tag] . 注: 命令末尾的点 . 指的是 上下文路径(为 Dockerfile 文件所在位置)。 docker 构建镜像时 会 将上下文路径中全部的文件 进行打包(因此此路径下不要放置无关文件)。
(4)Dockerfile 编写举例 以及 使用 docker build 自定义镜像。
通常都是新建一个空目录 来进行 自定义镜像操做,避免打包没必要要的文件。
建立一个名为 Dockerfile 的文件(文件名不一致将致使 docker build 出错)。
【Dockerfile:】 # 设置基础镜像 from mysql:8.0.19 # 设置维护者信息 maintainer lyh lyh@163.com # docker build 时会触发, run echo '开始构建镜像 ========== ' && echo ' ========== 开始构建镜像' # docker run 时会触发 entrypoint ["echo", "启动镜像"] cmd ["hello world"] # 将当前目录下的 test.txt 复制到 /root/test 目录下 copy test.txt /root/test # 将当前目录下的 test2.txt 复制到 /root/test 目录下 add test2.txt /root/test # 对外暴露端口为 8080 expose 8080 # 设置环境变量 env map helloworld run echo $map # 指定容器默认工做目录 workdir /root/work # 指定默认数据卷路径 volume /var/lib/docker/volumes/defaultVolume 【构建自定义镜像:】 docker build -t customize_mysql . 【查看当前自定义镜像信息:】 docker inspect customize_mysql
(1)说明
使用 docker run 启动一个容器时,须要配置上大量参数,当配置集群 或者 须要启动多个容器时 时,若一个一个去启动,那工做量将变得很大,且容易出错。
使用 Docker-Compose 能够进行容器的管理。其经过 docker-compose.yml 文件去维护容器参数信息。经过该 yml 文件能够很方便的 管理、启动 容器。
(2)下载、安装
【官方地址:】 github 地址: https://github.com/docker/compose 文档地址:https://docs.docker.com/compose/ 安装文档地址:https://docs.docker.com/compose/install/ 【下载:(此处为 1.27.4 版本,若须要其余版本,替换便可)】 curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 注: 此方式下载速度较慢,能够去 github 上找到对应版本 下载到本地后 再发送到 服务器上。 【给下载后的 docker-compose 添加可执行权限】 chmod +x /usr/local/bin/docker-compose 【查看 docker 以及 docker-compose 版本号:】 docker -v docker-compose -v 【查看环境变量:(非必须操做)】 echo $PATH 能够查看当前环境变量 which 指令 好比:which docker 能够查看 docker 指令所在目录 注: 若 docker-compose 不在环境变量中,能够进行配置(方便在任意目录执行 docker-compose)。 打开 /etc/profile 文件,在 PATH 中追加指令所在目录便可。 好比: vim /etc/profile export PATH="/usr/local/bin/:$PATH" source /etc/profile
(3)docker-compose 命令
执行 docker-compose 命令时,默认会在当前目录下找 docker-compose.yml 文件。
【基于 docker-compose.yml 文件启动容器:】 docker-compose up -d 注: -d 表示后台执行 【关闭并删除 docker-compose 维护的容器:】 docker-compose down 【开启、关闭、重启 已存在的 docker-compose 维护的容器:】 docker-compose start docker-compose stop docker-compose restart 【查看由 docker-compose 管理的容器:】 docker-compose ps 【查看日志:】 docker-compose logs -f
(4)docker-compose.yml 经常使用参数
yml 编写时 须要注意 缩进 以及 空格(不要使用 Tab 键,容易出错)。
【docker-compose.yml】 # 指定 compose 文件版本,与 docker 兼容,高版本的 docker 通常使用 3.x。 version: '3.7' # 定义须要管理的 全部服务 信息 services: # 此处指的是服务的名称 mysqlService: # 指定构建镜像的上下文路径(通常与 Dockerfile 一块儿使用)。 # build: # # 指定 Dockerfile 所在路径 # context: ../ # # 指定 Dockerfile 名称(默认为 Dockerfile) # dockerfile: Dockerfile # 指定容器的名称(等同于 docker run --name) container_name: mysql2 # 指定镜像路径(能够是远程仓库镜像 或者 本地镜像) image: mysql:8.0.19 # 设置环境变量 environment: # 设置 MySQL 登录用户为 root,登录密码为 123456 MYSQL_ROOR_PASSWORD: root # 指定时区 TZ: Asia/Shanghai # 定义 宿主机 与 容器的端口映射 ports: - 3307:3306 # 定义 宿主机 与 容器的数据卷映射 volumes: - /usr/mydata/mysql/log:/var/log/mysql - /usr/mydata/mysql/data:/var/lib/mysql - /usr/mydata/mysql/conf:/etc/mysql/conf.d # 定义容器重启策略,no 表示任何状况下都不重启(默认),always 表示老是从新启动。 # 若使用 swarm 集群模式,需使用 restart_policy 替代 restart restart: always
(5)docker-compose 配合 Dockerfile 使用
使用 docker-compose.yml 文件 以及 Dockerfile 文件,在生成自定义镜像的 同时 启动当前镜像,并由 docker-compose 维护、管理。
docker-compose.yml 文件经过 build 参数能够找到 Dockerfile 文件。
【Dockerfile】 from mysql:8.0.19 【docker-compose.yml】 # 指定 compose 文件版本,与 docker 兼容,高版本的 docker 通常使用 3.x。 version: '3.7' # 定义须要管理的 全部服务 信息 services: # 此处指的是服务的名称 mysqlService: # 指定构建镜像的上下文路径(通常与 Dockerfile 一块儿使用)。 build: # 指定 Dockerfile 所在路径 context: ../ # 指定 Dockerfile 名称(默认为 Dockerfile) dockerfile: Dockerfile # 指定容器的名称(等同于 docker run --name) container_name: mysql2 # 指定镜像路径(能够是远程仓库镜像 或者 本地镜像) image: mysql:8.0.19 # 设置环境变量 environment: # 设置 MySQL 登录用户为 root,登录密码为 123456 MYSQL_ROOR_PASSWORD: root # 指定时区 TZ: Asia/Shanghai # 定义 宿主机 与 容器的端口映射 ports: - 3307:3306 # 定义 宿主机 与 容器的数据卷映射 volumes: - /usr/mydata/mysql/log:/var/log/mysql - /usr/mydata/mysql/data:/var/lib/mysql - /usr/mydata/mysql/conf:/etc/mysql/conf.d # 定义容器重启策略,no 表示任何状况下都不重启(默认),always 表示老是从新启动。 # 若使用 swarm 集群模式,需使用 restart_policy 替代 restart restart: always