您的位置:

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 }}