Docker笔记(进阶篇)— Docker Compose
Docker Compose
1、简介
官方介绍
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.
- 如何定义、运行多个容器
- YAML file 配置文件
- single commend 有哪些
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.
- 所有的环境都可以使用Docker Compose
Using Compose is basically a three-step process: 使用的三个步骤
-
Define your app’s environment with a
Dockerfileso it can be reproduced anywhere.Dockerfile 保证我们的项目(app)可以在任何地方运行
-
Define the services that make up your app in
docker-compose.ymlso they can be run together in an isolated environment.进行配置服务在YAML配置文件当中
-
Run
docker compose upand the Docker compose command starts and runs your entire app. You can alternatively rundocker-compose upusing the docker-compose binary.启动我们的项目(app)
总结:批量的容器编排 ,可以管理多个服务(容器)
Compose 是Docker官方的一个开源项目,所以需要安装!
配置文件:docker-compose.yml
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
我们的任务就是编写这样一个配置文件,管理我们的多个服务(容器)
实现通过docker-compose up 同时启动多个服务
2、安装 Compose
地址:https://docs.docker.com/compose/install/
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vi56DJBE-1638112702262)(Docker笔记(进阶篇).assets/image-20211128194306933.png)]](https://images2.imgbox.com/b0/2d/v9DsyYrB_o.png)
1、下载Docker-Compose
#安装在Linux系统中
csudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#安装太慢的 把github源换成get.daocloud.io
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
去到安装目录检查:下载成功!
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTS1WWS9-1638112702264)(Docker笔记(进阶篇).assets/image-20211128194651151.png)]](https://images2.imgbox.com/50/79/ckpTvr9m_o.png)
2、设置文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose
3、查看版本信息
docker-compose -version

4、卸载Docker-Compose
sudo rm /usr/local/bin/docker-compose
3、快速体验Docker Compose
参考文档:https://docs.docker.com/compose/gettingstarted/
1、创建目录,所有操作都在这个目录下进行
mkdir composetest
cd composetest
2、创建一个py应用,(类似统计浏览次数,计数器)
import time
import redis #导入了我们的redis
from flask import Flask #导入了我们的Flask(python的一个框架依赖)
app = Flask(__name__)
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、创建一个配置文本requirements.txt
flask
redis
4、创建Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
5、创建docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
6、启动
docker-compose up
启动成功!
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCabLCrP-1638112702266)(Docker笔记(进阶篇).assets/image-20211128204558475.png)]](https://images2.imgbox.com/fd/ce/Igt48BNK_o.png)
测试结果
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RXnydnZ-1638112702267)(Docker笔记(进阶篇).assets/image-20211128204627917.png)]](https://images2.imgbox.com/fc/9a/SYaTi2o0_o.png)
hh,一键启动两个应用确实舒服!
4、Docker Compose默认配置
1、自动下载配置文件docker-compose.yml中的镜像
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2z589Lp-1638112702269)(Docker笔记(进阶篇).assets/image-20211128204905248.png)]](https://images2.imgbox.com/02/68/UtiVn4kR_o.png)
2、自动生成服务名字 文件名_服务名 _num
Starting composetest_web_1 ... done #web服务
Starting composetest_redis_1 ... done #redis服务
3、网络规则

默认会生成一个网络,10个服务=>网络(项目中的内容都在同一个网络下,容器名访问)

在同一个网络下可以直接通过容器名(域名)访问
4、停止
- docker-compose down :需要在compose的yaml配置文件目录执行,不然是找不到的!
- ctrl + c
小节
1、Docker镜像,run ==> 容器
2、Dockerfile构建镜像(服务打包)
3、docker-compose启动项目(编排,多个微服务/环境)
4、Docker网络!
5、项目需要更新,docker compose up --build 即可
5、Compose编写配置规则
参考文档 : https://docs.docker.com/compose/compose-file/compose-file-v3/
核心:编写 docker-compose.yaml
#3层
version: '' #版本
services: #服务
服务1: web
#服务配置 docker容器的配置
images:
build:
network:
depends_on: #depents_on: web服务依赖redis和mysql,让他们先启动!(这就是编排的原因)
-redis
-mysql
服务2: redis
...
服务2: mysql
...
#其他配置 网络/卷、全局规则
volumes:
network:
configs:
1、版本选择

2、服务相关配置

6、Compose一键部署WP博客
参考文档 :https://docs.docker.com/samples/wordpress/
1、创建目录并进入目录
mkdir my_wordpress/
cd my_wordpress/
2、编写docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
3、我们服务器的8000端口放行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcFQU7o6-1638112702270)(Docker笔记(进阶篇).assets/image-20211128223731932.png)]](https://images2.imgbox.com/27/99/Vw0xszmh_o.png)
4、启动Compose
docker-compose up -d
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljjIlcuQ-1638112702271)(Docker笔记(进阶篇).assets/image-20211128223818618.png)]](https://images2.imgbox.com/a8/0c/BQSW8BpC_o.png)
5、检测容器是否启动
docker ps
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rSMrmCIA-1638112702272)(Docker笔记(进阶篇).assets/image-20211128223932600.png)]](https://images2.imgbox.com/84/58/Z6O778eo_o.png)
6、访问测试:http://qxsong.top:8000/(自己的ip+8000端口)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lv2K2ZFH-1638112702272)(Docker笔记(进阶篇).assets/image-20211128224053393.png)]](https://images2.imgbox.com/11/d5/JdbP6d0L_o.png)
收工!!!