Loading

容器技术:构建镜像以及使用Docker compose(五)

13. 构建镜像

13.1 构建镜像的两种方式

Docker提供了两种构建镜像的方法: docker commit命令与Dockerfile构建文件。docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤:

  • 运行容器
  • 修改容器
  • 讲容器保存为新的镜像

然而,Docker并不建议用户通过这种方式构建镜像。原因如下:

  1. 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。

  2. 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。


使用 Dockerfile 构建镜像可以带来很多好处:

  • 易于版本化管理,Dockerfile 本身是一个文本文件,方便存放在代码仓库做版本管理,可以很方便地找到各个版本之间的变更历史。
  • 过程可追溯,Dockerfile 的每一行指令代表一个镜像层,根据 Dockerfile 的内容即可很明确地查看镜像的完整构建过程。
  • 屏蔽构建环境异构,使用 Dockerfile 构建镜像无须考虑构建环境,基于相同 Dockerfile 无论在哪里运行,构建结果都一致。

既然docker commit不是推荐的方法,为什么还要花时间学习呢?即便是用Dockerfile(推荐方法)构建镜像,底层也是docker commit一层一层构建新镜像的。学习docker commit能够帮助我们更加深入地理解构建过程和镜像的分层结构。


13.2 Dockerfile构建文件

13.2.1 了解Dockerfile

了解Dockerfile的大致文件内容,以及各部分的作用。

image-20230412195954349


尽量使用构建缓存

Docker 构建过程中,每一条 Dockerfile 指令都会提交为一个镜像层,下一条指令都是基于上一条指令构建的。如果构建时发现要构建的镜像层的父镜像层已经存在,并且下一条命令使用了相同的指令,即可命中构建缓存。

Docker 构建时判断是否需要使用缓存的规则如下:

  • 从当前构建层开始,比较所有的子镜像,检查所有的构建指令是否与当前完全一致,如果不一致,则不使用缓存;
  • 一般情况下,只需要比较构建指令即可判断是否需要使用缓存,但是有些指令除外(例如ADD和COPY);
  • 对于ADD和COPY指令不仅要校验命令是否一致,还要为即将拷贝到容器的文件计算校验和(根据文件内容计算出的一个数值,如果两个文件计算的数值一致,表示两个文件内容一致 ),命令和校验和完全一致,才认为命中缓存。

因此,基于 Docker 构建时的缓存特性,我们可以把不轻易改变的指令放到 Dockerfile 前面(例如安装软件包),而可能经常发生改变的指令放在 Dockerfile 末尾(例如编译应用程序)。


13.2.2 Dockerfile中的指令
Dockerfile指令 含义 应用 建议
Dockerfile开头部分
FROM 指定基本镜像(相当于基于在什么镜像做改动) FROM ubuntu:20.04 尽量指定特定版本进行FROM。
LABEL 用于指定容器的属性信息,比如作者、个人联系方式等等 LABEL maintainer="YinJay xxx@163.com" 推荐LABEL方式,MAINTAINER基本不用。
ENV 用于创建Dockerfile中使用的变量 ENV xxx="yyyy" 比如路径、名称这些可以使用变量。
Dockerfile中间处理部分
RUN 制作镜像过程中需要的执行命令,通常是系统配置、服务配置、部署命令等,但不能出现阻塞当前终端的命令,否则构建失败。 RUN 系统命令即可 不建议使用多个RUN,尽量合并在一个RUN,因为一个RUN就会建立一层镜像。
ADD 可以把指定文件或目录(相对于当前目录下进行)拷贝到容器中(指定目录),压缩包自动解压 ADD xxx.tar.gz /app/code/xxx 拷贝本机文件或者远程文件到镜像内
COPY 可以把指定文件或目录(相对于当前目录下进行)拷贝到容器中(指定目录),不支持自动解压。 COPY nginx.conf /etc/nginx/nginx.conf 拷贝本机文件到镜像内
WORKDIR 指定容器的默认工作目录 WORKDIR /app/code
ADD xxx.tar.gz
为 Dockerfile 中跟在其后的所有 RUN、CMD、ENTRYPOINT、COPY 和 ADD 命令设置工作目录。(一般用于配合ADD,COPY指令)
VOLUME 挂载数据卷 VOLUME /usr/share/nginx/html 创建随机数据卷挂载容器的目录(通常在run时使用-v参数即可)
Dockerfile结尾部分
EXPOSE 指定镜像要对外暴露的端口 EXPOSE 80
EXPOSE 80 443
用于指定一个或多个容器的端口(这样子可以被-P识别)
CMD 用于指定容器的入口命令 CMD ["命令","参数1","参数2"]
CMD ["nginx","-d","deamon off;"]
通常使用CMD
ENTRYPOINT 用于指定容器的入口命令,无法被docker run替换,docker run指定的时候仅仅作为entrypoint命令的参数而已 使用不多

13.2.3 通过Dockerfile构建Tengine编译安装镜像

首先需要创建一个目录来存Dockerfile文件,再输出一个测试html。

image-20230413194713118


编辑Dockfile内容如下:

[root@docker01 tengine]# cat Dockerfile
#####1. basic image###
FROM ubuntu:20.04
LABEL maintainer="Tengine docker YinJay xxx@163.com"

#####2. vars##########
ENV HTML_DIR="/app/tools/tengine/html"
ENV WWW_USER="nginx"
ENV SOFT_DIR="/app/tools/tengine-2.3.3/"

####3. conf apt######
RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.163.com#g' /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y wget vim curl libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev \
    && wget -P /tmp/ http://tengine.taobao.org/download/tengine-2.3.3.tar.gz \
    && cd /tmp \
    && tar xf tengine-2.3.3.tar.gz \
    && cd tengine-2.3.3/ \
    && ./configure --prefix=${SOFT_DIR} \
        --user=${WWW_USER} \
        --group=${WWW_USER} \
        --group=${WWW_USER} \
        --with-http_v2_module \
        --with-http_realip_module \
        --with-http_stub_status_module \
        --with-http_mp4_module \
        --with-stream \
        --with-stream_ssl_module \
        --with-stream_realip_module   \
        --add-module=modules/ngx_http_upstream_check_module/ \
        --add-module=modules/ngx_http_upstream_session_sticky_module \
   && make -j 10 \
   && make install \
   && ln -s ${SOFT_DIR} /app/tools/tengine \
   && ln -s ${SOFT_DIR}sbin/nginx /sbin \
   && useradd -s /sbin/nologin nginx \
   && rm -rf /tmp/* /var/cache/*

###4. copy index.html#
COPY index.html ${SOFT_DIR}/index.html
###5. expose port#####
EXPOSE 80

###6. entry cmd#######
CMD ["nginx","-g","daemon off;"]

构建镜像

#docker build  -t ImageName:TagName Dir
#-t 给镜像加一个Tag
#ImageName 给镜像起的名称
#TagName 给镜像的Tag名
#Dir Dockerfile所在目录
#如果不在Dockerfile当前目录,则需在-t前面-f 指定Dockerfile所在目录

[root@docker01 tengine]# docker build -t tengine-test:v1 .

image-20230415145654618


访问测试

image-20230415145730584


14. 搭建私有仓库

14.1 仓库是什么

仓库(Repository)是存储和分发 Docker 镜像的地方。镜像仓库类似于代码仓库,Docker Hub 的命名来自 GitHub,Github 是我们常用的代码存储和分发的地方。同样 Docker Hub 是用来提供 Docker 镜像存储和分发的地方。

按照类型,我们将镜像仓库分为公共镜像仓库和私有镜像仓库。公共镜像仓库一般是 Docker 官方或者其他第三方组织(阿里云,腾讯云,网易云等)提供的,允许所有人注册和使用的镜像仓库。

Docker Hub 是全球最大的镜像市场,目前已经有超过 10w 个容器镜像,这些容器镜像主要来自软件供应商、开源组织和社区。大部分的操作系统镜像和软件镜像都可以直接在 Docker Hub 下载并使用。


注册服务器是存放仓库的实际服务器,而仓库则可以被理解为一个具体的项目或者目录;注册服务器可以包含很多个仓库,每个仓库又可以包含多个镜像。

image-20230416131538497


14.2 配置私有仓库

主机名 环境与ip地址
docker01.yinjay.com docker环境 10.0.0.81
reg.yinjay.com registry环境 10.0.0.82

所有主机配置主机名

cat >> /etc/hosts << EOF
10.0.0.81 docker01.yinjay.com
10.0.0.82 reg.yinjay.com
EOF

registry主机下载registry容器

[root@docker02 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
91d30c5bc195: Pull complete
65d52c8ad3c4: Pull complete
54f80cd081c9: Pull complete
ca8951d7f653: Pull complete
5ee46e9ce9b6: Pull complete
Digest: sha256:8c51be2f669c82da8015017ff1eae5e5155fcf707ba914c5c7b798fbeb03b50c
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

配置docker服务端准许使用http(所有主机)

cat /etc/docker/daemon.json
{
   "registry-mirrors": [
   "https://mirror.ccs.tencentyun.com"
  ],
   "insecure-registries":
  ["reg.yinjay.com:5000"]

}

启动私有仓库

[root@docker02 ~]# docker run -d --name "yinjay-registry" -p 5000:5000 -v /var/lib/registry --restart=always registry:latest
b83d5c0009b7e754fdde7c1ee086861a04906b9e6554b5f336f68ef097f6b8d9

推送镜像到私有仓库,先进行打标签(地址/路径/名字:版本)

image-20230416134114070


然后通过docker push推送到私有仓库上

image-20230416135553747


查看此时私有仓库的镜像,并拉取镜像到本地

#获取仓库的名称
[root@docker01 ~]# curl http://reg.yinjay.com:5000/v2/_catalog
{"repositories":["tengine/tengine-v1"]}

#获取某个仓库下的镜像名称和TAG信息
#http://reg.yinjay.com:5000/v2/仓库名称/tags/list

[root@docker01 ~]# curl http://reg.yinjay.com:5000/v2/tengine/tengine-v1/tags/list
{"name":"tengine/tengine-v1","tags":["registry"]}

image-20230416141922390


15. 多阶段构建镜像

Docker 镜像是分层的,并且每一层镜像都会额外占用存储空间,一个 Docker 镜像层数越多,这个镜像占用的存储空间则会越多。镜像构建最重要的一个原则就是要保持镜像体积尽可能小,要实现这个目标通常可以从两个方面入手:

  • 基础镜像体积应该尽量小
  • 尽量减少 Dockerfile 的行数,因为 Dockerfile 的每一条指令都会生成一个镜像层。

使用多阶段构建,它是怎么减少镜像的大小呢?Docker 允许我们在 Dockerfile 中使用多个 FROM 语句,而每个 FROM 语句都可以使用不同基础镜像。最终生成的镜像,是以最后一条 FROM 为准,所以我们可以在一个 Dockerfile 中声明多个 FROM,然后选择性地将一个阶段生成的文件拷贝到另外一个阶段中,从而实现最终的镜像只保留我们需要的环境和文件。多阶段构建的主要使用场景是分离编译环境和运行环境。


下面通过一个例子来看看多阶段构建镜像,首先先构建一个编译环境和运行环境在同一个的镜像。Dockerfile文件内容如下:

[root@docker01 tengine]# cat Dockerfile
#####1. basic image###
FROM ubuntu:20.04
LABEL maintainer="Tengine docker YinJay xxx@163.com"

#####2. vars##########
ENV HTML_DIR="/app/tools/tengine/html"
ENV WWW_USER="nginx"
ENV SOFT_DIR="/app/tools/tengine-2.3.3/"

####3. conf apt######
RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.163.com#g' /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y wget vim curl libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev \
    && wget -P /tmp/ http://tengine.taobao.org/download/tengine-2.3.3.tar.gz \
    && cd /tmp \
    && tar xf tengine-2.3.3.tar.gz \
    && cd tengine-2.3.3/ \
    && ./configure --prefix=${SOFT_DIR} \
        --user=${WWW_USER} \
        --group=${WWW_USER} \
        --group=${WWW_USER} \
        --with-http_v2_module \
        --with-http_realip_module \
        --with-http_stub_status_module \
        --with-http_mp4_module \
        --with-stream \
        --with-stream_ssl_module \
        --with-stream_realip_module   \
        --add-module=modules/ngx_http_upstream_check_module/ \
        --add-module=modules/ngx_http_upstream_session_sticky_module \
   && make -j 10 \
   && make install \
   && ln -s ${SOFT_DIR} /app/tools/tengine \
   && ln -s ${SOFT_DIR}sbin/nginx /sbin \
   && useradd -s /sbin/nologin nginx \
   && rm -rf /tmp/* /var/cache/*

###4. copy index.html#
COPY index.html ${HTML_DIR}/index.html
###5. expose port#####
EXPOSE 80

###6. entry cmd#######
CMD ["nginx","-g","daemon off;"]

image-20230416194012889


接着使用多阶段构建镜像方式,同时删减一些软件包的安装、编译环境所需的软件包安装,其Dockerfile内容如下:

[root@docker01 tengine]# cat Dockerfile
#####1. basic image###
FROM ubuntu:20.04 as temp
LABEL maintainer="Tengine docker YinJay xxx@163.com"

#####2. vars##########
ENV HTML_DIR="/app/tools/tengine/html"
ENV WWW_USER="nginx"
ENV SOFT_DIR="/app/tools/tengine-2.3.3/"

####3. conf apt######
RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.163.com#g' /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y wget vim curl libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev \
    && wget -P /tmp/ http://tengine.taobao.org/download/tengine-2.3.3.tar.gz \
    && cd /tmp \
    && tar xf tengine-2.3.3.tar.gz \
    && cd tengine-2.3.3/ \
    && ./configure --prefix=${SOFT_DIR} \
        --user=${WWW_USER} \
        --group=${WWW_USER} \
        --group=${WWW_USER} \
        --with-http_v2_module \
        --with-http_realip_module \
        --with-http_stub_status_module \
        --with-http_mp4_module \
        --with-stream \
        --with-stream_ssl_module \
        --with-stream_realip_module   \
        --add-module=modules/ngx_http_upstream_check_module/ \
        --add-module=modules/ngx_http_upstream_session_sticky_module \
   && make -j 10 \
   && make install \
   && ln -s ${SOFT_DIR} /app/tools/tengine \
   && ln -s ${SOFT_DIR}sbin/nginx /sbin \
   && useradd -s /sbin/nologin nginx \
   && rm -rf /tmp/* /var/cache/*

#####build image######
FROM ubuntu:20.04

COPY --from=temp /app/ /app/

RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.163.com#g' /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y libssl-dev pcre2-utils libpcre3-dev zlib1g-dev \
    && ln -s /app/tools/tengine/sbin/nginx /sbin \
    && groupadd nginx \
    && useradd -g nginx nginx \
    && rm -rf /tmp/* /var/cache/*

COPY index.html /app/tools/tengine/html/index.html

EXPOSE 80

CMD ["nginx","-g","daemon off;"]

在构建过程中还使用了前面的缓存,对比前面两个Dockerfile就知道前面的一些指令是一模一样的,所以使用了镜像缓存。

image-20230416194142811


可以看到两个镜像大小差别很大!所以在生产环境中推荐使用多阶段构建来减小镜像。

image-20230416194339302


如果不使用缓存,也可以加上--no-cache指令进行构建镜像。但下图看起来好像还是用了cache?也不算啦,镜像已经拉取了同一个版本在本地了,就没重新再拉取,使用本地的。

image-20230416195022695


没使用缓存,但构建的大小也还是一样的!

image-20230416195045436


16. Docker Compose

16.1 前言

之前的操作都是围绕单个容器进行的,但当我们的业务越来越复杂时,需要多个容器相互配合,甚至需要多个主机组成容器集群才能满足我们的业务需求,这个时候就需要用到容器的编排工具了。因为容器编排工具可以帮助我们批量地创建、调度和管理容器,帮助我们解决规模化容器的部署问题。

先来学习一个在开发时经常用到的编排工具——Docker Compose。合理地使用 Docker Compose 可以极大地帮助我们提升开发效率。那么 Docker Compose 究竟是什么呢?

现阶段 Docker Compose 是 Docker 官方的单机多容器管理系统,它本质是一个 Python 脚本,它通过解析用户编写的 yaml 文件,调用 Docker API 实现动态的创建和管理多个容器。


16.2 安装或者更新Docker Compose

在安装 Docker Compose 之前,请确保你的机器已经正确运行了 Docker,一般安装docker时就会把docker compose一起安装了,如果执行docker-compose -v没有出现信息,则需要下载。

可在github上下载最新版本 https://github.com/docker/compose/releases


下面以下载v2.17.2为例

#从github上下载
[root@docker01 ~]# wget https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64

#赋予执行权限
[root@docker01 ~]# chmod +x docker-compose-linux-x86_64

#有则覆盖
[root@docker01 ~]# mv docker-compose-linux-x86_64 /usr/bin/docker-compose
mv: overwrite ‘/usr/bin/docker-compose’? y

#检查docker-compose的版本的信息,当我们执行完下面命令后,如果 Docker Compose 输出了当前版本号,就表示我们的 Docker Compose 已经安装成功。
[root@docker01 ~]# docker-compose -v
Docker Compose version v2.17.2

16.3 编写Docker Compose模板文件

16.3.1 前置知识

在使用 Docker Compose 启动容器时, Docker Compose 会默认使用 docker-compose.yml 文件, docker-compose.yml 文件的格式为 yaml(类似于 json,一种标记语言)。

Docker Compose 模板文件一共有三个版本: v1、v2 和 v3。目前最新的版本为 v3,也是功能最全面的一个版本,下面主要围绕 v3 版本介绍一下如何编写 Docker Compose 文件。


Docker Compose 文件主要分为三部分: services(服务)、networks(网络) 和 volumes(数据卷)。

  • services(服务):服务定义了容器启动的各项配置,就像我们执行docker run命令时传递的容器启动的参数一样,指定了容器应该如何启动,例如容器的启动参数,容器的镜像和环境变量等。
  • networks(网络):网络定义了容器的网络配置,就像我们执行docker network create命令创建网络配置一样。
  • volumes(数据卷):数据卷定义了容器的卷配置,就像我们执行docker volume create命令创建数据卷一样。

16.3.2 编写Service配置

services 下,首先需要定义服务名称,例如这个服务是 nginx 服务,可以定义 service 名称为 nginx,格式如下:

version: "3"
services:
  nginx: 

服务名称定义完毕后,还需要在服务名称的下一级定义当前服务的各项配置,使得某个服务可以按照配置正常启动,常用的 14 种 service 配置如下。


16.3.2.1 build

用于构建 Docker 镜像类似于docker build命令,build 可以指定 Dockerfile 文件路径,然后根据 Dockerfile 命令来构建文件。使用方法如下:

build:
  ## 构建执行的上下文目录
  context: .
  ## Dockerfile 名称
  dockerfile: Dockerfile-name

16.3.2.2 command

command: 用于覆盖容器默认的启动命令,它和 Dockerfile 中的 CMD 用法类似,也有两种使用方式:

command: sleep 3000
command: ["sleep", "3000"]

16.3.2.3 container_name

container_name: 用于指定容器启动时容器的名称。使用格式如下:

container_name: nginx

16.3.2.4 depends_on

depends_on: 用于指定服务间的依赖关系,这样可以先启动被依赖的服务。例如,某个服务依赖数据库服务 db,可以指定 depends_on 为 db。使用格式如下:

version: "3"
services:
  my-web:
    build: .
    depends_on:
      - db
  db:
    image: mysql

16.3.2.5 devices

devices: 挂载主机的设备到容器中。使用格式如下:

devices:
  - "/dev/sba:/dev/sda"

16.3.2.6 dns

dns: 自定义容器中的 dns 配置。

dns:
  - 8.8.8.8
  - 114.114.114.114

16.3.2.7 entrypoint

entrypoint: 覆盖容器的 entrypoint 命令。

entrypoint: sleep 3000
entrypoint: ["sleep", "3000"]

16.3.2.8 env_file

env_file: 指定容器的环境变量文件,启动时会把该文件中的环境变量值注入容器中。

env_file:
  - ./dbs.env

env 文件的内容格式如下:

KEY_ENV=values

16.3.2.9 environment

environment: 指定容器启动时的环境变量。

environment:
  - KEY_ENV=values

16.3.2.10 image

image:指定容器镜像的地址。

image: busybox:latest

16.3.2.11 pid

pid: 共享主机的进程命名空间,像在主机上直接启动进程一样,可以看到主机的进程信息。

pid: "host"

16.3.2.12 ports

ports: 暴露端口信息,使用格式为 HOST:CONTAINER,前面填写要映射到主机上的端口,后面填写对应的容器内的端口。

ports:
  - "1000"
  - "1000-1005"
  - "8080:8080"
  - "8888-8890:8888-8890"
  - "2222:22"
  - "127.0.0.1:9999:9999"
  - "127.0.0.1:3000-3005:3000-3005"
  - "6789:6789/udp"

16.3.2.13 networks

networks: 这是服务要使用的网络名称,对应顶级的 networks 中的配置。

services:
  my-service:
    networks:
     - hello-network
     - hello1-network

16.3.2.14 volumes

volumes: 不仅可以挂载主机数据卷到容器中,也可以直接挂载主机的目录到容器中,使用方式类似于使用docker run启动容器时添加 -v 参数。

version: "3"
services:
  db:
    image: mysql:5.6
    volumes:
      - type: volume
        source: /var/lib/mysql
        target: /var/lib/mysql

volumes 除了上面介绍的长语法外,还支持短语法的书写方式,例如上面的写法可以精简为:

version: "3"
services:
  db:
    image: mysql:5.6
    volumes:
      - /var/lib/mysql:/var/lib/mysql

Tips:将前面路径直接改成名称,就是docker自行创建数据卷进行挂载。


16.3.3 编写Volume配置

如果想在多个容器间共享数据卷,则需要在外部声明数据卷,然后在容器里声明使用数据卷。例如想在两个服务间共享日志目录,则使用以下配置:

version: "3"
services:
  my-service1:
    image: service:v1
    volumes:
      - type: volume
        source: logdata
        target: /var/log/mylog
  my-service2:
    image: service:v2
    volumes:
      - type: volume
        source: logdata
        target: /var/log/mylog
volumes:
  logdata: /xxx/xxx/xxx

16.3.4 编写Network配置

Docker Compose 文件顶级声明的 networks 允许你创建自定义的网络,类似于docker network create命令。

例如你想声明一个自定义 bridge 网络配置,并且在服务中使用它,使用格式如下:

version: "3"
services:
  web:
    networks:
      mybridge: 
        ipv4_address: 172.16.1.11
networks:
  mybridge:
    driver: bridge
    ipam: 
      driver: default
      config:
        subnet: 172.16.1.0/24

16.4 Docker Compose 操作命令

docker-compose 的基本使用格式如下:

docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]

其中 options 是 docker-compose 的参数,支持的参数和功能说明如下:

  -f, --file FILE             指定 docker-compose 文件,默认为 docker-compose.yml
  -p, --project-name NAME     指定项目名称,默认使用当前目录名称作为项目名称
  --verbose                   输出调试信息
  --log-level LEVEL           日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  -v, --version               输出当前版本并退出
  -H, --host HOST             指定要连接的 Docker 地址
  --tls                       启用 TLS 认证
  --tlscacert CA_PATH         TLS CA 证书路径
  --tlscert CLIENT_CERT_PATH  TLS 公钥证书问价
  --tlskey TLS_KEY_PATH       TLS 私钥证书文件
  --tlsverify                 使用 TLS 校验对端
  --skip-hostname-check       不校验主机名
  --project-directory PATH    指定工作目录,默认是 Compose 文件所在路径。

COMMAND 为 docker-compose 支持的命令。支持的命令如下:

  build              构建服务
  config             校验和查看 Compose 文件
  create             创建服务
  down               停止服务,并且删除相关资源
  events             实时监控容器的时间信息
  exec               在一个运行的容器中运行指定命令
  help               获取帮助
  images             列出镜像
  kill               杀死容器
  logs               查看容器输出
  pause              暂停容器
  port               打印容器端口所映射出的公共端口
  ps                 列出项目中的容器列表
  pull               拉取服务中的所有镜像
  push               推送服务中的所有镜像
  restart            重启服务
  rm                 删除项目中已经停止的容器
  run                在指定服务上运行一个命令
  scale              设置服务运行的容器个数
  start              启动服务
  stop               停止服务
  top                限制服务中正在运行中的进程信息
  unpause            恢复暂停的容器
  up                 创建并且启动服务
  version            打印版本信息并退出

16.5 搭建wordpress案例

编写一个 Docker Compose 模板文件,实现一键启动 WordPress 服务(一种博客系统),来搭建一个属于我们自己的博客系统。


[root@docker01 wordpress]# cat docker-compose.yml
version: '3'
services:
    mysql:
      image: mysql:5.7
      volumes:
        - mysql_data:/var/lib/mysql
      restart: always
      environment:
        MYSQL_ROOT_PASSWORD: 123456
        MYSQL_DATABASE: mywordpress
        MYSQL_USER: admin
        MYSQL_PASSWORD: 123456

    wordpress:
      depends_on:
          - mysql
      image: wordpress:php7.4
      ports:
        - "8080:80"
      restart: always
      environment:
        WORDPRESS_DB_HOST: mysql:3306
        WORDPRESS_DB_USER: admin
        WORDPRESS_DB_PASSWORD: 123456
        WORDPRESS_DB_NAME: mywordpress

volumes:
    mysql_data: {}
posted @ 2023-09-16 13:29  YinJayChen  阅读(719)  评论(0编辑  收藏  举报