Docker Compose使用詳解

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FUWRD的頭像FUWRD
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • docker-ce-18.03.1.ce-1.el7.centos.x86_64需要pigz這個依賴的解決方案

    當我們在linux centos系統中安裝docker-ce-18.03.1.ce-1.el7.centos.x86_64時,有時可能會遇到「nothing provides pi…

    編程 2025-04-29
  • 如何解決Docker+k8s報錯413 Request Entity Too Large

    對於使用Docker容器和Kubernetes集群的開發人員,在處理HTTP請求時,常常會遇到413 Request Entity Too Large的報錯。這通常是由於請求的大小…

    編程 2025-04-27
  • docker-compose編寫用法介紹

    本文將詳細介紹docker-compose編寫的各個方面,包括語法、常見命令等等,旨在幫助讀者更好的了解如何使用docker-compose。 一、docker-compose的語…

    編程 2025-04-27
  • Docker 垃圾電腦的解決方案

    Docker 是一種輕量級的容器化技術,可以在一個操作系統中,同時運行多個獨立的應用。在使用 Docker 的過程中,可能會出現 Docker 佔用大量硬碟空間,導致電腦變得極其緩…

    編程 2025-04-27
  • Docker掛載目錄–graph用法介紹

    本文將從如下幾個方面詳細闡述Docker掛載目錄–graph: 一、基本概念 在Docker中,鏡像是由一系列只讀層組成的文件系統。當我們啟動一個容器時,Docker會…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論