一、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-hant/n/371919.html
微信掃一掃
支付寶掃一掃