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

  1. 创建一个文件夹(我这里创建在了 /home 下)
 mkdir composetest
 cd composetest
  1. 创建 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
  1. 创建 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"]

  1. 在 Compose file 中定义服务, 创建 vim docker-compose.yml
version: "3.8"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
  1. 使用Compose构建并运行应用程序
docker-compose up
  1. 启动完毕 测试
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 博客系统
官方教程

  1. 常见 my_wordpress 文件夹。(这里我创建在了 /home 下)
    shell
mkdir my_wordpress
  1. 切到目录
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
  1. 访问测试
    访问服务器 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 查看节点

在 管理节点上 (docker1docker4) 上生成 其它工作节点 加入令牌

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

云原生时代

大趋势!

posted @ 2021-11-30 22:55  暗恋桃埖源  阅读(61)  评论(0编辑  收藏  举报