六、Docker Compose
简介
DockerFile build run 手动操作,单个容器
Docker Compose 能够高效管理容器,运行多个容器
官方文档:https://docs.docker.com/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 rundocker-compose up
using the docker-compose binary.
- 翻译:
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务。要了解有关 Compose 的所有功能的更多信息,请参阅功能列表
Compose 适用于所有环境:生产、上线、开发、测试以及 CI 工作流程。您可以在常见用例中了解有关每个案例的更多信息
使用 Compose 基本上是一个三步过程:
- 使用一个
Dockerfile
定义你的应用程序的环境,以便可以在任何地方复制它 - 定义构成你的应用程序的服务,
docker-compose.yml
以便它们可以在隔离环境中一起运行 - 运行
docker compose up
,Docker compose 命令启动并运行您的整个应用程序。您也可以docker-compose up
使用 docker-compose 二进制文件运行
- 作用:批量容器编排
Compose 是 Docker 官方的开源项目,需要安装
简单的Compose实例(docker-compose.yml)
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
- 解析:有两个服务:web、redis,并且这两个服务的网络连接起来了
6.1 安装 Compose
下载地址:https://docs.docker.com/compose/install/
国内地址:https://get.daocloud.io/#install-compose
# 使用国内镜像下载,可根据自己的情况指定下载后的路径
# /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 安装成功
6.2 快速开始(按照官方说明)
官方文档:https://docs.docker.com/compose/gettingstarted/
创建文件
- 为工程建立文件目录
# 选择在 /home 目录下创建,可自定选择
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)
创建Dockerfile文件
[root@vinjcent composetest]# pwd
/home/composetest
[root@vinjcent composetest]# vim 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"]
# =================================文件内容=================================
在Compose文件中定义所需的服务
- 在当前目录下创建一个
docker-compose.yml
文件
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
使用Compose构建和运行app
【注】需要从当前的工程文件下运行,必须有这四个文件
# 运行命令,后台运行添加参数 -d 即可
docker-compose up
- 查看正在运行的docker容器
- 测试访问web
[root@vinjcent composetest]# curl localhost:8000
- 查看下载镜像
# 查看所有docker服务
[root@vinjcent composetest]# docker service ls
默认的服务名 文件名-服务名-num
num 代表副本的数量
- 项目中的内容都在同一个网络下(手动配置),网络自动生成
- 查看网络信息
如果在同一个网络下,可以直接通过域名访问
有效避免了服务出现故障之后,重新启动服务时,容器分配的域名发生改变(从172.27.0.2 => 172.27.0.3),保证HA(高可用)
停止运行Compose
# 需要在容器外部的存放yml文件的目录下执行
docker-compose down
# 快捷键需要在容器启动的地方使用
Ctrl + C
6.3 Compose配置编写规则
yml 规则
主要有三层
官方说明文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
##### 三层
### 第一层: 版本
version: "" # 版本
services: # 多个服务配置
redis: # 服务1
### 第二层: 服务配置(docker容器的配置)
container_name: my-redis-container # 容器名称
images: redis:latest # 镜像拉取
build: .
depends_on: # 设置启动顺序依赖,先启动db服务,再启动redis
- db
- redis
network # 网络配置
...
web: # 服务2
...
mysql: # 服务3
...
### 第三层: 其它配置: 网络、卷、全局规则...
volumes:
networks:
configs:
6.4 使用Compose一键部署博客
用例测试
# 在 /home 目录下创建一个文件目录 my_wordpress
mkdir my_wordpress
cd my_wordpress/
# 创建一个docker-compose.yml文件
mkdir 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
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
# =====================================文件内容=====================================
# 过程有点久,耐心等待
[root@vinjcent my_wordpress]# docker-compose up
测试访问:http://192.168.159.100:8000/
- 注册自己的账号密码
- 登录个人博客
6.5 SpringBoot微服务上线
- 编写一个springboot项目
- dockerfile 构建镜像
- docker-compose.yml 编排项目
- 打包springboot项目,并将三个文件上传到Linux
- 运行命令 docker-compose up
1)创建一个SpringBoot工程,导入依赖
<dependencies>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2)编写controller
package com.vinjcent.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SuppressWarnings("all")
@RestController
public class HelloController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello() {
long views = redisTemplate.opsForValue().increment("views");
return "hello,vinjcnet,views: "+ views;
}
}
3)在该工程下创建一个Dockerfile
文件
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=3035"]
EXPOSE 3035
ENTRYPOINT ["java","-jar","/app.jar"]
4)在该工程下创建一个docker-compose.yml
文件
version: '3.9'
services:
vinjcentapp:
build: .
image: vinjcentapp:1.0
depends_on:
- redis
ports:
- "3035:3035"
redis:
image: "redis:alpine"
5)将该工程打成一个jar包
6)将三个文件上传到 Linux 上的文件夹中
7)在该目录下运行命令
docker-compose up
# 重新构建
docker-compose up --build
8)测试访问
curl localhost:3035