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