Docker Compose 是 Docker 官方提供的一个用于定义和运行多个 Docker 容器的工具。它可以通过一个 YAML 文件来定义应用的各个服务,然后使用一个命令就可以启动、停止和重启整个应用。
Docker Compose 的安装
Docker Compose 可以通过 pip 工具安装,前提是已经安装了 Docker。如果还没有安装 Docker,请先参考 Docker 官方文档进行安装。
安装 Docker Compose 的命令如下:
$ sudo pip install docker-compose
安装成功后,可以通过以下命令来检查版本:
$ docker-compose --version
Docker Compose 的使用
编写 Docker Compose 文件
Docker Compose 的核心是一个 YAML 文件,用于定义应用的各个服务。以下是一个简单的示例:
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
这个 YAML 文件定义了两个服务:web 和 redis。web 服务使用当前目录下的 Dockerfile 来构建镜像,并将容器的 5000 端口映射到主机的 5000 端口;redis 服务使用官方的 Redis 镜像。
启动应用
使用以下命令来启动应用:
$ docker-compose up
这个命令会启动所有定义的服务,并将它们的日志输出到终端。如果想在后台运行,可以使用 -d
参数:
$ docker-compose up -d
停止应用
使用以下命令来停止应用:
$ docker-compose down
这个命令会停止并删除所有容器和网络。
其他常用命令
以下是一些其他常用的 Docker Compose 命令:
docker-compose ps
:查看当前运行的容器。docker-compose logs
:查看容器的日志输出。docker-compose build
:构建所有服务的镜像。docker-compose restart
:重启所有服务。docker-compose stop
:停止所有服务。
Docker Compose 的案例分析
Flask 应用
以下是一个使用 Docker Compose 运行 Flask 应用的示例。
Dockerfile
// javascriptcn.com 代码示例 FROM python:3.7-alpine WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]
这个 Dockerfile 使用 Python 3.7 的 Alpine 版本作为基础镜像,并安装应用所需的 Python 包。最后启动应用的入口是 app.py 文件。
docker-compose.yml
// javascriptcn.com 代码示例 version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/app depends_on: - db environment: - FLASK_ENV=development - FLASK_APP=app.py db: image: postgres:11-alpine environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=myapp
这个 YAML 文件定义了两个服务:web 和 db。web 服务使用当前目录下的 Dockerfile 来构建镜像,并将容器的 5000 端口映射到主机的 5000 端口;另外还将当前目录挂载到容器的 /app 目录,以便在开发过程中进行实时调试。web 服务还依赖于 db 服务,因此在启动时会先启动 db 服务。db 服务使用官方的 PostgreSQL 镜像,并设置了默认的用户名、密码和数据库名。
app.py
// javascriptcn.com 代码示例 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@db/myapp' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) @app.route('/') def index(): users = User.query.all() return 'Hello, {}!'.format(', '.join([u.name for u in users])) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
这个 app.py 文件定义了一个简单的 Flask 应用,其中使用了 SQLAlchemy 来访问 PostgreSQL 数据库。在数据库中定义了一个 User 表,并在首页中显示所有用户的姓名。
Node.js 应用
以下是一个使用 Docker Compose 运行 Node.js 应用的示例。
Dockerfile
// javascriptcn.com 代码示例 FROM node:12-alpine WORKDIR /app COPY package*.json ./ RUN npm install --only=production COPY . . CMD ["npm", "start"]
这个 Dockerfile 使用 Node.js 12 的 Alpine 版本作为基础镜像,并安装应用所需的 Node.js 包。最后启动应用的入口是 package.json 文件中定义的 start 命令。
docker-compose.yml
// javascriptcn.com 代码示例 version: '3' services: web: build: . ports: - "3000:3000" volumes: - .:/app depends_on: - db environment: - NODE_ENV=development - DB_HOST=db db: image: postgres:11-alpine environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=myapp
这个 YAML 文件定义了两个服务:web 和 db。web 服务使用当前目录下的 Dockerfile 来构建镜像,并将容器的 3000 端口映射到主机的 3000 端口;另外还将当前目录挂载到容器的 /app 目录,以便在开发过程中进行实时调试。web 服务还依赖于 db 服务,因此在启动时会先启动 db 服务。db 服务使用官方的 PostgreSQL 镜像,并设置了默认的用户名、密码和数据库名。
app.js
// javascriptcn.com 代码示例 const express = require('express'); const { Pool } = require('pg'); const app = express(); const pool = new Pool({ user: 'postgres', password: 'postgres', host: 'db', database: 'myapp', port: 5432, }); app.get('/', async (req, res) => { const result = await pool.query('SELECT name FROM users'); const names = result.rows.map(row => row.name).join(', '); res.send(`Hello, ${names}!`); }); app.listen(3000, () => { console.log('App listening on port 3000!'); });
这个 app.js 文件定义了一个简单的 Express 应用,其中使用了 pg 库来访问 PostgreSQL 数据库。在数据库中定义了一个 users 表,并在首页中显示所有用户的姓名。
总结
Docker Compose 是一个非常实用的工具,可以方便地管理多个容器的运行。在实际开发中,可以根据不同的需求来编写不同的 Docker Compose 文件,以提高开发效率和运维管理能力。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656c764dd2f5e1655d4d542e