云计算百科
云计算领域专业知识百科平台

Docker Compose(容器编排)

目录

什么是 Docker Compose

Docker Compose 的功能

Docker Compose 使用场景

Docker Compose 文件(docker-compose.yml)

Docker Compose 命令清单

常见命令说明

操作案例

总结


什么是 Docker Compose

docker-compose

Docker
官方的开源项目,使用
python 编写,实现上调用了 Docker
服务的
API
进行容器管理及编排,其官方定义为定义和运行多个
Docker 容器的应用。

docker-compose
中有两个非常重要的概念
:

服务
( service )
:一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

项目
( project )
:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml
文件中定义
,
整个 docker-compose.yml 定义一个项目。 Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 通过
compose
可以方便的管理多个服务。

为什么要
Docker Compose

Docker
是一个轻量化的应用程序,
Docker
官方推荐每个
Docker 容器中只运行一个进程

如果一个应用需要涉及到
MySQL

nginx 等环境, 那么我们需要分别为应用、数据库和
nginx
创建单独的
docker
容器,然后分别启动容器。

想象一下,当我们构建好
Docker
之后,每次启动应用,都至少需要 docker run三次, 或者写一些脚本来实现, 这样会比较繁琐。

另外,这些
docker
容器都是分散独立的,也不方便镜像管理。那既然这些 docker容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker-compose
来解决这类型的问题。

Docker Compose
的安装

安装
docker
的时候,我们默认已经安装了
docker-compose,安装的组件包名称为 docker-compose-plugin
,此处不再赘述

Shell

#
检查安装是否成功

root@139-159-150-152:/data/myworkdir/compose# docker compose

version

Docker Compose version v2.16.0

Docker Compose 的功能

1.
使用步骤

Compose
使用的步骤:

使用
docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

最后,执行
docker compose up
命令来启动并运行整个应用程序。

2.
核心功能

Compose
具有管理应用程序整个生命周期的命令:

启动,停止和重建服务

查看正在运行的服务的状态

流式传输运行服务的日志输出

在服务上运行一次性命令

Docker Compose 使用场景

单主机部署

快速搭建一个单节点开发或者测试环境,方便使用。

不同环境隔离

通过指定
project
来运行不同的环境,实现隔离的目的。

Docker Compose 文件(docker-compose.yml)

文件基本结构及常见指令

YAML

version: "3.8" #
定义版本, 表示当前使用的
docker-compose
语法的版本

services: #
服务,可以存在多个

servicename: #
服务名字,它也是内部
bridge
网络可以使用的
DNS name, 如果不是集群模式相当于
docker run
的时候指定的一个名称

#
集群(
Swarm
)模式是多个容器的逻辑抽象

image: #
必选,镜像的名字

command: #
可选,如果设置,则会覆盖默认镜像里的
CMD
命令

environment: #
可选,等价于
docker container run
里的
–env 选项设置环境变量

volumes: #
可选,等价于
docker container run
里的
-v 选项 绑定数据卷

networks: #
可选,等价于
docker container run
里的
–network 选项指定网络

ports: #
可选,等价于
docker container run
里的
-p 选项指定端口映射

expose: #
可选,指定容器暴露的端口

build: #
构建目录

depends_on: #
服务依赖配置

env_file: #
环境变量文件

servicename2:

image:

command:

networks:

ports:

servicename3:

#…

volumes: #
可选,等价于
docker volume create

networks: #
可选,等价于
docker network create

image

指定容器运行的镜像。以下格式都可以:

image: redis
image: redis:5
image:
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis

command

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

Shell

command: ["bundle", "exec", "thin", "-p", "3000"]

command: bundle exec thin -p 3000

entrypoint

覆盖容器默认的
entrypoint

Shell

entrypoint: /code/entrypoint.sh

也可以是以下格式:

Shell

entrypoint:

– php

– -d

– zend_extension=/usr/local/lib/php/extensions/no-debug-non

zts-20100525/xdebug.so

– -d

– memory_limit=-1

– vendor/bin/phpunit

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保
YML
解析器不会将其转换为
True

False

Shell

#map
语法

environment:

RACK_ENV: development

SHOW: "true"

USER_INPUT:

#
数组语法

environment:

– RACK_ENV=development

– SHOW=true

– USER_INPUT

networks

指定容器运行的网络:

配置容器网络

Shell

services:

frontend:

image: awesome/webapp

networks:

– front-tier

– back-tier

monitoring:

image: awesome/monitoring

networks:

– admin

backend:

image: awesome/backend

networks:

back-tier:

aliases:

– database

admin:

aliases:

– mysql

networks:

front-tier:

back-tier:

admin:

配置网络驱动和子网信息

Shell

services:

frontend:

image: awesome/webapp

networks:

front-tier:

ipv4_address: 172.16.238.10

networks:

front-tier:

ipam:

driver: default

config:

– subnet: "172.16.238.0/24"

volumes

将主机的数据卷或者文件挂载到容器里。

Shell

#
短语法

services:

db:

image: postgres:latest

volumes:

– "/localhost/postgres.sock:/var/run/postgres/postgres.sock"

– "/localhost/data:/var/lib/postgresql/data"

#
完整语法

services:

backend:

image: awesome/backend

volumes:

– type: volume

#
命名卷

source: db-data

target: /data

volume:

nocopy: true

#
绑定卷

– type: bind

source: /var/run/postgres/postgres.sock

target: /var/run/postgres/postgres.sock

volumes:

db-data:

ports

指定端口映射。以下格式都可以:

Shell

#
完整语法

ports:

– target: 80

host_ip: 127.0.0.1

published: 8080

protocol: tcp

mode: host

– target: 80

host_ip: 127.0.0.1

published: 8000-9000

protocol: tcp

mode: host

#
短语法

ports:

– "3000"

– "3000-3005"

– "8000:8000"

– "9090-9091:8080-8081"

– "49100:22"

– "127.0.0.1:8001:8001"

– "127.0.0.1:5000-5010:5000-5010"

– "6060:6060/udp"

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定内部端口为参数:

Shell

expose:

– "3000"

– "8000"

build

指定为构建镜像上下文路径:

例如
webapp
服务,指定为从上下文路径
./dir/Dockerfile
所构建的镜像:

Shell

version: "3.7"

services:

webapp:

build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的
Dockerfile

args

version: "3.7"

services:

webapp:

build:

context: ./dir

dockerfile: Dockerfile-alternate

args:

buildno: 1

labels:

– "com.example.description=Accounting webapp"

– "com.example.department=Finance"

– "com.example.label-with-empty-value"

context
:上下文路径。

dockerfile
:指定构建镜像的
Dockerfile
文件名。

args
:添加构建参数,这是只能在构建过程中访问的环境变量。

labels
:设置构建镜像的标签。

depends_on

设置依赖关系。

docker compose up
:以依赖性顺序启动服务。在以下示例中,先启动
db

redis
,才会启动
web

docker compose up SERVICE
:自动包含
SERVICE
的依赖项。在以下示例中,

docker compose up web
还将创建并启动
db

redis

docker compose stop
:按依赖关系顺序停止服务。在以下示例中,
web

db

redis
之前停止。

Shell

version: "3.7"

services:

web:

build: .

depends_on:

– db

– redis

redis:

image: redis

db:

image: postgres

可以指定条件,
healthy
需要配置
healthcheck
来完成

services:

web:

build: .

depends_on:

db:

condition: service_healthy

redis:

condition: service_started

redis:

image: redis

db:

image: postgres

health check
样例

Shell

version: "3.8"

services:

web:

image: nginx:1.24.0

environment:

TEST: 1

depends_on:

mysql:

condition: service_healthy

mysql:

image: mysql:5.7

environment:

MYSQL_ROOT_PASSWORD: "bit@123"

volumes:

– /data/maxhou/mysqldata/varlib/:/var/lib/mysql

healthcheck
:

test: mysql –user=root –password='bit@123' -e "SELECT 1;"

interval: 10s

timeout: 5s

retries: 10

env_file

从文件添加环境变量。可以是单个值或列表的多个值。

Shell

env_file: .env

Docker Compose 命令清单

Docker Compose 有很多命令,但是常用的就几个,这里列出一些,有需要额外学习的可以去docker官网学习

docker compose build

构建服务

docker compose config

规范的格式来显示服务配置

docker compose cp

在本地系统和服务容器直接拷贝文件

docker compose create

创建服务的容器

docker compose down

停止所有容器,并删除容器

docker compose exec

在容器中执行命令

docker compose

images

列出所有容器使用的镜像

docker compose kill

强制停止服务的容器

docker compose ls

显示所有项目

docker compose pause

docker compose pause

命令格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

docker-compose
命令的基本的使用格式为

docker compose [OPTIONS] COMMAND [ARGS…]

常见选项说明

-f, –file
指定使用的
Compose
模板文件,默认为
docker-compose.yml,可以多次指定

-p, –project-name
指定项目名称,默认将使用所在目录名称作为项目名

常见命令说明

up

该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。

Shell

docker compose up [options] [SERVICE…]

-d
在后台运行服务容器, 推荐在生产环境下使用该选项

–force-recreate
强制重新创建容器,不能与
–no-recreate
同时使用

–no-recreate
如果容器已经存在了,则不重新创建,不能与 –force-recreate
同时使用

down

停止所有容器,并删除容器和网络

docker compose down [options] [SERVICE…]

-v, –volumes
删除容器同时删除目录映射

run

该命令可以在指定服务容器上执行相关的命令

Shell

#
例如
:
启动一个
ubuntu
服务容器,并执行
ping docker.com
命令

# docker compose run ubuntu ping docker.com

docker compose run [options] SERVICE [COMMAND] [ARGS…]

-d
后台运行容器

–name NAME
为容器指定一个名字

–entrypoint CMD
覆盖默认的容器启动指令

-e KEY=VAL
设置环境变量值,可多次使用选项来设置多个环境变

-u, –user=""
指定运行容器的用户名或者
ui

–rm
运行命令后自动删除容器

-p, –publish=[]
映射容器端口到本地主机

操作案例

1. 创建 compose 目录

mkdir -p /data/myworkdir/compose/base

cd /data/myworkdir/compose/base

2.
进入
base
目录
,
创建
docker-compose.yml
文件

cd /data/myworkdir/compose/base/

vi docker-compose.yml

3.
输入一下内容
version: 3.8
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
ports:
– 8979:80
networks:
– mytestnet
volumes:
– ./mynginxhome:/usr/share/nginx/html
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
networks:
– mytestnet
volumes:
– /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck:
test: mysql –user=root –password='bit@123' -e "SELECT 1;"
interval: 10s
timeout: 5s
retries: 10
redis:
image: redis:7
networks:
– mytestnet
healthcheck:
test: redis-cli ping
interval: 10s
timeout: 5s
retries: 10
networks:
mytestnet:

4.
输入
docker config 会做检查        

root@139-159-150-152:/data/myworkdir/compose/base# docker compose

config

version must be a string

5.
我们修改错误信息,将版本转为字符串,再次检查,检查通过

6.
创建首页目录,编辑首页内容

Shell

root@139-159-150-152:/data/myworkdir/compose/base# mkdir – p ./mynginxhome

root@139-159-150-152:/data/myworkdir/compose/base# cd ./mynginxhome/

root@139-159-150-152:/data/myworkdir/compose/base/mynginxhome#

echo "Hello bit" > index.html

7.
启动服务        

root@139-159-150-152:/data/myworkdir/compose/base# docker compose

up -d

8.
停止服务

root@139-159-150-152:/data/myworkdir/compose/base# docker compose

stop

10.
启动服务

root@139-159-150-152:/data/myworkdir/compose/base# docker compose

start

11.
删除服务

SQL

root@139-159-150-152:/data/myworkdir/compose/base# docker compose

down

总结

当docker某个项目牵扯多个微服务容器时,可以使用compose技术,实现对服务的容器定制化设置、网络的搭建和连接,以及容器的启动停止

赞(0)
未经允许不得转载:网硕互联帮助中心 » Docker Compose(容器编排)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!