Docker Compose容器编排
官方文档:https://docs.docker.com/compose/
简介
Docker Compose是一种工具,旨在帮助定义和共享多容器应用程序。使用 Compose,我们可以创建一个 YAML 文件来定义服务,并且可以使用单个命令来启动或拆除所有内容。
微服务多并且存在依赖关系,通过Docker Compose来简单高效管理、运行多个容器。
安装 Docker Compose
docker-compose version
体验
第 1 步:设置
- 为项目创建一个目录
cd /Users/docker-study
mkdir composetest
cd composetest
- 新建app.py文件
import time
import redis
from flask import Flask
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)
- 新建requirements.txt文件
flask
redis
第 2步: 创建一个 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"]
第 3 步:在 Compose 文件中定义服务
创建docker-compose.yml 文件
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
这个 Compose 文件定义了两个服务:web和redis.
第 4 步:使用 Compose 构建并运行您的应用程序
docker-compose up
第 5步: 测试
访问:http://0.0.0.0:5000/ 或者终端执行 :curl localhost:5000
小结
docker service 命令查看
docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
服务默认命名:文件名_服务名_num (比如:composetest_redis_1、composetest_web_1)
集群状态下 服务不可能只有一个实例。都是弹性扩缩容。后面通过Docker Swarm来弹性扩缩容
docker network ls
7502b862c0af composetest_default bridge local
如果在同一个网络下 可以直接使用域名访问
停止
docker-compose stop
以前都是docker run
运行单个服务 ,通过docker-compose
编写yaml配置文件,可以一键启动、停止所有服务
Compose配置编写规则
docker-compose.yaml 核心
官方文档:https://docs.docker.com/compose/compose-file/ 查看Compose版本和 Docker版本对应关系,Compose命令等
# 3层
version: 3.8 # 版本
service: # 服务
服务1: web
# 服务配置
images
build
network
服务2: redis
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:
命令 | 说明 |
---|---|
depends_on | 控制容器启动顺序 |
使用Compose一键部署WP博客
官方地址: https://docs.docker.com/samples/wordpress/
- 创建项目目录
cd my_wordpress/
- 编写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: {}
- 启动
docker-compose up -d
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
去dockerHub搜索镜像会发现,mysql5.7是amd64的架构,也就是Intel CPU的架构,也叫做x86_64。存在适配型问题,m1的芯片没有适合的镜像。
docker官方提供的MySQL没有arm64架构的,但MySQL官方提供的mysql/mysql-server有
# 修改yml文件:image: mysql:5.7 ==》 image: mysql/mysql-server
docker pull mysql/mysql-server
- 访问
localhost:8000
实战
- 项目application.properties
server.port=8080
spring.redis.host=redis
- Dockfile文件
FROM java:8
COPY target/*.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
- 编写docker-compose.yml文件
version: 3.9
services:
mpy-app:
build: .
image: mpy-app
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
- 运行
# 端口8080被占用
docker-compose up
lsof -i:8080
# 停止占用端口的容器
docker stop 容器id
docker-compose up --build
- 访问测试
http://localhost:8080/hello 返回:hello docker, views = 1
总结
compose 3层:
- 工程:Project
- 服务:docker镜像
- 容器:运行实例 docker 、k8s