翼度科技»论坛 云主机 服务器技术 查看内容

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

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
前言

在我们使用Docker时,如果需要运行多个容器,在没有Docker-compose之前,你可能需要一个个的定义和启动。
docker-compose诞生之后,你只需要把这些容器、依赖关系、端口映射等配置在一个yaml文件中即可,大大提升了管理效率。今天就以一个Python项目来说说Docker-compose的使用步骤。

Docker-compose目录树

flask项目中要用到mysql,因此我们准备2个容器:mysql镜像、flask项目镜像。
flask代码目录如下:
  1. .
  2. ├── docker-compose.yml
  3. ├── flask
  4. │   ├── Dockerfile
  5. │   ├── __init__.py
  6. │   ├── gunicorn_conf.py
  7. │   ├── manage.py
  8. │   ├── requirements.txt
  9. │   └── settings.py
  10. └── mysql
复制代码
flask目录下文件

首先来编写MySQL连接文件settings.py:
  1. import pymysql
  2. db = pymysql.connect(
  3.     host='mysql',
  4.     port=3306,
  5.     user='root',
  6.     password='root123456'
  7. )
复制代码
再编写代码文件manage.py,代码很简单,就是开启一个flask服务,需要用到上述的mysql服务:
  1. from flask import Flask
  2. from settings import db
  3. app = Flask(__name__)
  4. def mysql_test():
  5.     cursor = db.cursor()
  6.     sql = "show databases"
  7.     cursor.execute(sql)
  8.     res = cursor.fetchall()
  9.     cursor.close()
  10.     db.close()
  11.     return res
  12. @app.route('/')
  13. def index():
  14.     res = mysql_test()
  15.     re_list = []
  16.     for row in res:
  17.         re_list.append(row[0])
  18.     return "res: {}".format(re_list)
  19. if __name__ == '__main__':
  20.     app.run()
复制代码
进程管理方面,我们使用gunicorn来管理服务,因此编写gunicorn配置文件gunicorn_conf.py:
  1. worker = 4
  2. worker_class = "gevent"
  3. bind = "0.0.0.0:5000"
复制代码
接着,我们来编写Dockerfile:
  1. FROM python:3.7-slim
  2. COPY . /home
  3. WORKDIR /home
  4. RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
  5. CMD gunicorn -c gunicorn_conf.py manage:app
复制代码
然后,再编写一下flask项目依赖文件requirements.txt:
  1. Flask==2.0.3
  2. gunicorn==20.1.0
  3. gevent==21.12.0
  4. PyMySQL==1.0.2
  5. cryptography==39.0.0
复制代码
docker-compose.yml文件编写

编写docker-compose.yml,我们要描述应用的构成(一个web服务器和一个数据库)、使用的Docker镜像、镜像间的连接、挂载到容器的数据卷、服务开放的端口。
  1. version: '3'
  2. services:
  3.   mysql:
  4.     image: mysql:latest
  5.     restart: always
  6.     networks:         # 配置网络
  7.       - diy_net
  8.     expose:
  9.       - 3310
  10.     ports:
  11.       - "3310:3306"
  12.     environment:   # 环境变量(可防止泄露不必要的数据)
  13.       - MYSQL_ROOT_PASSWORD=root123456
  14.   flask:
  15.     build: ./flask
  16.     depends_on:  # 依赖于mysql容器,启动时会先启动mysql
  17.       - mysql
  18.     networks:   # 配置网络
  19.       - diy_net
  20.     environment:
  21.       - MYSQL_USER=root
  22.       - MYSQL_PASSWORD=root123456
  23.       - MYSQL_DB=docker_db
  24.     ports:
  25.       - "5000:5000"
  26. networks:  # 网络设置
  27.   diy_net:
  28.     name: diy_net
  29.     external: true  # 表示已有的网络
复制代码
备注: networks的配置是为了让flask应用和mysql应用同处在一个网络,这样才能保证容器间的连通性。 当然保证容器间的连通性,还有其他方式,如用--link配置。用networks配置起来更加方便。
代码完成后,开启服务:
  1. docker-compose up -d
复制代码

服务正常开启,来测试一下两个容器的连通性。
进入flask容器
  1. docker-compose exec flask bash
复制代码
ping一下mysql容器:
  1. ping -c 3 mysql
复制代码
,显示信息如下:
  1. # ping -c 3 mysql
  2. PING mysql (172.18.0.3) 56(84) bytes of data.
  3. 64 bytes from test-mysql-1.diy_net (172.18.0.3): icmp_seq=1 ttl=64 time=0.717 ms
  4. 64 bytes from test-mysql-1.diy_net (172.18.0.3): icmp_seq=2 ttl=64 time=0.432 ms
  5. 64 bytes from test-mysql-1.diy_net (172.18.0.3): icmp_seq=3 ttl=64 time=0.376 ms
  6. --- mysql ping statistics ---
  7. 3 packets transmitted, 3 received, 0% packet loss, time 2005ms
  8. rtt min/avg/max/mdev = 0.376/0.508/0.717
复制代码
说明容器间互联成功。整个项目就运行起来了。

小结

本文以一个简单的flask项目使用docker-compose构建起来,当我们有多个容器,并且容器间有依赖相关的时候,使用docker-compose来统一管理非常方便。
以上就是docker-compose统一管理多个容器使用详解的详细内容,更多关于docker-compose容器管理的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/article/275903.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具