Docker-Compose

发布时间 2023-10-23 14:55:40作者: 龙泉寺老方丈

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应用

  1. 创建项目目录

    [root@docker-node01 ~]# mkdir -p ~/project/py-web
    [root@docker-node01 ~]# cd ~/project/py-web
    
  2. 创建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.

  3. 创建requirements.txt

    flask
    redis
    
  4. 创建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"]
    
  5. 创建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"  # 直接通过镜像创建
    
  6. 启动

    • 前台启动:docker-compose up,停止:Ctrl+C
    • 后台启动:docker-compose up -d,停止:docker-compose down
  7. 访问

    • 外部访问:192.168.1.20:8000
    • 本机访问:127.0.0.1:5000

网络:

  • 一个docker-compose启动的服务都在一个网络,可以互相通过 IP 或 容器名访问

3.2 wordpress应用

  1. 创建项目目录

    [root@docker-node01 ~]# mkdir -p ~/project/my-wordpress
    [root@docker-node01 ~]# cd ~/project/my-wordpress
    
  2. 创建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: {}
    
  3. 启动并访问

    [root@docker-node01 my-wordpress]# docker-compose up
    
    - 外部访问:192.168.1.20:8001
    - 本机访问:127.0.0.1:80