Docker - Compose简介

Compose 是什么?

Compose是定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以创建并启动配置中的所有服务。

Compose适用于所有环境:生产,分期,开发,测试以及CI工作流程。

Compose 历史版本?

Docker Compose目前为止迭代了三个版本,官网建议使用最新的3版本,Docker从1.13.0+开始支持3版本。

本机的Docker版本是:

[vagrant@docker-host ~]$ docker -v
Docker version 18.05.0-ce, build f150324

参考:https://docs.docker.com/compose/compose-file/#reference-and-guidelines

Docker - Compose.yml

一个简单的dokcer-compose.yml文件:

version: '3'
services:
  web:
    build: ../../..
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: { }
networks:
  my-bridge:
    driver: bridge

以上文件可以看出,一个docker-compose.yml文件主要包含了四个部分:versionservicesvolumesnetworks

Version

用于指定docker-compose.yml文件的版本。

Services

一个Service代表一个Container,这个Container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建。

service的启动类类似docker run,我们可以给Service指定network和volume,所以可以给service指定network和volume的引用。

Volumes

可以再Service中给镜像定义volumes,然后再在volumes中引用Service中定义的volumes的名称。

Networks

指定docker-compose使用的网络。

Docker - Compose安装

如果是直接在电脑上安装了Docker for MacDocker for Win,那么Docker Toolbox中已经包含了Docker Compose,无需单独安装。

Centos7安装Docker-Compose

1、下载最新版本的Docker Compose

curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2、 给予Docker Compose执行权限

sudo chmod +x /usr/local/bin/docker-compose

3、测试安装

docker-compose  -v
docker-compose version 1.21.2, build a133471

使用 PIP 安装 Docker-Compose

安装pip

[root@dk vagrant]# sudo yum -y install epel-release
[root@dk vagrant]# sudo yum -y install python-pip
[root@dk vagrant]# pip install --upgrade pip
[root@dk vagrant]# pip -V 
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)

安装Docker-Compose

[root@dk vagrant]# pip install docker-compose --ignore-installed requests
[root@dk vagrant]# docker-compose -v
docker-compose version 1.23.2, build 1110ad0

Docker - Compose使用

使用Compose基本上是一个三步过程:

  1. 用一个定义你的应用程序的环境,Dockerfile这样它就可以在任何地方再现。
  2. 定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
  3. 运行docker-compose up和撰写启动并运行您的整个应用程序。

Docker - Compose命令

命令 说明
build 构建或重建服务
bundle 从Compose文件中生成一个Docker bundle
config 验证并查看Compose文件
create 创建服务
down 停止并移除容器,网络,图像和卷
events 接收来自容器的实时事件
exec 在正在运行的容器中执行命令
help 获取有关命令的帮助
images 列出镜像
kill 杀死运行的容器
logs 查看容器的输出
pause 暂停服务
port 打印端口绑定的公共端口
ps 查看容器列表
pull 拉取服务镜像
push 推送服务镜像
restart 重启服务
rm 移除停止的容器
run 运行一次性命令
scale 设置服务的容器数量
start 启动服务
stop 停止服务
top 显示正在运行的进程
unpause 取消暂停服务
unpause 创建并启动容器
version 显示Docker-Compose版本信息

Docker - Compose实践

使用Compse构建多容器WordPress

1、创建一个目录:

mkdir wp

2、进入目录撰写docker-compose.yml:

cd wp && touch docker-compose.yml

docker-compose.yml:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

3、使用docker-compose构建容器:

docker-compose up -d

4、查看运行状态:

[vagrant@docker-host ~]$ docker-compose ps
       Name                      Command               State          Ports
-----------------------------------------------------------------------------------
vagrant_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp
vagrant_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8000->80/tcp

使用Compose结果Dockerfile构建一个web应用:

1、创建一个工程目录:

mkdir dk_web && cd dk_web

2、创建web工程文件:

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)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

requirements.txt:

flask
redis

3、撰写Dockerfile:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

4、撰写docker-compose.yml:

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

5、使用Docker Compose来构建应用程序:

docker-compose up

6、查看容器运行状态:

[vagrant@docker-host dk_web]$ docker-compose ps
     Name                   Command               State           Ports
--------------------------------------------------------------------------------
dk_web_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
dk_web_web_1     python app.py                    Up      0.0.0.0:5000->5000/tcp

7、访问:

http://192.168.10.10:5000