日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

docker-compose統一管理多個容器使用詳解_docker

作者:芥末拌飯 ? 更新時間: 2023-05-23 編程語言

前言

在我們使用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來統一管理非常方便。

原文鏈接:https://juejin.cn/post/7202085514399629369

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新