官方文档:https://docs.docker.com/compose
一、介绍
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。是用来定义和运行多个Docker容器应用的工具,它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
-
服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 -
项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。Compose
项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose
来进行编排管理。
二、Linux 安装
curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod a+x /usr/local/bin/docker-compose
docker-compose -version docker-compose version 1.19.0, build 9e633ef
三、启动一个项目
3.1 编写一个yaml文件
pwd /home/bigberg/docker/compose-test # 编写yaml文件 vim docker-compose.yml version: '3' services: web: build: . ports: - "8888:80" # version : 需要和docker 版本相匹配 # services : 定义组中的容器和服务等 # web : 容器镜像服务的标识,通过这个标识来管理镜像 # build . : 构建镜像的目录 # ports : 映射的端口
version 对应的docker版本:
3.2 编写一个Dockerfile文件
FROM centos MAINTAINER bigberg RUN yum -y install httpd php php-gd php-mysql RUN echo "<?php phpinfo()?>" > /var/www/html/index.php CMD ["/usr/sbin/httpd","-D","FOREGROUND"] EXPOSE 80
3.3 构建镜像
docker-compos up
构建完成后查看:
docker-compose ps Name Command State Ports -------------------------------------------------------------------------------- composetest_web_1 /usr/sbin/httpd -D FOREGROUND Up 0.0.0.0:8888->80/tcp
访问地址:(项目确实起来了)
四、python-web事例
4.1 定义应用的一些依赖
创建文件夹
mkdir -p compose-test/python-test cd compose-test/python-test
创建一个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. '.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
在app.py中,host='redis' 中redis 是 redis 容器的主机名,在这个项目的网络中可以被解析
Name: redis Address 1: 172.20.0.3 625eb281eafd
创建一个requirements.txt文件
flask redis
4.2 创建一个Dockerfile
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
- 构建使用的python:3.4-alpine镜像
- 将当前目录添加到镜像中/code目录
- 设置工作目录为 /code
- 安装python依赖
- 设置容器启动运行命令为 python app.py
4.3 创建docker-compose.yml 文件
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
这个ymal文件有两个服务:web 和 redis
web服务:
- 构建使用Dockerfile中定义的镜像
- 映射端口5000到宿主机端口5000,也就是flask web的默认端口
redis服务:
- 构建使用的是Docker Hub中公共Redis镜像
4.4 构建项目
docker-compose up
4.5 访问项目
每次刷新,访问的次数会增长
4.6 修改ymal文件,将目录挂在到镜像中
version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
通过volumes 将当前目录挂在到镜像中的 /code目录,这个就可以在宿主机目录中修改文件,容器中也会生效,不必每次修改都要重新构建
4.7 重新docker-compose up
docker-compose up
4.8 修改app.py文件
Hello world! 改为 Hello from Docker!