一、Docker Compose簡介
Docker Compose是Docker的一個官方工具,用於定義和運行多容器Docker應用程序。它使用YAML文件來配置應用程序的服務,並通過命令行界面來管理多個Docker容器的生命周期。以下是一個示例Docker Compose文件:
version: '3' services: app: image: myapp:latest ports: - "8000:8000" volumes: - .:/app links: - db db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: password
該文件定義了兩個服務:一個名為「app」的服務和一個名為「db」的服務。它們都使用不同的容器。App服務使用myapp鏡像,並將容器埠8000映射到主機埠8000。將當前目錄掛載到容器的/app目錄,以便在容器內訪問該目錄中的文件。它還指定了一個名為「db」的鏈接,該鏈接將允許app服務訪問名為「db」的服務。db服務則使用MYSQL鏡像,並設置根密碼為「password」。
二、Docker Compose命令
以下是常用的Docker Compose命令:
- docker-compose up:啟動全部服務
- docker-compose down:停止並刪除所有容器
- docker-compose ps:列出所有容器的狀態
- docker-compose logs:查看容器的日誌
- docker-compose exec:在容器內執行命令
- docker-compose build:構建服務鏡像
三、Docker Compose使用示例
1. 搭建Web應用
假設我們有一個簡單的Web應用程序,它使用Python和Flask框架編寫。我們需要將應用程序部署到Docker容器中,並使用Nginx反向代理。以下是Docker Compose配置文件的示例:
version: '3' services: app: build: context: . ports: - "5000:5000" nginx: image: nginx:latest ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - app
該文件定義了兩個服務,一個名為「app」的服務和一個名為「nginx」的服務。app服務使用當前目錄中的Dockerfile構建鏡像,並將容器埠5000映射到主機埠5000。Nginx服務使用官方的Nginx鏡像,並將容器埠80映射到主機埠80。它還將容器中的/etc/nginx/nginx.conf文件掛載到主機上的./nginx.conf文件,並指定將其作為只讀文件。它還使用depends_on選項來指定Nginx服務需要在app服務之後啟動。
在當前目錄中創建名為「Dockerfile」的文件,添加以下內容:
FROM python:3.9-slim-buster WORKDIR /app COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . . EXPOSE 5000 CMD ["python3", "app.py"]
該Dockerfile使用最新版的Python3鏡像,並將容器的工作目錄設置為/app。它複製requirements.txt文件並使用pip3安裝它們。它將當前目錄的所有文件複製到容器中。最後,它將容器埠5000公開,並使用CMD命令運行app.py。
在當前目錄中創建名為「nginx.conf」的文件,添加以下內容:
worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name localhost; location / { proxy_pass http://app:5000; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }
該文件定義了Nginx的配置。它將Worker進程數設置為1。它配置了一個監聽埠為80的HTTP伺服器,並將其命名為localhost。該伺服器定義了名為「/」的位置,其指向app服務的5000埠。它還設置了代理伺服器的一些頭信息。
在當前目錄中創建名為「app.py」的文件,添加以下內容:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(host='0.0.0.0')
該文件使用Flask框架編寫的一個簡單的Web應用程序。它定義了一個名為「/」的路由,並返回「Hello,World!」。
最後,在終端中導航到包含這些文件的目錄,並運行以下命令啟動服務:
$ docker-compose up
Nginx將偵聽主機上的80埠,並將請求轉發到app容器的5000埠。你可以在瀏覽器中鍵入http://localhost來查看應用程序的輸出。
2. 使用MySQL資料庫
現在,假設我們需將我們的應用程序與MySQL資料庫一起使用。以下是Docker Compose配置文件的示例:
version: '3' services: app: build: context: . ports: - "5000:5000" environment: MYSQL_HOST: db MYSQL_USER: root MYSQL_PASSWORD: password MYSQL_DATABASE: mydb depends_on: - db db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: mydb volumes: - "./mysql_data:/var/lib/mysql"
該文件定義了兩個服務,一個名為「app」的服務和一個名為「db」的服務。app服務使用當前目錄中的Dockerfile構建鏡像,並將容器埠5000映射到主機埠5000。它將一些環境變數傳遞到容器中,以便應用程序連接到MySQL資料庫。此外,它使用depends_on選項來指定db服務需要在app服務之後啟動。db服務使用MYSQL鏡像,並設置根密碼為「password」和資料庫名稱為「mydb」。它還將容器中的/var/lib/mysql目錄掛載到主機上的./mysql_data目錄。
在app.py文件中添加以下內容以連接到資料庫:
from flask import Flask, render_template from flask_mysqldb import MySQL app = Flask(__name__) app.config['MYSQL_HOST'] = 'db' app.config['MYSQL_USER'] = 'root' app.config['MYSQL_PASSWORD'] = 'password' app.config['MYSQL_DB'] = 'mydb' mysql = MySQL(app) @app.route('/') def index(): cur = mysql.connection.cursor() cur.execute("SELECT COUNT(*) FROM users") count = cur.fetchone()[0] cur.close() return render_template('index.html', count=count) if __name__ == '__main__': app.run(host='0.0.0.0')
該文件使用了Flask框架,以及用於MySQL連接的Flask-MySQLdb庫。它定義了mysql屬性,該屬性是一個MySQL對象。該對象使用應用程序的配置屬性來連接到MySQL資料庫。它還定義了一個名為「/」的路由,該路由從資料庫中獲取數據並在網頁中返回數據。
在當前目錄中創建名為「index.html」的文件,添加以下內容:
MySQL Example Number of users
{{ count }}
該文件是應用程序的HTML模板。它使用Flask的渲染模板功能,以dynamic方式將計數值傳遞到模板中。
最後,在終端中導航到包含這些文件的目錄,並運行以下命令啟動服務:
$ docker-compose up
你可以在瀏覽器中鍵入http://localhost來查看應用程序的輸出。它將顯示資料庫中的用戶數量。
四、總結
在這篇文章中,我們了解了Docker Compose以及如何使用它來構建和運行多容器Docker應用程序。我們創建了一個簡單的Web應用程序,使用Nginx反向代理,以及與MySQL資料庫一起使用的應用程序。通過使用Docker Compose,我們可以更輕鬆地管理多容器應用程序的部署和生命周期。
原創文章,作者:FUWRD,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371919.html