一 docker-compose的简介

docker-compose是dokcer官方的单机编排工具,让用户通过编写一个简单的模板文件,快速地创建和管理基于docker容器的应用集群。实现对docker容器集群的快速编排。
允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器作为一个项目(project)

A. Compose2个重要概念:

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

B. 使用Compose的三步骤:

  1. Dockerfile 定义应用的运行环境
  2. docker-compose.yml 定义组成应用的各服务
  3. docker-compose up 启动整个应用

C. docker-compose命令与模板文件

  1. docker-compose命令
    对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或容器。默认针对项目
1
2
3
4
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
-f 指定使用的Compose模板文件,默认为docker-compose.yml,可多次指定
-p 指定项目名称,默认将使用所在目录名称作为项目名
-x-network-driver DRIVER指定网络后端的驱动,默认为bridge
  1. compose的yml模板
    docker-compose.yml文件是compose的模板文件默认文件名,使用docker-compose时,会通过该模板文件构建镜像、启动容器、关联容器等
    Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例
    模板文件类似dockerfile,但命令更多,命令详情见模板文件详解

二 docker-compose安装

Compose项目是用Python语言编写的,所以compose可以通过python的pip工具进行安装。安装过程如下:

A. pip在线安装法

  1. 安装更新pip
1
2
3
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y python-pip
pip install --upgrade pip -i https://pypi.douban.com/simple/
  1. pip安装docker-compose
1
2
3
4
5
6
pip install docker-compose -i https://pypi.douban.com/simple/
[root@docker01 ~]# docker-compose version
docker-compose version 1.24.0, build 0aa5906
docker-py version: 3.7.2
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013

B. github脚本安装法

可以直接下载docker官方存放在GitHub上的程序,然后授权启动即可,这样做的好处是可以控制下载指定的版本使用,而第一种方法默认会下载最新版

1
2
3
wget -O /usr/local/bin/docker-compose \
https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)
chmod +x /usr/local/bin/docker-compose

三 Compose编排快速使用

A. 简单编排演示

  1. 创建目录及模板文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mkdir /test/www -p && cd /test/
cat >docker-compose.yml <<EOF
version: "3"
volumes:
web:
services:
web-ser1:
image: busybox:latest
command: httpd -h /test/ -p 80 -f
volumes:
- web:/test/
ports:
- "81:80"
web-ser2:
image: busybox:latest
command: httpd -h /test/ -p 80 -f
volumes:
- /test/www/:/test/
ports:
- "82:80"
EOF
  1. 启动项目并写入测试文件
1
2
3
docker-compose up -d
echo 'linux file test pag' > /test/www/index.html
echo 'docker-volumes test pags' >/var/lib/docker/volumes/test_web/_data/index.html
  1. 验证功能
1
2
3
4
[root@docker01 test]# curl 127.0.0.1:81
docker-volumes test pags
[root@docker01 test]# curl 127.0.0.1:82
linux file test pag

B. 该模板功能解释

该模板做了一下几件事:

  1. 目录为test,所以项目名就是test
  2. compose模板有3个语法版本,使用第3版
  3. 创建一个卷web,会自动加上项目名为test_web
  4. 创建第一个容器web-ser1,全名test_web-ser1_1
    • 用busybox做镜像,将docker卷web挂载到/test/
    • 启动简易httpd服务,映射端口81:80
  5. 创建第二个容器web-ser2,全名test_web-ser2_1
    • 用busybox做镜像,将指定目录挂载到/test/
    • 启动简易httpd服务,映射端口82:80

可以通过docker相关命令验证是是否有创建相关的卷

  1. 验证volume
1
2
3
4
5
[root@docker02 test]# docker volume ls
DRIVER VOLUME NAME
local test_web
[root@docker02 test]# docker volume inspect test_web|grep data
"Mountpoint": "/var/lib/docker/volumes/test_web/_data",
  1. 验证容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@docker02 test]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f378003a21d3 busybox:latest "httpd -h /test/ -p …" 23 minutes ago Up 23 minutes 0.0.0.0:82->80/tcp test_web-ser2_1
47ca927c1abd busybox:latest "httpd -h /test/ -p …" 23 minutes ago Up 23 minutes 0.0.0.0:81->80/tcp test_web-ser1_1
[root@docker02 test]# docker container inspect test_web-ser1_1 |grep -A5 Mounts
"Mounts": [
{
"Type": "volume",
"Name": "test_web",
"Source": "/var/lib/docker/volumes/test_web/_data",
"Destination": "/test",
[root@docker02 test]# docker container inspect test_web-ser2_1 |grep -A4 Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/test/www",
"Destination": "/test",