Docker 容器编排利器 Docker Compose

文章目录

    • 一、Docker Compose 简介
    • 二、Docker Compose 安装
      • 2.1 Mac、Windows 平台默认支持
      • 2.2 Linux 安装(通过包管理)
        • 2.2.1 安装
        • 2.2.2 测试
        • 2.2.3 卸载
      • 2.3 使用PIP 安装与卸载
        • 2.3.1 PIP安装
        • 2.3.2 PIP 卸载
    • 三、基本使用
      • 3.1 术语
      • 3.2 部署Flask 应用
    • 四、Compose 常用命令
      • 4.1 命令对象与格式
      • 4.2 docker-compose 常用命令
        • 4.2.1 config
        • 4.2.2 pull
        • 4.2.3 up
        • 4.2.4 logs
        • 4.2.5 ps
        • 4.2.6 run
        • 4.2.7 exec
        • 4.2.8 pause
        • 4.2.9 unpause
        • 4.2.10 restart
        • 4.2.11 start
        • 4.2.12 stop
        • 4.2.13 kill
        • 4.2.14 rm
        • 4.2.15 down
        • 4.2.16 images
        • 4.2.17 port
        • 4.2.18 top
    • 五、docker-compose.yml 文件详解
      • 5.1 概念
      • 5.2 案例
      • 5.3 version
      • 5.4 services
        • 5.4.1 services 简单举例
        • 5.4.2 image
        • 5.4.3 build
          • (一). context
          • (二). dockerfile
        • 5.4.4 container_name
          • 关于序号
        • 5.4.5 depends_on
        • 5.4.6 ports
        • 5.4.7 expose
        • 5.4.8 restart
        • 5.4.9 environment
        • 5.4.10 env_file
        • 5.4.11 command
        • 5.4.12 volumes
        • 5.4.13 network_mode
        • 5.4.14 networks
          • aliases
      • 5.5 volumes
      • 5.6 networks
    • 六、小结

一、Docker Compose 简介

Docker Compose 项目是 Docker 官方的开源项目,Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,来源于之前的 Fig 项目,使用 Python 语言编写。负责实现对 Docker 容器集群的快速编排。项目地址为:https://github.com/docker/compose/releases

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

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

Docker Compose 恰好满足了这样的需求,它是用于定义和运行多容器 Docker 应用程序的工具。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。然后使用一个命令,就可以通过 YAML 配置文件创建并启动所有服务。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Docker Compose 使用的三个步骤为:

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

二、Docker Compose 安装

官方文档:https://docs.docker.com/compose/install/linux/

2.1 Mac、Windows 平台默认支持

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

$ docker-compose --version
Docker Compose version v2.23.3-desktop.2

2.2 Linux 安装(通过包管理)

2.2.1 安装

运行以下命令以下载Docker Compose的当前稳定版本:

# 乌班图 安装
sudo apt-get install docker-compose-plugin -y
# Centos 安装
sudo yum install docker-compose-plugin -y 
2.2.2 测试
docker compose version
2.2.3 卸载

如果您需要卸载 Docker Compose,可以使用以下命令:

在 Ubuntu 上:

sudo apt-get remove docker-compose-plugin -y

在 CentOS 上:

sudo yum remove docker-compose-plugin -y

2.3 使用PIP 安装与卸载

2.3.1 PIP安装

这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装。

首先,确保你的系统已经安装了Python和pip。你可以在终端中运行以下命令来检查它们是否已经安装:

python --version
pip --version

如果这些命令返回版本信息,则说明Python和pip已经安装。如果没有安装,请根据你使用的操作系统安装Python和pip。

没有安装的话请参考教程:Linux系统安装python3.8与卸载教程

接下来,使用pip安装docker-compose。在终端中运行以下命令:

$ sudo pip install -U docker-compose
2.3.2 PIP 卸载

如果是通过 pip 安装的,则执行如下命令即可删除。

$ sudo pip uninstall docker-compose

三、基本使用

3.1 术语

首先介绍几个术语。

  • 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。

3.2 部署Flask 应用

下面我们部署一个web 网站,该项目应该包含 web 应用和缓存。

我们用Flask 框架构建一个能够记录页面访问次数的 web 网站。

首先,创建一个简单的 Flask 应用。创建一个新目录 flask-app,并在其中创建一个名为 app.py 的文件:

# flask-app/app.py
from flask import Flask
from redis import Redisapp = Flask(__name__)
redis = Redis(host='redis', port=6379)@app.route('/')
def hello():visits = redis.incr('counter')return 'Hello World! I have been seen {} times.\n'.format(visits)if __name__ == "__main__":app.run(host="0.0.0.0", debug=True)

接着,编写 Dockerfile 文件,内容为:

FROM python:3.12-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。

version: '3.0'
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

这个 docker-compose.yml 文件定义了两个服务:webredisweb 服务使用当前目录下的 Dockerfile 构建,并将容器内的端口 5000 绑定到宿主机的端口 5000。web 服务依赖于 redis 服务。

flask-app 目录中,运行以下命令来启动应用:

docker compose up --build

这个命令会构建 Flask 应用的 Docker 镜像,启动 Redis 容器,然后启动 Flask 应用容器。看到终端输出如下,说明容器启动起来了。

现在,您可以通过浏览器访问 http://localhost:5000 来查看您的 Flask 应用,并且每次刷新页面都会看到访问次数的增加。

或者终端使用 curl 命令访问本地运行的 Flask 应用

curl http://localhost:5000

如图,此时访问本地 5000 端口,每次刷新页面,计数就会加 1。

四、Compose 常用命令

4.1 命令对象与格式

docker 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)。

我们通过终端输入命令docker compose可以查看到所有命令和选项:

用法:  docker compose [选项] 命令使用 Docker 定义和运行多容器应用程序选项:--ansi string                控制何时打印 ANSI 控制字符 ("never"|"always"|"auto")(默认 "auto"--compatibility              以向后兼容模式运行 Compose--dry-run                    以干运行模式执行命令--env-file stringArray       指定一个替代的环境文件-f, --file stringArray           指定 Compose 配置文件--parallel int               控制最大并行性,-1 为无限制 (默认 -1)--profile stringArray         指定要启用的配置文件--progress string             设置进度输出的类型 (auto, tty, plain, quiet) (默认 "auto")--project-directory string   指定一个替代的工作目录(默认:第一个指定的 Compose 文件的路径)-p, --project-name string        项目名称命令:attach      将本地标准输入、输出和错误流附加到服务的运行容器上build       构建或重建服务config      解析、解析并呈现 Compose 文件的规范格式cp          在服务容器和本地文件系统之间复制文件/文件夹create      为服务创建容器down        停止并删除容器和网络events      从容器接收实时事件exec        在运行中的容器内执行命令images      列出由创建的容器使用的镜像kill        强制停止服务容器logs        查看容器的输出ls          列出运行中的 Compose 项目pause      暂停服务port        打印端口的公共端口绑定ps          列出容器pull        拉取服务镜像push        推送服务镜像restart     重启服务容器rm          删除已停止的服务容器run         对服务运行一次性命令scale       设置服务运行的容器数量start       启动服务stats       显示容器的实时资源使用统计信息stop        停止服务top         显示正在运行的进程unpause     恢复暂停的服务up          创建并启动容器version     显示 Docker Compose 版本信息wait        阻塞直到第一个服务容器停止watch       监视服务的构建上下文,并在文件更新时重建/刷新容器运行 'docker compose 命令 --help' 以获取有关一个命令的更多信息。

4.2 docker-compose 常用命令

4.2.1 config
  • docker compose config -q 验证 docker-compose.yml 文件。当配置正确时,不输出任何内容,当配置错误时,输出错误信息。
4.2.2 pull
  • docker compose pull 拉取服务依赖的镜像。
# 拉取工程中所有服务依赖的镜像
docker compose pull
# 拉取工程中 redis 服务依赖的镜像
docker compose pull redis
# 拉取镜像过程中不打印拉取进度信息
docker compose pull -q
4.2.3 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 
4.2.4 logs

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

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

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

# 列出工程中所有服务的容器
docker compose ps
# 列出工程中指定服务的容器
docker compose ps redis
4.2.6 run

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

# 在工程中指定服务的容器上执行 echo "hello"
docker compose run redis echo "hello"
4.2.7 exec

docker compose exec 进入服务容器。

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

docker compose pause 暂停服务容器。

# 暂停工程中所有服务的容器
docker compose pause
# 暂停工程中指定服务的容器
docker compose pause redis
4.2.9 unpause

docker compose unpause 恢复服务容器。

# 恢复工程中所有服务的容器
docker compose unpause
# 恢复工程中指定服务的容器
docker compose unpause redis
4.2.10 restart

docker compose restart 重启服务容器。

# 重启工程中所有服务的容器
docker compose restart
# 重启工程中指定服务的容器
docker compose restart redis
4.2.11 start

docker compose start 启动服务容器。

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

docker compose stop 停止服务容器。

# 停止工程中所有服务的容器
docker compose stop
# 停止工程中指定服务的容器
docker compose stop redis
4.2.13 kill

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

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

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

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

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

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

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

# 打印所有服务的容器所对应的镜像
docker compose images
# 打印指定服务的容器所对应的镜像
docker compose images redis
4.2.17 port

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

[root@VM-16-centos flask-app]# docker compose port nginx 80
0.0.0.0:80
4.2.18 top

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

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

五、docker-compose.yml 文件详解

5.1 概念

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:数据卷,用于实现目录挂载。

5.2 案例

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

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

在文件 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 创建并启动所有服务。

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

浏览器访问:http://localhost/结果如下:

https://mrhelloworld.com/resources/articles/docker/image-20200904182520177.png

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

https://mrhelloworld.com/resources/articles/docker/image-20200905151142759.png

5.3 version

  • version是Docker Compose文件的一个主要组成部分,用于指定当前Docker Compose文件的版本。

version字段通常在文件的顶部进行定义,如下所示:

version: "3.8"

在这个例子中,version被设置为'3.8',这意味着这个Docker Compose文件使用的是3.8版本的语法和功能。

重要的是要注意不同版本的Docker Compose之间可能存在不兼容性。因此,在升级或更改您的docker-compose.yaml文件时,请确保查看有关版本的特定说明和变更日志,以便了解您当前所使用版本的支持的功能和变更情况。

官网提供的链接比较老了,且compose版本和其version字段不相同,对应起来比较麻烦(二者的对应关系可以参考链接)

5.4 services

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

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

5.4.1 services 简单举例

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

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

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

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

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

5.4.2 image

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

services:web:image: mysql:8
5.4.3 build

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

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

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

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

接下来我们来个稍微复杂点的练习,首先我们使用Go编写一个HTTP Server:

创建一个目录:

# 创建目录
mkdir -p /usr/local/docker-centos
# 切换至指定目录
cd /usr/local/docker-centos/
mkdir ./httpserver

编写main.go内容如下:

package mainimport ("fmt""net/http"
)func main() {http.HandleFunc("/", rootHandler)http.HandleFunc("/ping", pingHandler)fmt.Println("Server started at http://localhost:8080")http.ListenAndServe(":8080", nil)
}func rootHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "哈喽,Go!")
}func pingHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "pong")
}

接着通过基础镜像 centos:8,在该镜像中安装 go 和 并且运行HTTP Server以后将其制作为一个新的镜像 mycentos:8。编写 Dockerfile 文件。

# 编写 Dockerfile 文件
vi Dockerfile

Dockerfile 文件内容如下:

# 指明构建的新镜像是来自于 centos:8 基础镜像
FROM centos:8# 通过镜像标签声明了作者信息
LABEL maintainer="blog.jarvis.com"# 设置工作目录
WORKDIR /usr/local# 拷贝 Go 语言压缩包并解压到指定目录
ADD go1.22.1.linux-amd64.tar.gz /usr/local/# 设置 Go 环境变量
ENV GOROOT=/usr/local/go
ENV GOPATH=/usr/local/gopath
ENV PATH=$PATH:$GOROOT/bin:$GOPATH/bin# 将 httpserver 代码拷贝到容器中
COPY ./httpserver /usr/local/httpserver# 设置工作目录到 httpserver 目录
WORKDIR /usr/local/httpserver# 编译 Go HTTP 服务器
RUN go build -o httpserver main.go# 暴露容器运行时的 8080 监听端口给外部
EXPOSE 8080# 使用 CMD 运行 HTTP 服务器
CMD ["./httpserver"]

接着通过如下命令下载Go 编译器:

# 下载GO 编译器
wget https://golang.google.cn/dl/go1.22.1.linux-amd64.tar.gz

创建目录并编写 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 的文件构建镜像
5.4.4 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 开始累加的,这就是序号的作用。所以如果指定了自定义名称,就不能将服务扩展至多个容器。

5.4.5 depends_on

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

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

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

5.4.6 ports

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

ports:- "80:80"- "8080:8080"
5.4.7 expose

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

expose:- "80"- "8080"
5.4.8 restart

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

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

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

environment:RACK_ENV: developmentSHOW: 'true'SESSION_SECRET:

或者以下格式:

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

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

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

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

5.4.11 command

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

command: echo "helloworld"

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

command: ["echo", "helloworld"]
5.4.12 volumes

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

  • 指定目录挂载的格式为:左边宿主机目录:右边容器目录,或者左边宿主机目录:右边容器目录:读写权限
  • 匿名挂载格式为:容器目录即可,或者容器目录即可:读写权限
  • 具名挂载格式为:数据卷条目名称:容器目录,或者数据卷条目名称:容器目录:读写权限
# 描述 Compose 文件的版本信息
version: "3.8"# 定义服务,可以多个
services:mysql: # 服务名称image: mysql:8 # 创建容器时所需的镜像container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"ports: # 宿主机与容器的端口映射关系- "3306:3306" # 左边宿主机端口:右边容器端口environment: # 创建容器时所需的环境变量MYSQL_ROOT_PASSWORD: 1234volumes:# 绝对路径- "/mydata/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 # 数据卷名称,默认为"工程名称_数据卷条目名称"
5.4.13 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]"
5.4.14 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

5.5 volumes

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

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

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

5.6 networks

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

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

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

https://mrhelloworld.com/resources/articles/docker/image-20200907170121843.png

以下方式的网络声明创建网络时会使用默认的名称:"工程名称_网络条目名称",网络模式默认为 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

六、小结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——LightGBM算法

机器学习——LightGBM算法 摘要&#xff1a; LightGBM是一种高效的梯度提升框架&#xff0c;它在处理大规模数据时表现出色&#xff0c;并且具有较快的训练速度和较低的内存消耗。本文将介绍LightGBM算法的原理、特点以及与传统GBDT算法的区别&#xff0c;并使用Python对其进行…

什么样的人适合学习网络安全?怎么学?_

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a;什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 会产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级学科&#xff0c;…

用html写一个贪吃蛇游戏

<!DOCTYPE html> <html> <head><title>贪吃蛇</title><meta charset"UTF-8"><meta name"keywords" content"贪吃蛇"><meta name"Description" content"这是一个初学者用来学习的小…

Linux(CentOS7)安装 MongoDB

目录 下载 上传 解压 创建mongodb.conf 创建数据文件夹和日志文件夹 启动服务 创建软链接 安装客户端 下载 上传 安装 下载 官方地址&#xff1a; Download MongoDB Community Server | MongoDBhttps://www.mongodb.com/try/download/community 上传 将下载好的 …

基于java+springboot+vue实现的电商个性化推荐系统(文末源码+Lw+ppt)23-389

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对电商个性化推荐进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套电商个性化推荐系统&#xff0c;帮…

C++对C的扩充(三)

5 带缺省参数的函数 一般情况下,实参个数应与形参个数相同。C允许实参个数与形参个数不同。办法是在形参表列中对一个或几个形参指定缺省值(或称默认值)。例如某一函数的首部可用如下形式: void fun(int a, int b,int c100) 在调用此函数时如写成fun(2,4,6),则形参a,b,c的值…

kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

K8S进阶&#xff08;Lifecycle......偏理论&#xff09; 一、Pod进阶学习之路1.1 Lifecycle1.2 重启策略1.3 静态Pod1.4 健康检查1.5 ConfigMap1.6 Secret1.7 指定Pod所运行的Node 二、Controller进阶学习之路2.1 Job & CronJob2.2 StatefulSet2.3 DaemonSet2.4 Horizontal…

Adobe Illustrator 2023 for Mac/Win:创意无限,设计无界

在数字艺术与设计领域&#xff0c;Adobe Illustrator 2023无疑是一颗璀璨的明星。这款专为Mac和Windows用户打造的矢量图形设计软件&#xff0c;以其强大的功能和卓越的性能&#xff0c;赢得了全球设计师的广泛赞誉。 Adobe Illustrator 2023在继承前代版本优点的基础上&#…

鸿蒙 UIAbility和Compent 生命周期

一、UIAbility的生命周期 在UIAbility的使用过程中&#xff0c;会有多种生命周期状态&#xff0c;掌握UIAbility的生命周期&#xff0c;对于应用的开发非常重要。 1、UIAbility的生命周期 UIAbility的生命周期主要分为以下4个&#xff1a; Create---Foreground---Background---…

多模态大模型:解析未来智能汽车的新引擎

多模态大模型&#xff1a;解析未来智能汽车的新引擎 1. 多模态大模型简介2. 多模态大模型在智能汽车中的应用2.1 感知与认知2.2 智能驾驶辅助2.3 智能交互 随着人工智能技术的不断进步&#xff0c;智能汽车已经从概念变成了现实&#xff0c;成为了当今科技领域的焦点之一。而在…

大模型预测,下一个token何必是文字?

太快了太快了… 大模型的生成技能&#xff0c;已经到了普通人看不懂的境界&#xff01; 它可以根据用户过去5年的体检报告&#xff0c;生成未来第1年、第2年、第3年的体检报告。 你看&#xff0c;这个生成的过程&#xff0c;是不是像极了ChatGPT&#xff0c;根据历史单词预测…

顺序栈、链式栈、顺序队列、链式队列的ADT及其实现

顺序栈ADT及其实现 链式栈ADT及其实现 顺序队列的ADT及其实现 在数组中队首队尾的分配方案 第三中方案&#xff0c;即达到入队出队操作的时间代价是O&#xff08;1&#xff09; 同时可充分利用空间&#xff0c;不会出现空间似乎用完了的假象 时间性能和空间性能发挥到最大 链…

快速上手Spring Cloud 九:服务间通信与消息队列

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

短视频矩阵系统---开发源头交付

短视频矩阵系统---开发源头交付 短视频矩阵系统的核心开发步骤包括以下几个方面&#xff1a; 1. 系统设计&#xff1a;根据需求分析&#xff0c;设计出相应的系统架构&#xff0c;包括数据库设计、系统功能模块设计等。 2. 开发基础功能&#xff1a;基础功能包括短视频的上传、…

数据库工具——DBeaver的安装及使用

目录 一、DBeaver介绍 1.定义 2.支持的数据库 3.支持的操作系统 4.特点 二、DBeaver安装及使用 1.服务启动 2.查看连接类型 3.演示连接Mysql数据库 4.连接配置 5.成功连接 6.远程控制 6.1新建数据库 6.2新建数据表 6.3添加字段列 6.4使用SQL编辑器进行编辑 一…

双向长短期BiLSTM的回归预测-附MATLAB代码

BiLSTM是一种带有正反向连接的长短期记忆网络&#xff08;LSTM&#xff09;。 BiLSTM通过两个独立的LSTM层&#xff0c;一个按时间顺序处理输入&#xff0c;另一个按时间倒序处理输入&#xff0c;分别从正向和反向两个方向捕捉输入序列的特征。具体地&#xff0c;正向LSTM按时…

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置&#xff1a; 中断回调函数完善一下&#xff1a; void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…

Python:执行py命令,提示: Can‘t find a default Python.

1.Python运行环境罢工 今天&#xff0c;要运行一个前年用python编写的爬虫程序&#xff0c;先检测python运行环境是否正常&#xff1a; D:\Python38-32\works>c:\windows\py.exe Cant find a default Python. 再试&#xff1a; D:\Python38-32\works>py --list Installe…

基于单片机的便携式瓦斯检测仪系统设计

**单片机设计介绍&#xff0c;基于单片机的便携式瓦斯检测仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的便携式瓦斯检测仪系统设计是一个针对煤矿等工业环境中瓦斯气体浓度检测的重要项目。以下是该设计…

RN在android/ios手机剪切图片的操作

之前写过一个React Native调用摄像头画面及拍照和保存图片到相册全流程但是这个仅限于调用摄像头拍照并保存图片,今天再写一个版本的操作,这个博客目前实现的有三点操作: 调用摄像头拍照对照片进行剪切从相册选取图片 功能上面来说有两点: 点击按钮可以对摄像头进行拍照,拍完照…