Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务。这些配置文件允许您以声明性的方式配置应用程序的服务,包括容器、网络和卷。以下是 Docker Compose 的一些关键概念和特性:
关键概念:
- 服务(Services): 在 Docker Compose 中,一个服务定义了容器在生产环境中的行为。一个服务可以是一个单独的容器,也可以是多个容器的集群。
- 项目(Projects): 一个项目是由一组服务(容器)组成的完整应用程序。在 Docker Compose 中,一个项目通常对应一个
docker-compose.yml
文件。 - 配置文件(docker-compose.yml): 这是 Docker Compose 的核心文件,它包含了应用程序中所有服务的配置信息。
特性:
- 多容器管理: Docker Compose 允许你定义多个服务,并使用单个命令启动或停止所有服务。
- 依赖管理: 你可以指定服务之间的依赖关系,确保在启动一个服务之前,它所依赖的服务已经启动。
- 环境变量管理: Docker Compose 允许你在配置文件中定义环境变量,这样可以很容易地在不同的环境中重用和修改配置。
- 网络管理: 你可以为应用程序定义自定义网络,并且可以指定服务如何连接到这些网络。
- 卷管理: Docker Compose 可以管理数据卷,允许服务之间共享数据。
常用命令:
docker-compose up
: 启动所有定义在docker-compose.yml
文件中的服务。docker-compose up -d
: 在后台(守护态)启动所有服务。docker-compose down
: 停止并删除所有服务、网络和卷。docker-compose build
: 构建或重新构建服务。docker-compose stop
: 停止运行中的服务。docker-compose start
: 启动已经停止的服务。docker-compose restart
: 重启服务。
示例 docker-compose.yml
:
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example
在这个例子中,定义了两个服务:web
和 db
。web
服务使用 nginx:latest
镜像,并将容器的 80 端口映射到宿主机的 80 端口。db
服务使用 postgres:latest
镜像,并设置了一个环境变量 POSTGRES_PASSWORD
。
Docker Compose 是一个强大的工具,可以帮助开发人员和运维人员简化多容器应用程序的部署和管理。
代码实现
接下来让我们通过一个简单的例子来了解 Docker Compose。
假设我们想要创建一个简单的 Web 应用程序,它由一个前端(使用 Nginx)和一个后端(使用 Python Flask)组成。我们将使用 Docker Compose 来定义和运行这两个服务。
首先,我们需要创建两个服务的基本文件:
- 前端 - 一个简单的 HTML 文件,我们将使用 Nginx 来服务这个文件。
- 后端 - 一个简单的 Flask 应用,它将运行一个 API 端点。
前端服务
在项目根目录下创建一个名为 frontend
的文件夹,并在其中创建一个名为 index.html
的文件:
<!-- frontend/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simple Web App</title>
</head>
<body>
<h1>Welcome to the Simple Web App</h1>
<p>Backend says: <span id="backend-message"></span></p>
<script>
fetch('/api/message')
.then(response => response.text())
.then(data => {
document.getElementById('backend-message').textContent = data;
});
</script>
</body>
</html>
接下来,我们需要一个 Nginx 配置文件来服务这个 HTML 文件。在 frontend
文件夹中创建一个名为 nginx.conf
的文件:
# frontend/nginx.conf
events { }
http {
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
后端服务
在项目根目录下创建一个名为 backend
的文件夹,并在其中创建一个名为 app.py
的文件:
# backend/app.py
from flask import Flask
app = Flask(__name__)
@app.route('/api/message')
def message():
return 'Hello from the backend!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Docker Compose 配置
现在我们有了前端和后端的基本文件,我们可以创建一个 docker-compose.yml
文件来定义这两个服务:
version: '3'
services:
frontend:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./frontend/nginx.conf:/etc/nginx/nginx.conf
- ./frontend/index.html:/usr/share/nginx/html/index.html
backend:
image: python:3.8-slim
ports:
- "5000:5000"
volumes:
- ./backend:/app
command: python app.py
在这个 docker-compose.yml
文件中:
- 我们定义了两个服务:
frontend
和backend
。 - 对于
frontend
服务,我们使用nginx:latest
镜像,并将宿主机的 8080 端口映射到容器的 80 端口。我们还挂载了两个卷,一个用于 Nginx 配置文件,另一个用于 HTML 文件。 - 对于
backend
服务,我们使用python:3.8-slim
镜像,并将宿主机的 5000 端口映射到容器的 5000 端口。我们还挂载了一个卷,将宿主机的backend
文件夹映射到容器的/app
目录,并指定了运行 Flask 应用的命令。
运行 Docker Compose
在项目根目录下,运行以下命令来启动服务:
docker-compose up
现在,打开浏览器并访问 http://localhost:8080
,你应该会看到前端页面,它通过 JavaScript 调用后端的 /api/message
端点,并在页面上显示返回的消息。