简介
安装
官方教程
PS:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
体验
地址:https://docs.docker.com/compose/gettingstarted/
示例是
构建一个简单的Python web应用程序,运行在Docker Compose上。该应用程序使用Flask框架并在Redis中维护一个命中计数器, 没访问一次 根路由, 访问次数就 加 1
- 创建一个文件夹(我这里创建在了
/home下)
mkdir composetest
cd composetest
- 创建
app.py(vim 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)
注意上面代码中 host='redis' 使用名字访问的, 这样在 docker 容器中 ip 可能变, 但名字是不变的。
3. 创建依赖文件 requirements.txt (vim requirements.txt)
flask
redis
- 创建
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
# 设置镜像, 不然下载不下来 这个包 http://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
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
# 升级 pip
# RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
- 在 Compose file 中定义服务, 创建
vim docker-compose.yml
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
- 使用Compose构建并运行应用程序
docker-compose up
- 启动完毕 测试
curl http://localhost:5000
输出
Hello World! I have been seen 1 times.
docker network inspect composetest_default
yaml 规则
官方教程
可以把它理解成 3 层
定义依赖(用来保证 服务器的顺序,后一个服务依赖前一个服务的话,要保证前一个服务起来了):docker 中的命令 基本都能 写到 docker-compose 中, docker-compose 就是把 很多 docker 命令组合到 一个 yaml 文件,
这样部署时就不用一个一个运行docker命令了
开源项目
博客
通过 docker-compose 快熟搭建一个 WordPress 博客系统
官方教程
- 常见
my_wordpress文件夹。(这里我创建在了 /home 下)shell
mkdir my_wordpress
- 切到目录
cd my_wordpress/
3.创建一个 docker-compose.yml 文件,启动你的WordPress博客和一个单独的MySQL实例与卷挂载数据 进行数据持久话:
vim docker-compose.yml
version: "3.8"
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
或 后台启动项目 (一般情况下我们使用后台启动,启动不用霸占着 命令行了)
docker-compose up -d
- 访问测试
访问服务器ip地址:8000即可。 (要保证服务器 防火墙或者安全组 允许访问8000端口)
实战:自己写微服务上线
附录:
自己实现 daocker compose 示例相同的功能
起一个 服务 依赖 redis ,没访问一次, redis 中的 值加1 , 并返回。
JAVA版:
常见 spring 项目
启动项目
创建 controller
编写 controller
配置 redis
编写 Dockerfile
编写 docker-compose
给项目打个包
PS: 如果 只有 打出来的包 只有 4、5kb
在服务请上创建一个文件夹
把文件上传到服务器. 打包后的 jar 包、 DockerFile、 docker-compose.yml
启动
如果 第一次构建失败 ,第二次想重新 构建时 可以使用
docker-compose up --build
启动成功
访问测试, 每访问一次 /hello 计数器加1
NODEJS 版
可直接跳转到 github NodeJs 版示例
Docker Swarm
集群
购买服务器
使用 xshell 连接服务器
4 台机器安装 Docker
安装
上面的命令 这样输入即可
工作模式
搭建集群
docker 网络为 最基本的
查看帮助
可以用
私网、公网, 公网是要钱的
ip addr 查看私网 ip (要用自己的 ip)
docker1 作为主节点, 初始化一个集群
加入一个 worker 节点docker2 加入 docker1 (docker1 ip 为 172.24.82.149)
在主节点上
docker1 生成 让 别的服务 加入到本集群的命令
在 docker3 中 运行 加入 命令, 使 docker3 成为 worker 节点
在 docker1 中查看所有的节点
让 docker4 成为主节点 (manager 节点)
在 docker1 主节点上 运行 docker swarm join-token manager, 生成令牌(加入主节点命令)。必须在主节点运行,这是主节点命令。
在 docker4 上运行 生成的命令
再次在 docker1 中查看所有的节点
如果有 100 台,也是一样的道理
Raft 协议
在启动 docker1 ,但是 docker1 已经不是 主节点 leader 了, 成了 docker4 了
使 docekr3 离开集群docker4 查看节点
在 管理节点上 (docker1 或 docker4) 上生成 其它工作节点 加入令牌
在 docker3 (刚刚已经离开了节点了)中运行,使其 加入的到集群,并成为 管理节点
worker 节点是 不能运行 manger 命令的,比如 docker node ls
再次将 docker1 停止
docker4 中查看
docker3 中查看
docker3 也是可用的。
此时 管理节点有 docker3 和 docker4
思考: 现在 把 docker3 也停掉 docker4 还能用吗?
停掉 docker3
docker4 中查看
发现只有一个 管理节点的时候, 集群是不可用的 (集群已经不安全了, 如果这个挂了,数据就会丢失了,所以就不允许工作了,可用性不能保证了)
最少 3 台 管理节点,这样 任意一台 挂了,其它两个还是能保证安全的(数据还能相互备份),还可以正常使用。
体会
开始前 4 台服务器是的状态为
docker1 docker3 docker4 是 manger 管理节点
docker2 是 worker 节点
灰度发布: 金丝雀发布!(不停机发布)
查看 docker services create --help 命令的使用
创建一个 服务
查看 my-nginx 集群服务 下的 进程状态
查看集群服务
REPLICAS 副本为 1
查看服务的详细信息 docker service inspect my-nginx
我们在 docker1 中启动 nginx,看看启动到了哪里
分别 在 docker2 docker3 docker4 中运行 docker ps, 发现帮我们启动到了 docker3 上
假如现在 我们的网站 访问人数上升了,要对 nginx 进行 扩缩容,对 nginx 更新成 3 个副本
再看看 启动到哪里了
docker4 查看
docker3 查看
docker2 查看
使用 docker 1 ~ 4 中的任意 一台 外网 ip 都可以访问到, 这里是 用的 docker2 外网 IP 的
docker1 中是 没有 运行 nginx 容器的
使用 docker1 外网 ip 访问 测试
图解:
动态扩缩容
如果我们将 副本 扩到 10 个, 也是可以的
查看 docker4 现在运行的容器 (2个)
查看 docker3 现在运行的容器 (2个)
查看 docker2 现在运行的容器 (3个)
查看 docker1 现在运行的容器 (3个)
加起来 刚好 2 + 2 +3 + 3 10个
加入没有这么大的需求了, 不想要这么多 副本了, 也是可以回滚的,
将副本 回滚到 1个
在管理节点上 运行 docker service update --replicas 1 my-nginx
查看 docker4 现在运行的容器 (0个)
查看 docker3 现在运行的容器 (1个)
查看 docker2 现在运行的容器 (0个)
查看 docker1 现在运行的容器 (0个)
--
刚刚使用 docker service update --replicas [副本数] [服务名] 也可以使用 docker service scale 进行扩缩容
让 my-nginx 动态扩缩容到 5 份
让 my-nginx 动态扩缩容到 2 份
这个 较方便一些比 docker service update
移除
如果想要 移除一个服务
查看 就没有 my-nginx 服务了
概念总结
swarm
Node
Service (我们在用的时候 也主要操作这一层)
Task
docker 引擎原理
逻辑是不变的 *(和 k8s)
服务副本与全局服务
(可以指定 服务的模式 是 全局模式 还是 副本模式, 全局服务可以跑在 管理节点和工作节点上, 副本服务 只能跑 工作节点上.
拓展:docker service inspect my-nginx 可以找到
网路模式:"PublishMode": "ingress"
整体!
Docker Stack
docker-compose 单机部署项目!
docker stack 部署、集群部署!
部署 wordpress 为例
stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每个服务。
stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
Docker Secret
安全!配置密码, 证书!
Dcoker Config
Docker 下半场总结
拓展到 k8s
云原生时代
大趋势!