Docker 进阶篇
Docker Compose
简介
安装
官方教程
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
云原生时代
大趋势!