当前位置 : 主页 > 操作系统 > centos >

docker-compose统一管理多个容器使用详解

来源:互联网 收集:自由互联 发布时间:2023-03-17
目录 前言 Docker-compose目录树 flask目录下文件 docker-compose.yml文件编写 小结 前言 在我们使用Docker时,如果需要运行多个容器,在没有Docker-compose之前,你可能需要一个个的定义和启动。
目录
  • 前言
  • Docker-compose目录树
    • flask目录下文件
    • docker-compose.yml文件编写
  • 小结

    前言

    在我们使用Docker时,如果需要运行多个容器,在没有Docker-compose之前,你可能需要一个个的定义和启动。

    docker-compose诞生之后,你只需要把这些容器、依赖关系、端口映射等配置在一个yaml文件中即可,大大提升了管理效率。今天就以一个Python项目来说说Docker-compose的使用步骤。

    Docker-compose目录树

    flask项目中要用到mysql,因此我们准备2个容器:mysql镜像、flask项目镜像。

    flask代码目录如下:

    .
    ├── docker-compose.yml
    ├── flask
    │   ├── Dockerfile
    │   ├── __init__.py
    │   ├── gunicorn_conf.py
    │   ├── manage.py
    │   ├── requirements.txt
    │   └── settings.py
    └── mysql
    

    flask目录下文件

    首先来编写MySQL连接文件settings.py:

    import pymysql
    db = pymysql.connect(
        host='mysql',
        port=3306,
        user='root',
        password='root123456'
    )
    

    再编写代码文件manage.py,代码很简单,就是开启一个flask服务,需要用到上述的mysql服务:

    from flask import Flask
    from settings import db
    app = Flask(__name__)
    def mysql_test():
        cursor = db.cursor()
        sql = "show databases"
        cursor.execute(sql)
        res = cursor.fetchall()
        cursor.close()
        db.close()
        return res 
    @app.route('/')
    def index():
        res = mysql_test()
        re_list = []
        for row in res:
            re_list.append(row[0])
        return "res: {}".format(re_list)
    if __name__ == '__main__':
        app.run()
    

    进程管理方面,我们使用gunicorn来管理服务,因此编写gunicorn配置文件gunicorn_conf.py:

    worker = 4
    worker_class = "gevent"
    bind = "0.0.0.0:5000"
    

    接着,我们来编写Dockerfile:

    FROM python:3.7-slim
    COPY . /home
    WORKDIR /home
    RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    CMD gunicorn -c gunicorn_conf.py manage:app
    

    然后,再编写一下flask项目依赖文件requirements.txt:

    Flask==2.0.3
    gunicorn==20.1.0
    gevent==21.12.0
    PyMySQL==1.0.2
    cryptography==39.0.0
    

    docker-compose.yml文件编写

    编写docker-compose.yml,我们要描述应用的构成(一个web服务器和一个数据库)、使用的Docker镜像、镜像间的连接、挂载到容器的数据卷、服务开放的端口。

    version: '3'
    services:
      mysql:
        image: mysql:latest
        restart: always
        networks: 	# 配置网络
          - diy_net
        expose:
          - 3310
        ports:
          - "3310:3306"
        environment:   # 环境变量(可防止泄露不必要的数据)
          - MYSQL_ROOT_PASSWORD=root123456
      flask:
        build: ./flask
        depends_on:  # 依赖于mysql容器,启动时会先启动mysql
          - mysql
        networks:   # 配置网络
          - diy_net
        environment: 
          - MYSQL_USER=root
          - MYSQL_PASSWORD=root123456
          - MYSQL_DB=docker_db
        ports:
          - "5000:5000"
    networks:  # 网络设置
      diy_net:
        name: diy_net
        external: true  # 表示已有的网络
    

    备注: networks的配置是为了让flask应用和mysql应用同处在一个网络,这样才能保证容器间的连通性。 当然保证容器间的连通性,还有其他方式,如用--link配置。用networks配置起来更加方便。

    代码完成后,开启服务:

    docker-compose up -d
    

    服务正常开启,来测试一下两个容器的连通性。

    进入flask容器docker-compose exec flask bash

    ping一下mysql容器:ping -c 3 mysql,显示信息如下:

    # ping -c 3 mysql
    PING mysql (172.18.0.3) 56(84) bytes of data.
    64 bytes from test-mysql-1.diy_net (172.18.0.3): icmp_seq=1 ttl=64 time=0.717 ms
    64 bytes from test-mysql-1.diy_net (172.18.0.3): icmp_seq=2 ttl=64 time=0.432 ms
    64 bytes from test-mysql-1.diy_net (172.18.0.3): icmp_seq=3 ttl=64 time=0.376 ms
    --- mysql ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2005ms
    rtt min/avg/max/mdev = 0.376/0.508/0.717
    

    说明容器间互联成功。整个项目就运行起来了。

    小结

    本文以一个简单的flask项目使用docker-compose构建起来,当我们有多个容器,并且容器间有依赖相关的时候,使用docker-compose来统一管理非常方便。

    以上就是docker-compose统一管理多个容器使用详解的详细内容,更多关于docker-compose容器管理的资料请关注自由互联其它相关文章!

    网友评论