文章目录

  • Compose简介
    • 概念
    • 组成
  • 安装与卸载
    • 二进制包方式安装
    • 测试
    • 卸载
  • docker-compose.yml 文件详解
    • 概念
    • 案例
    • version
    • services
      • image
      • build
      • context
      • dockerfile
      • container_name
      • depends_on
      • ports
      • expose
      • restart
      • environment
      • env_file
      • command
      • volumes
      • network_mode
      • networks
      • aliases
    • volumes
    • networks
  • Compose 常用命令
    • help
    • config
    • pull
    • up
    • logs
    • ps
    • run
    • exec
    • pause
    • unpause
    • restart
    • start
    • stop
    • kill
    • rm
    • down
    • create
    • scale
    • images
    • port
    • top
  • 总结

Compose简介

概念

Docker Compose 项目是Docker官方的开源项目,来源于之前的 Fig 项目。负责实现对 Docker 容器集群的快速编排。项目地址为:https://github.com/docker/compose/releases

它是一个定义和运行多容器的docker应用工具。使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

组成

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例。

我们知道使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务。

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。即是Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

安装与卸载

Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。

Compose 支持 Linux、macOS、Windows 10 三大平台。

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。

二进制包方式安装

在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

例如,在 Linux 64 位系统上直接下载对应的二进制包。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
# 国内用户可以使用以下方式加快下载
sudo curl -L "https://download.fastgit.org/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
# 将可执行权限应用于该二进制文件
sudo chmod +x /usr/local/bin/docker-compose

测试

docker-compose --version

卸载

如果是二进制包方式安装的,删除二进制文件即可。

sudo rm /usr/local/bin/docker-compose

docker-compose.yml 文件详解

概念

官方文档:https://docs.docker.com/compose/compose-file/

Docker Compose 允许用户通过 docker-compose.yml 文件(YAML 格式)来定义一组相关联的容器为一个工程(project)。一个工程包含多个服务(service),每个服务中定义了创建容器时所需的镜像、参数、依赖等。

工程名若无特殊指定,即为 docker-compose.yml 文件所在目录的名称。

Docker Compose 模板文件我们需要关注的顶级配置有 versionservicesnetworksvolumes 几个部分,除 version 外,其他几个顶级配置下还有很多下级配置,后面也会详细给大家介绍,先来看看这几个顶级配置都什么意思:

  • version:描述 Compose 文件的版本信息,当前最新版本为 3.8,对应的 Docker 版本为 19.03.0+
  • services:定义服务,可以多个,每个服务中定义了创建容器时所需的镜像、参数、依赖等;
  • networkds:定义网络,可以多个,根据 DNS server 让相同网络中的容器可以直接通过容器名称进行通信;
  • volumes:数据卷,用于实现目录挂载。

案例

在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启容器,非常适合多个容器组合使用进行开发的场景。我们先从一个简单的 Compose 案例学起。

编写 docker-compose.yml 文件。

# 创建目录
mkdir -p /usr/local/docker-nginx
# 切换至指定目录
cd /usr/local/docker-nginx/
# 编写 docker-compose.yml 文件
vi docker-compose.yml

在文件中添加以下内容:

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:nginx: # 服务名称image: nginx # 创建容器时所需的镜像container_name: mynginx # 容器名称,默认为"工程名称_服务条目名称_序号"ports: # 宿主机与容器的端口映射关系- "80:80" # 左边宿主机端口:右边容器端口networks: # 配置容器连接的网络,引用顶级 networks 下的条目- nginx-net# 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
networks:nginx-net: # 一个具体网络的条目名称name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"driver: bridge # 网络模式,默认为 bridge

使用 docker-compose up 创建并启动所有服务。这个简单的案例中就只有一个 Nginx 后续我们会来一些复杂的练习:

# 前台启动
docker-compose up
# 后台启动
docker-compose up -d

浏览器访问自己服务器的ip地址:http://192.168.138.8/ 结果如下:

使用 docker-compose down 可以停止并删除容器、网络。

version

描述 Compose 文件的版本信息,当前最新版本为 3.8,对应的 Docker 版本为 19.03.0+。关于每个版本的详细信息请参考:https://docs.docker.com/compose/compose-file/compose-versioning/

以下为 Compose 文件的版本信息所对应的 Docker 版本。

Compose file format Docker Engine release
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

services

刚才我们提到 docker-compose.yml 文件中包含很多下级配置项,下面带大家把一些常用的配置项详细了解一下,先从顶级配置 services 开始。

services 用来定义服务,可以多个,每个服务中定义了创建容器时所需的镜像、参数、依赖等,就像将命令行参数传递给 docker run 一样。同样,网络和数据卷的定义也是一样的。

比如,之前我们通过 docker run 命令构建一个 MySQL 应用容器的命令如下:

docker run -d --name mysql8 -p 3306:3306 -v /opt/data/docker_mysql/conf:/etc/mysql/conf.d -v /opt/data/docker_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:8

使用 docker-compose.yml 以后则可以这样定义:

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:mysql: # 服务名称image: mysql:8 # 创建容器时所需的镜像container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"ports: # 宿主机与容器的端口映射关系- "3306:3306" # 左边宿主机端口:右边容器端口environment: # 创建容器时所需的环境变量MYSQL_ROOT_PASSWORD: rootvolumes:- "/opt/data/docker_mysql/conf:/etc/mysql/conf.d"- "/opt/data/docker_mysql/data:/var/lib/mysql"

然后通过 dokcer-compose 相关命令即可完成容器的创建,停止或删除等一系列操作。

image

指定创建容器时所需的镜像名称标签或者镜像 ID。如果镜像在本地不存在,会去远程拉取。

services:web:image: hello-world

build

除了可以基于指定的镜像构建容器,还可以基于 Dockerfile 文件构建,在使用 up 命令时会执行构建任务。

通过 build 配置项可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用 Dockerfile 自动构建镜像,然后使用镜像启动服务容器。

build 配置项可以使用绝对路径,也可以使用相对路径。

# 绝对路径,在该路径下基于名称为 Dockerfile 的文件构建镜像
/usr/local/docker-centos
# 相对路径,相对当前 docker-compose.yml 文件所在目录,基于名称为 Dockerfile 的文件构建镜像
.

接下来我们来个稍微复杂点的练习,通过基础镜像 centos:7,在该镜像中安装 jdk 和 tomcat 以后将其制作为一个新的镜像 mycentos:7

创建目录并编写 Dockerfile 文件。

# 创建目录
mkdir -p /usr/local/docker-centos
# 切换至指定目录
cd /usr/local/docker-centos/
# 编写 Dockerfile 文件
vi Dockerfile

Dockerfile 文件内容如下:

# 指明构建的新镜像是来自于 centos:7 基础镜像
FROM centos:7
# 通过镜像标签声明了作者信息
LABEL maintainer="jourwon.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 日志信息
CMD ["/usr/local/tomcat/apache-tomcat-9.0.37/bin/catalina.sh", "run"]

将所需的资源包 jdktomcat 上传至 Dockerfile 同一目录。

创建目录并编写 docker-compose.yml 文件。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:mycentos: # 服务名称build: . # 相对当前 docker-compose.yml 文件所在目录,基于名称为 Dockerfile-alternate 的文件构建镜像container_name: mycentos7 # 容器名称,默认为"工程名称_服务条目名称_序号"ports: # 宿主机与容器的端口映射关系- "8080:8080" # 左边宿主机端口:右边容器端口

然后通过 dokcer-compose 相关命令即可完成容器的创建,停止或删除等一系列操作。

context

该选项可以是 Dockerfile 文件的绝对/相对路径,也可以是远程 Git 仓库的 URL,当提供的值是相对路径时,相对当前 docker-compose.yml 文件所在目录。

build:context: . # 相对当前 docker-compose.yml 文件所在目录,基于名称为 Dockerfile 的文件构建镜像

dockerfile

一般情况下,默认都基于文件名叫 Dockerfile 的文件构建镜像,当然也可以是自定义的文件名,使用 dockerfile 声明,不过这个选项只能声明文件名,文件所在路径还是要通过 centext 来声明。

build:context: . # 相对当前 docker-compose.yml 文件所在目录dockerfile: Dockerfile-alternate # 基于名称为 Dockerfile-alternate 的文件构建镜像

container_name

Compose 创建的容器默认生成的名称格式为:工程名称_服务条目名称_序号。如果要使用自定义名称,使用 container_name 声明。

services:mycentos:build: .container_name: mycentos7 # 容器名称,默认为"工程名称_服务条目名称_序号"

因为 Docker 容器名称必须是唯一的,所以如果指定了自定义名称,就不能将服务扩展至多个容器。这样做可能会导致错误。

关于序号

序号是干什么用的呢,看下面这个例子你就懂了,docker-compose.yml 文件内容如下:

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:helloworld: # 服务名称image: hello-world

然后通过 --scale 指定 helloworld 服务一次性启动 3 个。

docker-compose up -d --scale helloworld=3

通过下图可以看到有 3 个容器被创建,容器名称最后的序号是从 1 开始累加的,这就是序号的作用。所以如果指定了自定义名称,就不能将服务扩展至多个容器。

depends_on

使用 Compose 最大的好处就是敲最少的命令做更多的事情,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没有启动数据库容器的情况下启动了 Web 应用容器,应用容器会因为找不到数据库而退出。depends_on 就是用来解决容器依赖、启动先后问题的配置项。

version: "3.8"
services:web:build: .depends_on:- db- redisredis:image: redisdb:image: mysql

上述 YAML 文件定义的容器会先启动 db 和 redis 两个服务,最后才启动 web 服务。

ports

容器对外暴露的端口,格式:左边宿主机端口:右边容器端口

ports:- "80:80"- "8080:8080"

expose

容器暴露的端口不映射到宿主机,只允许能被连接的服务访问。

expose:- "80"- "8080"

restart

容器重启策略,简单的理解就是 Docker 重启以后容器要不要一起启动:

  • no:默认的重启策略,在任何情况下都不会重启容器;
  • on-failure:容器非正常退出时,比如退出状态为非0(异常退出),才会重启容器;
  • always:容器总是重新启动,即使容器被手动停止了,当 Docker 重启时容器也还是会一起启动;
  • unless-stopped:容器总是重新启动,除非容器被停止(手动或其他方式),那么 Docker 重启时容器则不会启动。
services:nginx:image: nginxcontainer_name: mynginxports:- "80:80"restart: always

environment

添加环境变量。可以使用数组也可以使用字典。布尔相关的值(true、false、yes、no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为真或假。

environment:RACK_ENV: developmentSHOW: 'true'SESSION_SECRET:

或者以下格式:

environment:- RACK_ENV=development- SHOW=true- SESSION_SECRET

env_file

从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。

env_file:- /opt/runtime_opts.env # 绝对路径- ./common.env # 相对路径,相对当前 docker-compose.yml 文件所在目录- ./apps/web.env # 相对路径,相对当前 docker-compose.yml 文件所在目录

注意:env 文件中的每一行需采用 键=值 格式。以 # 开头的行会被视为注释并被忽略。空行也会被忽略。

command

覆盖容器启动后默认执行的命令。

command: echo "helloworld"

该命令也可以是一个列表。

command: ["echo", "helloworld"]

volumes

数据卷,用于实现目录挂载,支持指定目录挂载匿名挂载具名挂载

  • 指定目录挂载的格式为:左边宿主机目录:右边容器目录,或者左边宿主机目录:右边容器目录:读写权限
  • 匿名挂载格式为:容器目录即可,或者容器目录即可:读写权限
  • 具名挂载格式为:数据卷条目名称:容器目录,或者数据卷条目名称:容器目录:读写权限
# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:mysql: # 服务名称image: mysql:8 # 创建容器时所需的镜像container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"ports: # 宿主机与容器的端口映射关系- "3306:3306" # 左边宿主机端口:右边容器端口environment: # 创建容器时所需的环境变量MYSQL_ROOT_PASSWORD: rootvolumes:# 绝对路径- "/opt/data/docker_mysql/data:/var/lib/mysql"# 相对路径,相对当前 docker-compose.yml 文件所在目录- “./conf:/etc/mysql/conf.d“# 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume 中生成- "/var/lib/mysql"# 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成- "mysql-data-volume:/var/lib/mysql"# 定义数据卷,可以多个
volumes:mysql-data-volume: # 一个具体数据卷的条目名称name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"

network_mode

设置网络模式,类似 docker run 时添加的参数 --net host 或者 --network host 的用法。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

配置容器连接的网络,引用顶级 networks 下的条目。

# 定义服务,可以多个
services:nginx: # 服务名称networks: # 配置容器连接的网络,引用顶级 networks 下的条目- nginx-net # 一个具体网络的条目名称# 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
networks:nginx-net: # 一个具体网络的条目名称name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"driver: bridge # 网络模式,默认为 bridge

aliases

网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。

# 定义服务,可以多个
services:nginx: # 服务名称networks: # 配置容器连接的网络,引用顶级 networks 下的条目nginx-net: # 一个具体网络的条目名称aliases: # 服务别名,可以多个- nginx1 # 同一网络上的其他容器可以使用服务名或此别名连接到服务容器# 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
networks:nginx-net: # 一个具体网络的条目名称name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"driver: bridge # 网络模式,默认为 bridge

volumes

通过顶级配置 services 的学习,大家应该已经明白顶级配置 volumes 是干嘛的了,这里再详细把配置的不同方式讲解一下。

以下方式的数据卷声明创建卷时会使用默认的名称:"工程名称_数据卷条目名称"

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:mysql:image: mysql:8container_name: mysql8ports:- "3306:3306"environmentMYSQL_ROOT_PASSWORD: rootvolumes:# 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成- "mysql-data-volume:/var/lib/mysql"# 定义数据卷,可以多个
volumes:mysql-data-volume: # 一个具体数据卷的条目名称

以下方式的数据卷声明创建卷时会使用自定义的名称。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:mysql:image: mysql:8container_name: mysql8ports:- "3306:3306"environmentMYSQL_ROOT_PASSWORD: rootvolumes:# 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成- "mysql-data-volume:/var/lib/mysql"# 定义数据卷,可以多个
volumes:mysql-data-volume: # 一个具体数据卷的条目名称name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"

networks

通过顶级配置 services 的讲解,大家其实已经明白顶级配置 networks 是干嘛的了,这里再详细把配置的不同方式讲解一下。

如果不声明网络,每个工程默认会创建一个网络名称为"工程名称_default"bridge 网络。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:nginx:image: nginxcontainer_name: mynginxports:- "80:80"# 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
#networks:

以下方式的网络声明创建网络时会使用默认的名称:"工程名称_网络条目名称",网络模式默认为 bridge

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:nginx:image: nginxcontainer_name: mynginxports:- "80:80"networks: # 配置容器连接的网络,引用顶级 networks 下的条目nginx-net:# 定义网络,可以多个
networks:nginx-net: # 一个具体网络的条目名称

以下方式的网络声明创建网络时会使用自定义的名称,还可以通过 driver 选择网络模式,默认为 bridge

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:nginx:image: nginxcontainer_name: mynginxports:- "80:80"networks: # 配置容器连接的网络,引用顶级 networks 下的条目nginx-net:# 定义网络,可以多个
networks:nginx-net: # 一个具体网络的条目名称name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"driver: bridge # 网络模式,默认为 bridge

Compose 常用命令

官方文档:https://docs.docker.com/compose/reference/overview/

为了更熟练的使用 Compose,以下常用命令大家多多练习,方可熟能生巧。

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

部分命令选项如下:

  • -f,--file:指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml;
  • -p, --project-name:指定工程名称,默认使用 docker-compose.yml 文件所在目录的名称;
  • -v:打印版本并退出;
  • --log-level:定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)。

help

docker-compose -help 查看帮助。

[root@localhost ~]# docker-compose -help
Define and run multi-container applications with Docker.Usage:docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]docker-compose -h|--helpOptions:-f, --file FILE             Specify an alternate compose file(default: docker-compose.yml)-p, --project-name NAME     Specify an alternate project name(default: directory name)-c, --context NAME          Specify a context name--verbose                   Show more output--log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)--no-ansi                   Do not print ANSI control characters-v, --version               Print version and exit-H, --host HOST             Daemon socket to connect to--tls                       Use TLS; implied by --tlsverify--tlscacert CA_PATH         Trust certs signed only by this CA--tlscert CLIENT_CERT_PATH  Path to TLS certificate file--tlskey TLS_KEY_PATH       Path to TLS key file--tlsverify                 Use TLS and verify the remote--skip-hostname-check       Don't check the daemon's hostname against thename specified in the client certificate--project-directory PATH    Specify an alternate working directory(default: the path of the Compose file)--compatibility             If set, Compose will attempt to convert keysin v3 files to their non-Swarm equivalent--env-file PATH             Specify an alternate environment fileCommands:build              Build or rebuild servicesconfig             Validate and view the Compose filecreate             Create servicesdown               Stop and remove containers, networks, images, and volumesevents             Receive real time events from containersexec               Execute a command in a running containerhelp               Get help on a commandimages             List imageskill               Kill containerslogs               View output from containerspause              Pause servicesport               Print the public port for a port bindingps                 List containerspull               Pull service imagespush               Push service imagesrestart            Restart servicesrm                 Remove stopped containersrun                Run a one-off commandscale              Set number of containers for a servicestart              Start servicesstop               Stop servicestop                Display the running processesunpause            Unpause servicesup                 Create and start containersversion            Show the Docker-Compose version information

config

docker-compose config -q 验证 docker-compose.yml 文件。当配置正确时,不输出任何内容,当配置错误时,输出错误信息。

pull

docker-compose pull 拉取服务依赖的镜像。

# 拉取工程中所有服务依赖的镜像
docker-compose pull
# 拉取工程中 nginx 服务依赖的镜像
docker-compose pull nginx
# 拉取镜像过程中不打印拉取进度信息
docker-compose pull -q

up

docker-compose up 创建并启动所有服务的容器。指定多个 yml 加 -f 选项。以守护进程模式运行加 -d 选项。

# 前台启动
docker-compose up
# 后台启动
docker-compose up -d
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
docker-compose -f docker-compose.yml up -d

logs

docker-compose logs 查看服务容器的输出日志。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color

ps

docker-compose ps 列出工程中所有服务的容器。

# 列出工程中所有服务的容器
docker-compose ps
# 列出工程中指定服务的容器
docker-compose ps nginx

run

docker-compose run 在指定服务容器上执行一个命令。

# 在工程中指定服务的容器上执行 echo "helloworld"
docker-compose run nginx echo "helloworld"

exec

docker-compose exec 进入服务容器。

# 进入工程中指定服务的容器
docker-compose exec nginx bash
# 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
docker-compose exec --index=1 nginx bash

pause

docker-compose pause 暂停服务容器。

# 暂停工程中所有服务的容器
docker-compose pause
# 暂停工程中指定服务的容器
docker-compose pause nginx

unpause

docker-compose unpause 恢复服务容器。

# 恢复工程中所有服务的容器
docker-compose unpause
# 恢复工程中指定服务的容器
docker-compose unpause nginx

restart

docker-compose restart 重启服务容器。

# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务的容器
docker-compose restart nginx

start

docker-compose start 启动服务容器。

# 启动工程中所有服务的容器
docker-compose start
# 启动工程中指定服务的容器
docker-compose start nginx

stop

docker-compose stop 停止服务容器。

# 停止工程中所有服务的容器
docker-compose stop
# 停止工程中指定服务的容器
docker-compose stop nginx

kill

docker-compose kill 通过发送 SIGKILL 信号停止指定服务的容器。

# 通过发送 SIGKILL 信号停止工程中指定服务的容器
docker-compose kill nginx

rm

docker-compose rm 删除服务(停止状态)容器。

# 删除所有(停止状态)服务的容器
docker-compose rm
# 先停止所有服务的容器,再删除所有服务的容器
docker-compose rm -s
# 不询问是否删除,直接删除
docker-compose rm -f
# 删除服务容器挂载的数据卷
docker-compose rm -v
# 删除工程中指定服务的容器
docker-compose rm -sv nginx

down

停止并删除所有服务的容器、网络、镜像、数据卷。

# 停止并删除工程中所有服务的容器、网络
docker-compose stop
# 停止并删除工程中所有服务的容器、网络、镜像
docker-compose down --rmi all
# 停止并删除工程中所有服务的容器、网络、数据卷
docker-compose down -v

create

docker-compose create 为服务创建容器,已不推荐使用。推荐使用 docker-compose up 来实现该功能。

scale

docker-compose scale 设置指定服务运行的容器个数,已不推荐使用。

推荐使用 --scale service=num 的参数来设置数量。

# 通过 --scale 指定 helloworld 服务一次性启动 3 个
docker-compose up -d --scale helloworld=3

images

docker-compose images 打印服务容器所对应的镜像。

# 打印所有服务的容器所对应的镜像
docker-compose images
# 打印指定服务的容器所对应的镜像
docker-compose images nginx

port

docker-compose port 打印指定服务容器的某个端口所映射的宿主机端口。

[root@localhost docker-nginx]# docker-compose port nginx 80
0.0.0.0:80

top

docker-compose top 显示正在运行的进程。

# 显示工程中所有服务的容器正在运行的进程
docker-compose top
# 显示工程中指定服务的容器正在运行的进程
docker-compose top nginx

总结

Docker Compose 的整体使用步骤还是比较简单的,三个步骤为:

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

虽然 docker-compose.yml 文件详解Compose 常用命令这两大块的内容比较多,但是如果要快速入门使用 Compose,其实只需要了解其中部分内容即可。后期大家可在项目生产环境中根据自身情况再进一步深入学习即可。

Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Compose相关推荐

  1. Docker 从入门到实践系列三 - Docker 常用命令,java高级开发工程师面试问题

    容器命令 镜像运行起来后,称为容器. 下面以 Tomcat 为例 搜索镜像 docker search tomcat 下载镜像 docker pull tomcat 运行容器 运行tomcat doc ...

  2. Docker 从入门到实践系列一 - 什么是Docker

    文章目录 虚拟机和容器 虚拟机和容器的区别 什么是 Docker Docker 的优点 Docker 的应用场景 Docker 核心概念 docker 镜像(image) docker 容器(cont ...

  3. Docker 从入门到实践系列五 - Dockerfile文件

    文章目录 什么是DockerFile文件 DockerFile基本结构 DockerFile指令详解 1. FROM 2. MAINTAINER 3. RUN 4. CMD 5. COPY 6. EN ...

  4. 【Docker技术入门与实践(第2版)】Docker入门_学习笔记

    第一章 1 Docker入门须知 1.1 Docker基本知识 Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发 起者是dotCloud公司.Docker自开源后受到广泛的关 ...

  5. Docker从入门到实践

    一般说来 SPA 的项目我们只要启一个静态文件 Server 就可以了,但是针对传统项目就不一样了,一个项目会依赖很多服务端程序.之前我们的开发模式是在一台开发机上部署开发环境,所有人都在这台开发机上 ...

  6. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  7. Docker从入门到实战(四)

    一步一步走,写小白都能看懂的文章,将持续更新中,敬请期待! Docker从入门到实战(四) Docker基础 一:Docker基本操作 一般情况安装Docker之后系统会自动创建一个Docker的用户 ...

  8. 大模型落地实践系列四、大模型研发应用的节奏?

    大模型落地实践系列四.大模型研发应用的节奏? 近年来,随着计算机硬件性能的提高和机器学习算法的不断优化,大模型已经成为了当今人工智能领域最热门的话题之一.在实际应用中,大模型可以帮助我们更好地完成诸如 ...

  9. 安装容器编排工具 Docker Compose

    安装容器编排工具 Docker Compose  curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/doc ...

最新文章

  1. ICML 2020: 从Alignment 和 Uniformity的角度理解对比表征学习
  2. 网络营销专员浅析在网络营销推广中有不少渠道可适当“利用”一下
  3. vc采集网页内frame框架下所有元素(不指定具体table/form)
  4. Solaris ALOM1.6 SC Password Reset
  5. CSS图片廊实例详解
  6. uva 11991 (map vector 嵌套)
  7. 【转】The password supplied with the username Domain\UserName was not correct. AD密码定期更换
  8. 2008 年 十大预测的总结 (只对了一半左右)
  9. 笨办法学 Python · 续 练习 13:单链表
  10. SQL 2019——新特征
  11. 【网络安全工程师面试合集】—不要随便浏览一些奇怪的小网站哦
  12. python电脑下载安装-python
  13. mybatis连接池
  14. vos3000怎样使用 IVR 语音流程跟踪分析
  15. 学习官方SSIS教程的错误总结
  16. nonebot2插件之主持飞花令
  17. 怎样使用css动画animation实现静态箭头图片上下摆动
  18. MIPS单周期CPU
  19. 显示器ntsc测试软件,显示器色域检测图拉丁版
  20. PayPal 今天 Reopen?

热门文章

  1. 使用Fetch请求,如何下载二进制流格式的文件
  2. Ubuntu下移动与重命名文件
  3. 立方体html与js特效,分别使用HTML和SVG实现的等角立方体
  4. 抖音账号矩阵系统/抖音seo霸屏系统/抖音矩阵seo系统源码/独立部署
  5. 视频消息沟通,我的工作总是快人一步,感谢帧想
  6. ab压力 failed_ab压力测试的安装、使用、破2万并发测试
  7. JDBC_刘锋的博客
  8. mysql函数更新字段随机数
  9. 南京邮电大学通达学院编译原理2022年1月期末试卷考试回忆
  10. fully qualified name