docker file && docker compose

总览

先简单理解 docker 的使用过程,它分为镜像构建与容器启动。

镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。

容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。

而如果涉及多个容器的运行(如服务编排)就可以通过 docker-compose 来实现,它可以轻松的将多个容器作为 service 来运行(当然也可仅运行其中的某个),并且提供了 scale (服务扩容) 的功能。

简单总结:

1.dockerfile: 构建镜像;

2.docker run: 启动容器;

3.docker-compose: 启动服务;

从头说起。
假如你不用 docker ,搭建 wordpress 怎么弄?先找台 server ,假设其 OS 为 Ubuntu ,然后按照文档一步步敲命令,写配置,对吧?
用 docker 呢? 随便找台 server ,不管什么操作系统,只要支持 docker 就行, docker run ubuntu, docker 会从官方源里拉取最新的 Ubuntu 镜像,可以认为你开了个 Ubuntu 虚拟机,然后一步步安装,跟上面一样。

但是这样安装有个显著的缺点,一旦 container 被删,你做的工作就都没了。当然可以用 docker commit 来保存成镜像,这样就可以复用了。

但是镜像一般比较大,而且只分享镜像的话,别人也不知道你这镜像到底包含什么,这些问题都不利于分享和复用。
一个直观的解决方案就是,写个脚本把安装过程全部记录下来,这样再次安装的时候,执行脚本就行了。 Dockerfile 就是这样的脚本,它记录了一个镜像的制作过程。
有了 Dockerfile, 只要执行 docker build . 就能制作镜像,而且 Dockerfile 就是文本文件,修改也很方便。

现在有了 wordpress 的镜像,只需要 docker run 就把 wordpress 启动起来了。

如果仅仅是 wordpress, 这也就够了。但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有 nginx , 数据库 mysql, 邮件服务等等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了。
更常见的是, nginx, mysql, smtp 都分别是个镜像,然后这些镜像合作,共同服务一个项目。
docker-compose 就是解决这个问题的。你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里。
要启动服务,只需要 docker-compose up 就行,停止也只需要 docker-compse stop/down

简而言之, Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。

你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要;如果镜像是需要 build 的,那就需要提供 Dockerfile.

docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。

dockerfile的作用是从无到有的构建镜像。它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。Dockerfile - 为 docker build 命令准备的,用于建立一个独立的 image ,在 docker-compose 里也可以用来实时 build
docker-compose.yml - 为 docker-compose 准备的脚本,可以同时管理多个 container ,包括他们之间的关系、用官方 image 还是自己 build 、各种网络端口定义、储存空间定义等

dockerfile指令

一、 变量

变量用 $variable_name 或者 ${variable_name} 表示。
${variable:-word} 表示如果 variable 设置,则结果将是该值。如果 variable 未设置,word 则将是结果。
${variable:+word} 表示如果 variable 设置则为 word 结果,否则为空字符串。
变量前加 \ 可以转义成普通字符串:\$foo or \${foo},表示转换为 $foo 和 ${foo} 文字。

二、FROM

初始化一个新的构建阶段,并设置基础镜像:

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]


单个 Dockfile 可以多次出现 FROM,以使用之前的构建阶段作为另一个构建阶段的依赖项
AS name 表示为构建阶段命名,在后续 FROM 和 COPY --from=<name> 说明中可以使用这个名词,引用此阶段构建的映像
digest 其实就是就是根据镜像内容产生的一个 ID,只要镜像的内容不变 digest 也不会变
tag 或 digest 值是可选的。如果您省略其中任何一个,构建器默认使用一个 latest 标签。如果找不到该 tag 值,构建器将返回错误。
--platform 标志可用于在 FROM 引用多平台镜像的情况下指定平台。例如,linux/amd64、linux/arm64、 或 windows/amd64。

三、RUN

将在当前镜像之上的新层中执行命令,在 docker build时运行。

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN 有两种形式:

RUN<command>(shell 形式,命令在 shell 中运行,默认 /bin/sh -c 在 Linux 或 cmd /S /CWindows 上)
RUN ["executable", "param1", "param2"](执行形式)


说明:

可以使用 \(反斜杠)将单个 RUN 指令延续到下一行
RUN 在下一次构建期间,指令缓存不会自动失效。可以使用 --no-cache 标志使指令缓存无效
Dockerfile 的指令每执行一次都会在 Docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,可以使用 && 符号连接命令,这样执行后,只会创建 1 层镜像

四、CMD

运行程序,在 docker run 时运行,但是和 run 命令不同,RUN 是在 docker build 时运行。

FROM ubuntu
CMD ["/usr/bin/wc","--help"]
支持三种格式:

CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数。


指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

五、LABEL

添加元数据:

LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

六、EXPOSE

EXPOSE <port> [<port>/<protocol>...]
Docker 容器在运行时侦听指定的网络端口。可以指定端口是监听TCP还是UDP,如果不指定协议,默认为TCP。

该 EXPOSE 指令实际上并未发布端口。要在运行容器时实际发布端口,docker run -P 来发布和映射一个或多个端口。

默认情况下,EXPOSE 假定 TCP。您还可以指定 UDP:

EXPOSE 80/udp

七、ENV

设置环境变量:

ENV <key>=<value> ...
设置的环境变量将持续存在,您可以使用 docker inspect 来查看。使用 docker run --env <key>=<value> 来更改环境变量的值。

如果环境变量只在构建期间需要,请考虑为单个命令设置一个值:

RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
或者使用 ARG,它不会保留在最终镜像中:

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...

八、ADD

复制新文件、目录或远程文件 URL <src> ,并将它们添加到 <dest> 中。

<src> 可以指定多个资源,但如果它们是文件或目录,则它们的路径被解释为相对于构建上下文的源,也就是 WORKDIR。

每个都 <src> 可能包含通配符,匹配将使用 Go 的 filepath.Match 规则。例如:

添加所有以“hom”开头的文件:

ADD hom* /mydir/
在下面的示例中,? 被替换为任何单个字符,例如“home.txt”。

ADD hom?.txt /mydir/
<dest> 是一个绝对路径,或相对 WORKDIR 的相对路径。

九、COPY

语法同ADD一致,复制拷贝文件。

COPY 指令和 ADD 指令的唯一区别在于:是否支持从远程URL获取资源。COPY 指令只能从执行 docker build 所在的主机上读取资源并复制到镜像中。而 ADD 指令还支持通过 URL 从远程服务器读取资源并复制到镜像中。

相同需求时,推荐使用 COPY 指令。ADD 指令更擅长读取本地tar文件并解压缩。

十、ENTRYPOINT

ENTRYPOINT 和 CMD 一样,都是在指定容器启动程序及参数,不过它不会被 docker run 的命令行参数指定的指令所覆盖。如果要覆盖的话,需要通过 docker run --entrypoint 来指定。

它有2种格式:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
指定了 ENTRYPOINT 后, CMD 的内容作为参数传给 ENTRYPOINT 指令,实际执行时,将变为:

<ENTRYPOINT> <CMD>

十一、VOLUME

创建一个具有指定名称的挂载数据卷。

VOLUME ["/var/log/"]
VOLUME /var/log
它的主要作用是:

避免重要的数据,因容器重启而丢失
避免容器不断变大

十二、ARG

定义变量,与 ENV 作用相同,不过 ARG 变量不会像 ENV 变量那样持久化到构建好的镜像中。

ARG <name>[=<default value>]
Docker 有一组预定义的 ARG 变量,您可以在 Dockerfile 中没有相应指令的情况下使用这些变量。

HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy


要使用这些,请使用 --build-arg 标志在命令行上传递它们,例如:

docker build --build-arg HTTPS_PROXY=https://my-proxy.example.com .

十三、ONBUILD

将一个触发指令添加到镜像中,以便稍后在该镜像用作另一个构建的基础时执行。也就是另外一个 dockerfile FROM 了这个镜像的时候执行。

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

十四、STOPSIGNAL

设置将发送到容器退出的系统调用信号。该信号可以是与内核系统调用表中的位置匹配的有效无符号数,例如 9,或格式为 SIGNAME 的信号名称,例如 SIGKILL。

STOPSIGNAL signal
默认的 stop-signal 是 SIGTERM,在 docker stop 的时候会给容器内 PID 为 1 的进程发送这个 signal,通过 --stop-signal 可以设置自己需要的 signal,主要目的是为了让容器内的应用程序在接收到 signal 之后可以先处理一些事物,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,默认时间是 10s。

十五、HEALTHCHECK

用于指定某个程序或者指令来监控 Docker 容器服务的运行状态。该 HEALTHCHECK 指令有两种形式:

HEALTHCHECK [OPTIONS] CMD command(通过在容器内运行命令来检查容器健康状况)
HEALTHCHECK NONE(禁用从基础镜像继承的任何健康检查)

十六、SHELL

覆盖用于命令的 shell 形式的默认 shell。Linux 上的默认 shell 是 ["/bin/sh", "-c"],Windows 上是 ["cmd", "/S", "/C"]。

SHELL ["executable", "parameters"]
该 SHELL 指令在 Windows 上特别有用,因为 Windows 有两种常用且截然不同的本机 SHELL:cmd 和 powershell,以及可用的备用 shell,包括 sh。该 SHELL 指令可以出现多次。每条 SHELL 指令都会覆盖所有先前的 SHELL 指令,并影响所有后续指令。

十七、WORKDIR

工作目录,如果 WORKDIR 不存在,即使它没有在后续 Dockerfile 指令中使用,它也会被创建。

docker build 构建镜像过程中,每一个 RUN 命令都会新建一层。只有通过 WORKDIR 创建的目录才会一直存在。

可以设置多个 WORKDIR,如果提供了相对路径,它将相对于前一条 WORKDIR 指令的路径。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最终 pwd 命令的输出是 /a/b/c。

该 WORKDIR 指令可以解析先前使用 ENV,例如:

ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
最终 pwd 命令的输出是 /path/$DIRNAME。

十八、USER

设置用户名(或 UID)和可选的用户组(或 GID)。

USER <user>[:<group>]
USER <UID>[:<GID>]

d894585a9f572c7884b36f2396eaffea_a5d1a5433a7a25ead69e08665094d84f.png

例子
# 指明构建的新镜像是来自于 centos:7 基础镜像
FROM centos:7
# 通过镜像标签声明了作者信息
LABEL maintainer="mrhelloworld.com"
# 设置工作目录
WORKDIR /usr/local
# 新镜像构建成功以后创建指定目录
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷贝文件到镜像中并解压
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.37.tar.gz /usr/local/tomcat
# 暴露容器运行时的 8080 监听端口给外部
EXPOSE 8080
# 设置容器内 JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
ENV PATH $PATH:$JAVA_HOME/bin
# 启动容器时启动 tomcat 并查看 tomcat 日志信息
ENTRYPOINT /usr/local/tomcat/apache-tomcat-9.0.37/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-9.0.37/logs/catalina.out
复制代码

docker compose docker-compose.yml

version: '3.7' # 指定 compose 文件的版本
services: # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
  aaa: #服务aaa
    build: # 与image二选一,指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
      context: .               # context: 指定 Dockerfile 文件所在的路径
      dockerfile: Dockerfile            # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
      args: # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
        JAR_FILE: service.jar
      cache_from:            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
      labels:                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
      shm_size:              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)
    #ports:
    #  - "80:80"
    #  - "443:443"
    ports: # 建立宿主机与容器间的端口映射关系,上面是短语法写法,下面是长语法写法
      - target: 80     # 容器端口
        published: 80  # 宿主机端口
        protocol: tcp  # 协议类型
        mode: host     # host在每个节点上发布主机端口,ingress 对于集群模式端口进行负载均衡
      - target: 443
        published: 443
        protocol: tcp
        mode: host
    command:               # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
    configs:               # 不知道怎么用
    cgroup_parent:         # 为容器指定父 cgroup 组,意味着将继承该组的资源限制。
    container_name:        # 指定容器的名称 (等同于 docker run --name 的作用)
    deploy: # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
      endpoint_mode: vip      # v3.3 版本中新增的功能, 指定服务暴露的方式
      #      vip                  # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
      #      dnsrr               # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
      labels:                # 指定服务的标签,这些标签仅在服务上设置
      mode: replicated                  # 指定 deploy 的模式
      #      global              # 每个集群节点都只有一个容器
      #      replicated           # 用户可以指定集群中容器的数量(默认)
      placement:
        constraints:
          - node.role==manager             # 不知道怎么用
      replicas: 1              # deploy 的 mode 为 replicated 时, 指定容器副本的数量
      resources: # 资源限制
        limits: # 设置容器的资源限制
          cpus: "0.5"           # 设置该容器最多只能使用 50% 的 CPU
          memory: 50M           # 设置该容器最多只能使用 50M 的内存空间
        reservations: # 设置为容器预留的系统资源(随时可用)
          cpus: "0.2"           # 为该容器保留 20% 的 CPU
          memory: 20M           # 为该容器保留 20M 的内存空间
      restart_policy: # 定义容器重启策略, 用于代替 restart 参数
        condition: on-failure             # 定义容器重启策略(接受三个参数)
        #          none:                    # 不尝试重启
        #          on-failure:              # 只有当容器内部应用程序出现问题才会重启
        #          any  :                   # 无论如何都会尝试重启(默认)
        delay: 10s                  # 尝试重启的间隔时间(默认为 0s)
        max_attempts: 6           # 尝试重启次数(默认一直尝试重启)
        window: 120s              # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
      update_config: # 用于配置滚动更新配置
        parallelism: 1          # 一次性更新的容器数量
        delay: 10s                 # 更新一组容器之间的间隔时间
        order: stop-first                 # v3.4 版本中新增的参数, 回滚期间的操作顺序
        #      stop-first            #旧任务在启动新任务之前停止(默认)
        #      start-first           #首先启动新任务, 并且正在运行的任务暂时重叠
        failure_action: continue       # 定义更新失败的策略
        #      continue              # 继续更新
        #      rollback              # 回滚更新
        #      pause                 # 暂停更新(默认)
        #      monitor               # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
        max_failure_ratio: 0     # 回滚期间容忍的失败率(默认值为0)
      rollback_config: # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
        parallelism: 1         # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
        delay: 0           # 每个组回滚之间的时间间隔(默认为0)
        failure_action: continue # 定义回滚失败的策略
        #          continue             # 继续回滚
        #          pause             # 暂停回滚
        monitor: 10s           # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
        max_failure_ratio: 0     # 回滚期间容忍的失败率(默认值0)
        order: stop-first            # 回滚期间的操作顺序
    #          stop-first            # 旧任务在启动新任务之前停止(默认)
    #          start-first            # 首先启动新任务, 并且正在运行的任务暂时重叠
    devices:             # 指定设备映射列表 (等同于 docker run --device 的作用)
    depends_on: #依赖容器
      - db
      - redis
    dns:                 # 设置 DNS 地址(等同于 docker run --dns 的作用)
    dns_search:           # 设置 DNS 搜索域(等同于 docker run --dns-search 的作用)
    tmpfs:               # v2 版本以上, 挂载目录到容器中, 作为容器的临时文件系统(等同于 docker run --tmpfs 的作用, 在使用 swarm 部署时将忽略该选项)
    entrypoint:          # 覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用)
    env_file: # 从指定文件中读取变量设置为容器中的环境变量, 可以是单个值或者一个文件列表, 如果多个文件中的变量重名则后面的变量覆盖前面的变量, environment 的值覆盖 env_file 的值
      RACK_ENV=development
    volumes: #  定义容器和宿主机的数据卷映射关系
      - "/u01:/u01"   # 映射容器内的 /u01 到宿主机的 /u01目录
    environment: # 设置环境变量, environment 的值可以覆盖 env_file 的值 (等同于 docker run --env 的作用)
      - TZ=Asia/Shanghai
      - PORT_TO_EXPOSE=80
      - LOG_PATH=/opt/proj/logs
      - PROFILES_ACTIVE=prod

    expose:              # 暴露端口, 但是不能和宿主机建立映射关系, 类似于 Dockerfile 的 EXPOSE 指令
    external_links:      # 连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器(docker run 启动的容器, 在 v3 版本中使用 swarm 部署时将忽略该选项)
    extra_hosts:         # 添加 host 记录到容器中的 /etc/hosts 中 (等同于 docker run --add-host 的作用)
    healthcheck: # v2.1 以上版本, 定义容器健康状态检查, 类似于 Dockerfile 的 HEALTHCHECK 指令
      test: NONE # 检查容器检查状态的命令, 该选项必须是一个字符串或者列表, 第一项必须是 NONE, CMD 或 CMD-SHELL, 如果其是一个字符串则相当于 CMD-SHELL 加该字符串
      #        NONE                  # 禁用容器的健康状态检测
      #        CMD                   # test: ["CMD", "curl", "-f", "http://localhost"]
      #        CMD-SHELL             # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1
      interval: 1m30s       # 每次检查之间的间隔时间
      timeout: 10s          # 运行命令的超时时间
      retries: 3            # 重试次数
      start_period: 40s     # v3.4 以上新增的选项, 定义容器启动时间间隔
      disable: true         # true 或 false, 表示是否禁用健康状态检测和 test: NONE 相同
    image:              # 指定 docker 镜像, 可以是远程仓库镜像、本地镜像
    init:               # v3.7 中新增的参数, true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程
    isolation:            # 隔离容器技术, 在 Linux 中仅支持 default 值
    labels:             # 使用 Docker 标签将元数据添加到容器, 与 Dockerfile 中的 LABELS 类似
    links:              # 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
    logging: # 设置容器日志服务
      driver:              # 指定日志记录驱动程序, 默认 json-file (等同于 docker run --log-driver 的作用)
      options: # 指定日志的相关参数 (等同于 docker run --log-opt 的作用)
        max-size:             # 设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
        max-file:            # 日志文件保留的数量
    network_mode:       # 指定网络模式 (等同于 docker run --net 的作用, 在使用 swarm 部署时将忽略该选项)
networks: # 将容器加入指定网络 (等同于 docker network connect 的作用), networks 可以位于 compose 文件顶级键和 services 键的二级键
  aliases:              # 同一网络上的容器可以使用服务名称或别名连接到其中一个服务的容器
  ipv4_address          # IP V4 格式
  ipv6_address          # IP V6 格式

例1

version: '3.9'
services:
  pms-tsssd-service:
    build:
      context: .
      args:
        JAR_FILE: servsssisce.jar
      dockerfile: Dockerfile
    image: pms-td-ssssservice:1.0.0
    restart: always
    ports:
      - "9199:80"
    environment:
      - TZ=Asia/Shanghai
      - PORT_TO_EXPOSE=80
      - LOG_PATH=/opt/proj/logs
      - PROFILES_ACTIVE=test
    volumes:
     ## - /opt/pro/pms-td-service.jar:/home/admin/service.jar
      - /Users/yuan/Desktop/nc/pms-td-service.jar:/home/admin/service.jar
      - /Users/yuan/Desktop/nc/logs:/opt/proj/logs
     # - /opt/pe/data/logs:/opt/proj/logs
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role==manager
      resources:
        limits:
          cpus: '2'
          memory: 4096M
        # reservations:
        #   cpus: '2'
        #   memory: 1024M
      update_config:
        parallelism: 1
        delay: 10s
        order: stop-first
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 6
        window: 120s
# networks:
#   host:
#     external: true
#   default:
#     external:
#       name: pldds_nctransfer

version: '3.7'   # 版本必须3.0及以上,否则无法使用docker-stack 运行
services: # 定义 service 信息
  emcs-nginx:
    image: "***/nginx:test"   # 使用指定的 docker 镜像
    #ports:
    #  - "80:80"
    #  - "443:443"
    ports: # 建立宿主机与容器间的端口映射关系,上面是短语法写法,下面是长语法写法
      - target: 80     # 容器端口
        published: 80  # 宿主机端口
        protocol: tcp  # 协议类型
        mode: host     # host在每个节点上发布主机端口,ingress 对于集群模式端口进行负载均衡
      - target: 443
        published: 443
        protocol: tcp
        mode: host
    volumes: #  定义容器和宿主机的数据卷映射关系
      - "/u01:/u01"   # 映射容器内的 /u01 到宿主机的 /u01目录
    environment: # 设置环境变量
      TZ: Asia/Shanghai   #  设置时区为上海
    deploy: # 指定与部署和运行服务相关的配置, deploy部分是docker stack使用的, docker stack依赖docker swarm
      mode: replicated  # 指定模式:global每个集群节点都只有一个容器,
      # replicated用户可以指定集群中容器的数量(默认)
      replicas: 1  # deploy的mode为 replicated 时, 指定容器副本的数量
      update_config: #  用于配置滚动更新的配置
        parallelism: 1 # 一次性更新的容器数量
        delay: 10s     # 更新一组容器之间的间隔10s
        order: stop-first  # 指定回滚期间的操作顺序:stop-first旧任务在启动新任务之前停止(默认),
        # start-first首先启动新任务, 并且正在运行的任务暂时重叠
      restart_policy: # 定义容器重启策略, 用于代替 restart 参数
        condition: on-failure   # 定义容器重启策略(接受三个参数):
        # none不尝试重启;any无论如何都会尝试重启(默认)
        # on-failure只有当容器内部应用程序出现问题才会重启

  emcs-front: #  第二个服务
    image: "***/front"
    volumes:
      - "/u01/log:/u01/log"
    environment:
      TZ: Asia/Shanghai
    deploy:
      mode: replicated
      replicas: 1
      update_config:
        parallelism: 1
        delay: 20s
        order: stop-first
      restart_policy:
        condition: on-failure

docker-compose 命令

docker-compose up
用于编排并启动容器,如果docker-compose.yaml文件中service用的是build 的话,还会先构建一个镜像。
-d 表示在后台运行容器
docker-compose up -d

docker-compose ps
用于查看容器的运行情况,类似linux下的ps命令。

docker-compose <stop|start|restart>
停止|启动|重新启动 容器服务,可以指定特定的服务

docker-compose stop
停止所有

docker-compose stop nginx
停止nginx服务,这个服务是在docker-compose.yaml里面配置的。

docker-compose restart nginx
重启nginx

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容