1. 简介
Docker Compose是Docker官方的开源项目,作用是通过 docker-compose.yml 定义运行多个容器
Compose概念:
-
Services
:容器,应用 ,例如:web、redis、mysql... -
Project
:一组关联的容器,例如 lnmp
安装 Compose:
[root@docker-node01 ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
[root@docker-node01 ~]# chmod +x /usr/local/bin/docker-compose
[root@docker-node01 ~]# docker-compose -v
docker-compose version 1.25.5, build 8a1c60f6
2. Compose yml规则
# 1. 版本
version: "x.x" # 版本
# 2. 服务和配置
services: # 定义服务
xxx: # 服务1
container_name: 'xxx' # 服务1的容器名称
images: # 镜像
build: . # 通过dockerfile构建
deploy: # 定义副本
replicas: 3 # 3个副本
...
network: # 定义网络
volumes: # 使用挂载卷
- my_data:xxx # 挂载到容器
xxx: # 服务2
# 3.全局配置
volumes:
my_data: {}
# 启动顺序根据 services 从上到下启动
3. Compose 示例
3.1 Python-web应用
-
创建项目目录
[root@docker-node01 ~]# mkdir -p ~/project/py-web [root@docker-node01 ~]# cd ~/project/py-web
-
创建py文件
app.py
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) # 注意这个 "host=redis" 需要与redis的容器名一致 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)
在此示例中,
redis
是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口,6379
. -
创建
requirements.txt
flask redis
-
创建
dockerfile
FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.12/main/ > /etc/apk/repositories &&\ 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"]
-
创建
docker-compose.yml
version: "2.0" services: # 定义服务 web: # web服务 container_name: py-app # 容器名称 build: . # 通过 "docker build ." 创建" # volumes: # - .:/code ports: - "8000:5000" redis: # redis服务 image: "redis:alpine" # 直接通过镜像创建
-
启动
- 前台启动:
docker-compose up
,停止:Ctrl+C
- 后台启动:
docker-compose up -d
,停止:docker-compose down
- 前台启动:
-
访问
- 外部访问:
192.168.1.20:8000
- 本机访问:
127.0.0.1:5000
- 外部访问:
网络:
- 一个docker-compose启动的服务都在一个网络,可以互相通过 IP 或 容器名访问
3.2 wordpress应用
-
创建项目目录
[root@docker-node01 ~]# mkdir -p ~/project/my-wordpress [root@docker-node01 ~]# cd ~/project/my-wordpress
-
创建
docker-compose.yml
version: "2.0" 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 volumes: - wordpress_data:/var/www/html ports: - "8001:80" restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {} wordpress_data: {}
-
启动并访问
[root@docker-node01 my-wordpress]# docker-compose up - 外部访问:192.168.1.20:8001 - 本机访问:127.0.0.1:80
- Docker-Compose Compose Dockerdocker-compose docker-compose compose docker docker-compose compose docker gitlab docker-compose compose docker mysql docker docker-compose compose ubuntu docker-compose compose docker failed docker-compose compose docker redis docker-compose compose docker emqx docker docker-compose dockerfile container flask docker-compose gunicorn compose