Docker-compose容器编排

igxiaoshan Lv5

概述 |码头工人文档 (docker.com)

Compose是Docker公司推出的一个工具软件,可以管理多个docker容器组成一个应用。需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只需要一个命令,就能同时启动/关闭这些容器。

是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

  • 主要作用
1
2
3
4
5
6
7
docker建议我们每个容器中只运行一个服务,因为docker容器本身占用的资源极少,所以最好是将每个服务单独的分割开来。
但是这样会有其他的问题?
如果需要同时部署好多个服务,就需要每个服务单独写Dockerfile文件然后构建镜像,构建容器。这样会很繁琐。所以Docker官方提供了docker-compose多服务部署工具。
例如:需要部署一个web微服务项目,除了web容器本身,还需要依赖中间件包括数据库服务,redis服务,注册中心nacos服务,甚至还包括负载均衡服务...等等
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。
可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
docker-compose解决了容器与容器之间如何管理编排的问题。
  • 使用

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
## 链接 https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
### -S 显示错误
### -L 允许跳转;github下载使用

## 开放权限
chmod +x /usr/local/bin/docker-compose

## 验证安装
docker-compose --version




[root@CentOS7_001 ~]# uname --help
用法:uname [选项]...
输出一组系统信息。如果不跟随选项,则视为只附加-s 选项。

-a, --all 以如下次序输出所有信息。其中若-p 和
-i 的探测结果不可知则被省略:
-s, --kernel-name 输出内核名称
-n, --nodename 输出网络节点上的主机名
-r, --kernel-release 输出内核发行号
-v, --kernel-version 输出内核版本
-m, --machine 输出主机的硬件架构名称
-p, --processor 输出处理器类型或"unknown"
-i, --hardware-platform 输出硬件平台或"unknown"
-o, --operating-system 输出操作系统名称
--help 显示此帮助信息并退出
--version 显示版本信息并退出

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告uname 的翻译错误
要获取完整文档,请运行:info coreutils 'uname invocation'
[root@CentOS7_001 ~]#


[root@CentOS7_001 ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
[root@CentOS7_001 ~]#

卸载

1
2
### 使用github安装
rm -rf /use/local/bin/docker-compose
  • 核心概念

  • 一个文件

    1
    docker-compose.yml
  • 两个要素

    • 服务(service)

      1
      一个个应用容器实例,比如web服务,mysql容器,nginx容器,redis容器...
    • 工程(project)

      1
      由一组关联的应用容器组成一个完整业务单元,在docker-compose.yml文件中定义
  • 使用步骤

1
2
3
1.编写Dockerfile文件定义各个微服务应用并构建出对应的镜像文件
2.使用docker-compose.yml文件定义一个完整业务单元,安排好整体应用中的各个容器服务
3.最后,执行docker-compose up 命令启动并运行整个应用程序,完成一键部署上线
  • 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Compose常用命令

docker-compose -h # 查看帮助

docker-compose up # 启动所有docker-compose服务

docker-compose up -d # 启动所有docker-compose服务并后台运行

docker-compose down # 停止并删除容器、网络、卷、镜像。

docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash

docker-compose ps # 展示当前docker-compose编排过的运行的所有容器

docker-compose top # 展示当前docker-compose编排过的容器进程

docker-compose logs yml里面的服务id # 查看容器输出日志

docker-compose config # 检查配置

docker-compose config -q # 检查配置,有问题才有输出

docker-compose restart # 重启服务

docker-compose start # 启动服务

docker-compose stop # 停止服务

官方案例

演示python案例,带你使用docker-compose

1
2
3
## 1.创建一个composetest演示文件夹
mkdir composetest
cd composetest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 2.创建一个app.py文件
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)

@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
1
2
3
4
3.创建另外一个文件:requirements.txt,以便于下面的文件调用

flask
redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
##  4.创建Dockerfile文件
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

# 从 Python 3.7 映像开始构建映像。
# 将工作目录设置为 。/code
# 设置命令使用的环境变量。flask
# 安装 gcc 和其他依赖项
# 复制并安装 Python 依赖项。requirements.txt
# 将元数据添加到映像以描述容器正在侦听端口 5000
# 将项目中的当前目录复制到映像中的工作目录。..
# 将容器的默认命令设置为 。flask run
1
2
3
4
5
6
7
8
9
10
11
## 5.编写docker-compose.yml文件

services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "reids:alpine"

## 定义了两个服务: web 和 redis
1
2
3
4
## 6.使用命令docker-compose up 启动应用程序

docker-compose up # 前台启动
docker-compose up -d # 后台启动
1
2
## 7.验证服务
### 在浏览器中输入 http://localhost:8000/ 以查看正在运行的应用程序

其他Dockerfile案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 原始Dockerfile文件
FROM anapsix/alpine-java:8_server-jre_unlimited

MAINTAINER igsshan@163.com

RUN mkdir -p /app/lib

WORKDIR /app

EXPOSE 8080

ADD ./admin.jar ./app.jar
ADD ./lib/*.jar ./lib/

ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx512m"

CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

1
2
3
4
5
6
7
8
9
10
## 修改环境变量后的Dockerfile

FROM admin:0.0.1

EXPOSE 80

ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx1024m" ## 测试修改环境启动参数,也可以在实际应用中修改其他的环境变量参数;包括不限于数据库连接池,数据库连接地址,数据库账密、redis连接...

CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

  • 设置容器开机自启
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3.8"
services:
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos-standalone-mysql
env_file:
- ../env/custom-application-config.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
depends_on:
mysql:
condition: service_healthy
restart: always # 将这一行添加到配置中

通过在配置中添加restart: always,容器将会在启动失败或退出时自动重启,并且会在系统开机时自动启动

1
2
docker-compose down
docker-compose up -d

关于restart取值

Docker-compose中,restart配置项可以接受多种取值方式;定义了容器在退出时的重启行为

  • no: 默认值,表示容器退出时不会自动重启
  • always: 表示容器退出时总是自动重启
  • unless-stopped: 表示容器首次启动后,只要不手动停止,就会自动重启
  • no-failure: 表示容器在非零退出代码的情况下自动重启.可以通过可选的:max-retries参数来指定最大的重试次数. 例如no-failure:5表示最多重试5次

always,unless-stopped,no-failure后跟具体的重启次数,例如always:5表示无论什么原因,容器总是尝试重启,最多重启5次

示例

1
2
3
4
5
6
7
8
9
version: "3.8"
services:
my_service:
image: my_image
restart: always
# 或者
# restart: unless-stopped
# 或者
# restart: on-failure:5

docker-compose -h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[root@CentOS7_001 composetest]# docker-compose -h
Define and run multi-container applications with Docker.

Usage:
docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]
docker-compose -h|--help

Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--profile NAME Specify a profile to enable
-c, --context NAME Specify a context name
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--ansi (never|always|auto) Control when to print ANSI control characters
--no-ansi Do not print ANSI control characters (DEPRECATED)
-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 the
name 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 keys
in v3 files to their non-Swarm equivalent (DEPRECATED)
--env-file PATH Specify an alternate environment file

Commands:
build Build or rebuild services
config Validate and view the Compose file
create Create services
down Stop and remove resources
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show version information and quit
[root@CentOS7_001 composetest]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
[root@CentOS7_001 composetest]#