Docker Compose
1、Docker Compose 是什么
Compose 是用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。
Compose 使用的三个步骤:
-
使用 Dockerfile 定义应用程序的环境
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
-
最后,执行
docker-compose up
命令来启动并运行整个应用程序
docker-compose.yml 的配置案例:
version: "3.9" # 自 v1.27.0 起可选
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose 是官方开源项目,需要自行安装!
Compose 重要的概念:
- 服务 services:容器。应用。(web、Redis、MySQL、…)
- 项目 project:一组关联的容器。
2、Docker Compose 的安装
Docker Compose 需要 Docker Engine
Docker Compose 插件需要 Docker CLI
2.1、下载
# github 上
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像地址,可能比较快
# 要安装其他版本的 Compose,请替换 v2.6.1
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2.2、授权
$ sudo chmod +x /usr/local/bin/docker-compose
2.3、创建软链
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2.4、检查是否安装成功
$ docker-compose --version
3、Docker Compose 初体验
开始使用 Docker Compose |Docker 文档
构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。 该应用程序使用 Flask 框架并在 Redis 中维护一个命中计数器。
前提
同时安装了 Docker Engine 和 Docker Compose。
3.1、准备
- 为项目创建一个目录:
$ 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
3.2、创建 Dockerfile
在此步骤中,您将编写一个用于构建 Docker 镜像的 Docker 文件。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。
在项目目录中,创建一个名为 Dockerfile
的文件并粘贴以下内容:
# syntax=docker/dockerfile:1
FROM python:3.7-alpine # 从 Python 3.7 镜像开始构建镜像。
WORKDIR /code # 将工作目录设置为: /code
ENV FLASK_APP=app.py # 设置 FLASK 命令使用的环境变量
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers # 安装 gcc 和其他依赖项
COPY requirements.txt requirements.txt # 复制并安装 Python 依赖项。requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000 # 容器暴露的端口: 5000
COPY . . # 将项目中的当前目录复制到镜像中的工作目录。
CMD ["flask", "run"] # 将容器的默认命令设置为:flask run
3.3、在 Compose 文件中定义服务
在您的项目目录中创建一个名为 docker-compose.yml
的文件并粘贴以下内容:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
这个 Compose 文件定义了两个服务:web
和 redis
。
- web: 该 web 服务使用当前目录中的 Dockerfile 来构建镜像。 然后它将容器和主机绑定到暴露的端口8000,此示例服务使用 Flask Web 服务器的默认端口 5000
- redis:该 redis 服务使用 Docker Hub 的公共 Redis 镜像。
3.4、使用 Compose 构建和运行创建的应用程序
- 从项目目录中,通过运行以下命令来启动应用程序:
$ docker-compose up
# 如果你想在后台执行该服务可以加上 -d 参数:
$ docke-compose up -d
流程:
- 访问测试
Web 应用现在应该在 Docker 守护程序主机上的端口 8000 上侦听,访问测试。刷新页面。该数字应递增。
$ curl localhost:8000
- 切换到另一个终端窗口,然后查看本地镜像。
# 查看容器
$ docker ps
# 查看本地镜像
$ docker images
- 停止运行
通过在启动应用的原始终端中按 Ctrl+C 来停止应用程序。通过从第二个终端的项目目录中运行 docker compose down
。
^C # ctrl+c
Gracefully stopping... (press Ctrl+C again to force)
[+] Running 2/2
⠿ Container composetest-web-1 Stopped 10.2s
⠿ Container composetest-redis-1 Stopped 0.3s
canceled
3.5、拓展
服务
[root@localhost ~]$ 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
。 _num
:表示副本数量。当有多个服务器部署集群时,进行了解。
网络
例:拥有10个服务的项目,项目中的内容都在同一个网络下、通过域名访问。如:MySQL:3306
,这个 MySQL
就是一个域名,如果有10个MySQL容器实例,则有10个IP地址,用IP写死不灵活,可以使用域名来绑定这10个IP,到时直接使用域名就方便了。
在同一个网段下,可以通过域名来访问。以下为官方的例子:
理解
以前都是单个 docker run
启动。
docker-compose
通过编写 yml
配置文件,一键启动和停止所有的服务。
4、yml 配置指令
官网地址:Compose file version 3 reference | Docker Documentation
菜鸟教程:Docker Compose | 菜鸟教程 (runoob.com)
核心:docker-compose.yml
, 可以分为3层。
# 三层
version: "" # 1、版本
services: # 2、服务
服务1: web
服务2: redis
...
# 服务配置 docker容器的配置
# 3、其他配置 网络、卷、全局规则
networks:
volumes:
configs:
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定为构建镜像上下文路径。
depends_on
设置依赖关系。
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
- docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
- docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.8"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意: web 服务不会等待 redis db 完全启动之后才启动。
deploy
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
多练习使用才能了解更多!
5、开源项目
快速入门:Compose 和 WordPress |Docker 文档
5.1、创建项目目录
创建一个空的项目目录
$ mkdir my_wordpress
$ cd my_wordpress/
5.2、编写 yml 文件
创建一个 docker-compose.yml
文件,该文件启动 WordPress blog
和一个单独的 MySQL
实例,该实例具有用于数据持久性的卷挂载:
- 了解有关 Docker 卷的更多信息
- WordPress Multisite 仅适用于端口:
80
443
version: "3.8"
services:
db:
# 我们使用支持 amd64 和 arm64 架构的 mariadb 镜像
image: mariadb:10.6.4-focal
# 如果您真的想使用 MySQL,请取消注释以下行
image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data: {}
5.3、构建项目
注意: WordPress Multisite 仅适用于端口 80/443 。 如果您收到有关绑定到端口 0.0.0.0:80/443 的错误消息(取决于您指定的端口),则您为 WordPress 配置的端口可能已被其他服务使用。
$ docker-compose up
5.4、测试
注意: WordPress 站点无法立即在端口上使用,因为容器仍在初始化中,可能需要几分钟才能首次加载。
在浏览器中查看 WordPress:http://192.168.40.25:80
5.5、关机和清理
# 该命令会删除容器和默认网络,但保留您的 WordPress 数据库。
$ docker-compose down
# 该命令会删除容器、默认网络和 WordPress 数据库。
$ docker-compose down --volumes
6、实战
6.1、创建项目
使用IDEA创建 SpringBoot 项目,勾选 Spring Web
和 Spring Data Redis
。
6.2、编写代码和配置文件
HelloController.java
/**
* @desc
* @auth llp
* @date 2022年07月20日 23:48
*/
@RestController
public class HelloController {
@Autowired
private StringRedisTemplate redisTemplate;
@RequestMapping("/hello")
public String hello(){
Long views = redisTemplate.opsForValue().increment("views");
return "hello mianbao, docker compose views: " + views;
}
}
application.properties
# 应用名称
spring.application.name=dockerComposeDemo
# 应用服务 WEB 访问端口
server.port=8080
# redis 地址
spring.redis.host=redis
6.3、编写 Dockerfile 构建镜像
FROM openjdk:8u332-jdk
# 服务器 dockerfile 和 jar 在同级目录
COPY *.jar /app.jar
CMD ["--server.port=8080"]
# 指定容器内要暴露的端口
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
6.4、编写 docker-compose.yml 编排项目
version: "3.8"
services:
mianbao_app:
# 当前目录下的 Dockerfile
build: .
image: mianbao_app
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "redis:alpine"
6.5、打成 Jar 包上传 Jar包
6.6、运行
$ docker-compose up
防火墙记得打开端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --add-port=8080/tcp
firewall-cmd --reload
# 查看已开启的端口
firewall-cmd --list-port
Docker Swarm
Swarm mode overview | Docker Documentation
如何工作
Docker Engine 1.12 引入了 swarm 模式,使您能够创建一个由一个或多个 Docker 引擎组成的集群,称为 swarm。 一个 swarm 由一个或多个节点组成:在 swarm 模式下运行 Docker Engine 1.12 或更高版本的物理机或虚拟机。
有两种类型的节点:管理节点 and 工作节点. woker就是工作的,manager就是操作的。
命令
$ docker swarm --help
使用方式: docker swarm COMMAND
管理集群
命令:
ca 显示和旋转 root CA
init 初始化一个集群
join 作为节点和/或管理器加入集群
join-token 管理加入令牌
leave 离开集群
unlock 解锁集群
unlock-key 管理解锁密钥
update 更新集群
运行 'docker swarm COMMAND --help' 以获取有关命令的更多信息。
$ docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string 广播地址 (format: <ip|interface>[:port])
# 获取令牌
$ docker swarm join-token manager
$ docker swarm join-token worker
# 查看集群节点
$ docker node ls
Raft 协议
保证大多数节点存活才可以使用。3个主节点的集群要大于1个管理节点存活。
了解容器==>服务 的概念
$ docker service --help
使用方式: docker service COMMAND
管理服务
命令:
create 创建新服务
inspect 显示一项或多项服务的详细信息
logs 获取服务或任务的日志
ls 列出服务
ps 列出一项或多项服务的任务
rm 删除一项或多项服务
rollback 恢复对服务配置的更改
scale 扩展一个或多个复制服务
update 更新服务
运行 'docker service COMMAND --help' 以获取有关命令的更多信息。
$ docker run 容器启动!不具有扩缩容
$ docker servcice 服务!具有扩缩容,滚动更新
总结
搭建集群、启动服务、动态管理容器。
Docker stack
docker-compose : 单机部署项目
docker-stack: 集群部署
# 单机
$ docker-compose up -d wordpress.yml
# 集群
$ docke-stack deploy wordpress.yml
[root@localhost mianbao_app]# docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
Docker Secret
[root@localhost mianbao_app]# docker secret
Usage: docker secret COMMAND
Manage Docker secrets
Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets
Run 'docker secret COMMAND --help' for more information on a command.
Docker Config
[root@localhost mianbao_app]# docker config --help
Usage: docker config COMMAND
Manage Docker configs
Commands:
create Create a config from a file or STDIN
inspect Display detailed information on one or more configs
ls List configs
rm Remove one or more configs
Run 'docker config COMMAND --help' for more information on a command.