官方文档:https://docs.docker.com/compose/

简介

Docker Compose是一种工具,旨在帮助定义和共享多容器应用程序。使用 Compose,我们可以创建一个 YAML 文件来定义服务,并且可以使用单个命令来启动或拆除所有内容。
微服务多并且存在依赖关系,通过Docker Compose来简单高效管理、运行多个容器。

安装 Docker Compose
docker-compose version
体验

第 1 步:设置

  1. 为项目创建一个目录
cd /Users/docker-study
mkdir composetest
cd composetest
  1. 新建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)
  1. 新建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命令等

Docker Compose容器编排_flask

# 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/

  1. 创建项目目录
cd my_wordpress/
  1. 编写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: {}
  1. 启动
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
  1. 访问
    localhost:8000
    Docker Compose容器编排_jar_02
    Docker Compose容器编排_redis_03
实战
  1. 项目application.properties
server.port=8080
spring.redis.host=redis
  1. Dockfile文件
FROM java:8

COPY target/*.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]
  1. 编写docker-compose.yml文件
version: 3.9
services:
  mpy-app:
    build: .
    image: mpy-app
    depends_on:
      - redis
    ports:
      - "8080:8080"
  redis:
    image: "library/redis:alpine"
  1. 运行
# 端口8080被占用
docker-compose up 
lsof -i:8080 
# 停止占用端口的容器
docker stop 容器id
docker-compose up --build
  1. 访问测试
    http://localhost:8080/hello 返回:hello docker, views = 1
总结

compose 3层:

  • 工程:Project
  • 服务:docker镜像
  • 容器:运行实例 docker 、k8s