目录
一、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 测试
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 Redis
- app = 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 文件界说了两个服务:web 和 redis。web 服务使用当前目录下的 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 模板文件我们需要关注的顶级配置有:version、services、networks、volumes 几个部分,除 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/结果如下:
使用 docker-compose down 可以停止并删除容器、网络。
5.3 version
- version是Docker Compose文件的一个重要组成部分,用于指定当前Docker Compose文件的版本。
version字段通常在文件的顶部举行界说,如下所示:在这个例子中,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 main
- import (
- "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
- - redis
- redis:
- image: redis
- db:
- image: mysql
复制代码 上述 YAML 文件界说的容器会先启动 db 和 redis 两个服务,最后才启动 web 服务。
5.4.6 ports
容器对外袒露的端口,格式:左边宿主机端口:右边容器端口。- ports:
- - "80:80"
- - "8080:8080"
复制代码 5.4.7 expose
容器袒露的端口不映射到宿主机,只答应能被连接的服务访问。5.4.8 restart
容器重启计谋,简朴的明确就是 Docker 重启以后容器要不要一起启动:
- no:默认的重启计谋,在任何情况下都不会重启容器;
- on-failure:容器非正常退出时,比如退出状态为非0(异常退出),才会重启容器;
- always:容器总是重新启动,即使容器被手动停止了,当 Docker 重启时容器也照旧会一起启动;
- unless-stopped:容器总是重新启动,除非容器被停止(手动或其他方式),那么 Docker 重启时容器则不会启动。
- services:
- nginx:
- image: nginx
- container_name: mynginx
- ports:
- - "80:80"
- restart: always
复制代码 5.4.9 environment
添加环境变量。可以使用数组也可以使用字典。布尔相关的值(true、false、yes、no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为真或假。- environment:
- RACK_ENV: development
- SHOW: '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: 1234
- volumes:
- # 绝对路径
- - "/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:8
- container_name: mysql8
- ports:
- - "3306:3306"
- environment
- MYSQL_ROOT_PASSWORD: 1234
- volumes:
- # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
- - "mysql-data-volume:/var/lib/mysql"
- # 定义数据卷,可以多个
- volumes:
- mysql-data-volume: # 一个具体数据卷的条目名称
复制代码
以下方式的数据卷声明创建卷时会使用自界说的名称。- # 描述 Compose 文件的版本信息
- version: "3.8"
- # 定义服务,可以多个
- services:
- mysql:
- image: mysql:8
- container_name: mysql8
- ports:
- - "3306:3306"
- environment
- MYSQL_ROOT_PASSWORD: 1234
- volumes:
- # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /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: nginx
- container_name: mynginx
- ports:
- - "80:80"
- # 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
- #networks:
复制代码
以下方式的网络声明创建网络时会使用默认的名称:"工程名称_网络条目名称",网络模式默以为 bridge。- # 描述 Compose 文件的版本信息
- version: "3.8"
- # 定义服务,可以多个
- services:
- nginx:
- image: nginx
- container_name: mynginx
- ports:
- - "80:80"
- networks: # 配置容器连接的网络,引用顶级 networks 下的条目
- nginx-net:
- # 定义网络,可以多个
- networks:
- nginx-net: # 一个具体网络的条目名称
复制代码
以下方式的网络声明创建网络时会使用自界说的名称,还可以通过 driver 选择网络模式,默以为 bridge。- # 描述 Compose 文件的版本信息
- version: "3.8"
- # 定义服务,可以多个
- services:
- nginx:
- image: nginx
- container_name: mynginx
- ports:
- - "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,其实只需要了解此中部分内容即可。后期大家可在项目生产环境中根据自身情况再进一步深入学习即可。
本文由博客一文多发平台 OpenWrite 发布!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |