跳转至

Docker Compose

大三上学期的必修课主要是工程方向(简称写前后端(俗称搬砖)),将项目部署到生产环境时,神奇的软件冲突轻则让软件无法运行,重则导致系统瘫痪。解决环境问题的一大法宝是虚拟化,而轻量级虚拟化优秀莫过于docker;而实际生产中通常会用到许多组件,如数据库和页面逻辑分离,作为多个独立的docker image,要把它们组合(compose)到一起,docker-compose是最佳选择之一;其他还有Kubernetes等。

复习

如何用Dockerfile定制镜像

Dockerfile是由一行一行的指令构成的,在镜像构建过程中顺序执行。

FROM

FROM <镜像名>

每个自定义的Dockerfile的第一句必定是FROM,先知道镜像是怎么来的,后面我们再讲镜像是怎么没的。

RUN

RUN <命令>

一条shell命令,在相当于在被构建的镜像中的shell中执行,完成镜像的搭建工作;常见工作有修改配置文件、编译/下载安装软件包等。

COPY

COPY [--chown=<user>:<group>] {"<源路径1>",...  "<目标路径>"}

--chown:将复制进容器中的文件所有者改成参数标明的用户和所有者

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则

ADD

COPY,不同点是会自动解压targzipbzip2xz文件。

CMD

docker run时默认执行,但docker run带有命令行参数时会被 overridden。

ENTRYPOINT

类似于CMD,但不会被docker run时指定的命令行参数覆盖,而是会将命令行参数作为ENTRYPOINT的参数执行。但如果在docker run中使用了参数–-entrypoint,则被覆盖而只执行–-entrypoint的参数。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

如果同时指定了CMDENTRYPOINTCMD会成为ENTRYPOINT的参数。注意ENTRYPOINT后参数不会被docker run的命令行参数覆盖,而CMD的会。

ENV

shell环境变量

ENV {<key> <value>}
ENV {<key1>=<value1>} [<key2>=<value2> ...]

ARG

Dockerfile内部参数,仅在docker build过程中生效。

VOLUME

定义匿名卷。在启动容器时没有挂载数据卷时自动挂载。

EXPOSE

声明暴露端口,对外暴露的端口可用于端口映射。

WORKDIR

指定工作目录,在docker build期间此后的命令中一直有效。

USER

指定用户,在docker build期间此后的命令中一直有效。

HEALTHCHECK

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

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

ONBUILD

延迟构建命令。假设本镜像名为imageONBUILD的参数在本次构建过程中不会执行,但如果另一镜像的Dockerfile第一条命令是FROM imageONBUILD的参数会被执行。

LABEL

以键值对的形式添加一些元数据。

LABEL <key>=<value> <key>=<value> <key>=<value> ...

起步

首先安装:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

熟悉

Compose是一个用于定义并运行由多个Docker容器聚合成的应用的工具,广泛用于生产、测试、开发、CI 工作流等环节。相当于把鲸鱼装进了冰箱。

要把鲸鱼装冰箱,一共分三步:

  1. 使用Dockerfile构建应用镜像
  2. docker-compose.yml文件中用镜像组织服务。
  3. docker compose up一键启动服务(加上-d参数后台运行)

docker-compose文件为YAML格式,范例如下:

version: "3.9" # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

总之,docker compose是介于docker builddocker run之间的中间件,既可以指定argenventrypointexposeDockerfile中的标定,又可以进行镜像的运行和组网,是生产自动化的高效工具。

中间的内容,随着项目的进行会不断增加,欢迎关注~

不过话说回来,知识是会贬值的,学到的不赶紧用就浪费了。


最后更新: 2023-05-22