简介
抛出问题
- 如果有100 个项目需要启动, 通过手动方式一个一个地去启动, 耗时耗力, 并且服务与服务之间的依赖关系复杂, 使项目维护工作量巨大
Dokcer Compose 解决的问题
- 可以轻松高效地管理容器
- 定义运行多个容器
官方介绍
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:
- Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
- Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
- Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
从中可以获取到如下信息:
- docker compose 是一个用来定义和运行多容器的docker 应用程序
- 在docker compose 中, 使用yml 文件来配置应用服务
- 使用简单的命令即可创建和启动所有服务 (命令有哪些?)
- docker compose 可用于所有的环境 (生产, 测试和开发)
- 使用docker-compse, 只需以下3 个步骤:
- 使用dockerfile 来定义服务的环境, 这样的话就可以在任何地方被重复生产
- 在docker-compose.yml 文件中定义组成应用的服务, 以便他们可以一起运行在一个独立的环境中 (什么是服务? ocker-compose.yml 这个文件怎么写?)
- 使用docker compose up 命令来运行
作用
- 批量容器编排 (通过一个yml 文件来启动多个服务)
理解
- Compose 是docker 官方的开源项目, 需要安装
Dockerfile 可以让项目在任何地方运行, 使运维和开发的边界边的模糊, 如果存在web 服务, redis, mysql, nginx 等多个容器, , 逐个写Dockerfile 文件再去启动工作量巨大, 这时可以使用docker compse, 只需要类似如下的yml 文件, 就可以构建整个项目的环境
version: "3.9" # optional since v1.27.0services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redisvolumes:logvolume01: {}
服务 (services):
- 可以理解为容器 (e.g. web, redis, mysql, …)
- 项目 (project)
- 一组关联的服务 (容器), e.g. 跑一个博客的项目 (web + mysql + 页面 + …)
安装
- 下载
```shell
官方下载地址, 不建议使用, 速度非常慢
curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
使用国内的下载地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s-uname -m` > /usr/local/bin/docker-compose
看到两个100% 的话, 就说明下载成功
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 423 100 423 0 0 714 0 —:—:— —:—:— —:—:— 714 100 16.7M 100 16.7M 0 0 133k 0 0:02:08 0:02:08 —:—:— 4723k
可以看到对应目录下的docker-compose 文件<br />2. 授权```shellchmod +x /usr/local/bin/docker-compose
- 测试命令
如果version 命令成功, 说明安装成功
体验
- 地址: https://docs.docker.com/compose/gettingstarted/ (按照步骤走下来即可)
步骤
创建工程文件夹:
mkdir composetestcd composetest
在该目录下创建名为app.py 的python 文件, 并编辑其内容: ```python import time
import redis from flask import Flask
app = Flask(name)
这里host 没有写ip 地址, 而是通过容器名来访问
cache = redis.Redis(host=’redis’, port=6379)
def get_hit_count(): retries = 5 while True: try: return cache.incr(‘hits’) except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5)
@app.route(‘/‘) def hello(): count = get_hit_count() return ‘Hello World! I have been seen {} times.\n’.format(count)
3. 创建名为requirement.txt 的python 依赖文件, 指定依赖:```pythonflaskredis
- 在当前目录下创建dockerfile 文件, 并编辑其内容:
其目的为: 将应用打包为镜像
# syntax=docker/dockerfile:1#从Python3.7-alpine 镜像开始构建镜像FROM python:3.7-alpine#将工作目录设置为/codeWORKDIR /codeENV FLASK_APP=app.pyENV FLASK_RUN_HOST=0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtEXPOSE 5000COPY . .CMD ["flask", "run"]

- 创建名为docker-compose.yml 文件, 并编辑其内容:
其目的为: 定义整个服务和需要的环境 (web + redis)
version: '3'services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"# 此Compose 文件定义了两个服务, web 和redis
使用docker-compose up 命令运行:
docker-compse up

测试访问:
流程总结
- 创建网络
- 执行docker-compose.yml
- 启动服务
额外操作
- 如果想要下次启动时更快, 可以执行如下操作:

- 使用docker ps 命令查看正在运行的容器, 可以发现redis 和compose-web 容器正在运行:

分析
- 通过docker-compose up 命令可以自动下载镜像:

- 通过docker ps 命令可以发现, 每个容器的名字是以以下格式来命名的:
- 项目名 + 服务名 + number
- 解释: number 为该服务的副本数量, 通过compose 可以部署多个项目, 如果每个项目都用到的相同的组件(如redis), 则不容易分清每个容器属于哪个项目, 还有一个原因是因为, 如果项目是以集群的方式部署, 则组件不可能只有一个运行实例, 应该是弹性的, 所以需要加number 来区分每个容器
- 网络规则:
- 通过docker-compose up 命令, 可以发现自动生成了一个docker 网络:

- 在同一个docker 网络下, 就可以通过容器名来访问 (不需要使用再ip 来访问, 因为ip 地址在启动容器时是随机分配的)
停止docker-compose
- 只能在有docker-compose.yml 的目录下使用停止命令

yml 规则
version: ‘’ #版本 services: #服务 服务1: (e.g. web)
# 服务配置(e.g. images, build, network, ....)
服务2: …
其他配置(e.g. 网络, 卷, 全局规则, etc…)
volumes: networks: configs:
- 其中配置项的每个详情介绍都能在以下的链接中找到:- [https://docs.docker.com/compose/compose-file/](https://docs.docker.com/compose/compose-file/)<a name="XbQ7T"></a>## depends_on 配置项- 作用:- 用于指定容器的启动顺序, 如上, 先启动db, 再启动redis<a name="bLvTy"></a># 开源项目: WordPress<a name="uppNI"></a>## 步骤1. 创建工程文件夹:```shellmkdir my_wordpresscd my_wordpress
- 在当前目录下创建dockerfile 文件, 并编辑其内容: ```yaml version: “3”
services: db: image: mysql:5.7 volumes:
- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpress
wordpress: depends_on:
- dbimage: wordpress:latestvolumes:- wordpress_data:/var/www/htmlports:- "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: dbWORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
volumes: db_data: {} wordpress_data: {}
3. 使用docker-compose up 命令运行:```shelldocker-compse up

- 使用docker ps 命令查看正在运行的容器, 可以发现mysql 和wordpress 容器正在运行:

- 测试访问:


- 后台启动

Docker Compose 使用思路:
- 下载项目 (根据docker-compose.yml)
- 如果需要文件 (提供dockerfile, 主要使用add, run 等指令在容器中操作)
- 文件准备齐全, 一键启动项目
实战: 部署编排自定义项目
步骤
- 编写微服务项目
- dockerfile 构建镜像 ```dockerfile FROM java:8
COPY *.jar /app.jar
CMD [“—server.port=8080”]
EXPOSE 8080
ENTRYPOINT [“java”, “-jar”, “/app.jar”]
3. docker-compose.yml 编排项目```yamlversion: '3'services:app:build: .image: appdepends_on:- redisports:- "8080:8080"redis:image: "library/redis:alpine"
- 上传到服务器, docker-compose up 启动项目


- 测试访问:

- 如果需要重新部署打包, 可以使用以下命令:
docker-compose up --build #重新构建
