简介

Docker 进阶篇

官方介绍
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇

安装

官方教程
Docker 进阶篇
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

Docker 进阶篇
Docker 进阶篇

体验

地址:https://docs.docker.com/compose/gettingstarted/
Docker 进阶篇
示例是
构建一个简单的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 进阶篇

Docker 进阶篇
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

docker network inspect composetest_default

Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇

Docker 进阶篇

yaml 规则

Docker 进阶篇
官方教程
可以把它理解成 3 层
Docker 进阶篇
定义依赖(用来保证 服务器的顺序,后一个服务依赖前一个服务的话,要保证前一个服务起来了):
Docker 进阶篇
docker 中的命令 基本都能 写到 docker-compose 中, docker-compose 就是把 很多 docker 命令组合到 一个 yaml 文件,
这样部署时就不用一个一个运行docker命令了
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端口)

Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

实战:自己写微服务上线

Docker 进阶篇
Docker 进阶篇
Docker 进阶篇

Docker 进阶篇

附录:
自己实现 daocker compose 示例相同的功能

起一个 服务 依赖 redis ,没访问一次, redis 中的 值加1 , 并返回。

JAVA版:
常见 spring 项目
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
启动项目
Docker 进阶篇
创建 controller
Docker 进阶篇
Docker 进阶篇
编写 controller
Docker 进阶篇
配置 redis
Docker 进阶篇
编写 Dockerfile
Docker 进阶篇

编写 docker-compose
Docker 进阶篇

给项目打个包
Docker 进阶篇

PS: 如果 只有 打出来的包 只有 4、5kb
Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

在服务请上创建一个文件夹
Docker 进阶篇

把文件上传到服务器. 打包后的 jar 包、 DockerFile、 docker-compose.yml
Docker 进阶篇

启动
Docker 进阶篇

Docker 进阶篇

如果 第一次构建失败 ,第二次想重新 构建时 可以使用

docker-compose up --build

Docker 进阶篇

启动成功
Docker 进阶篇

访问测试, 每访问一次 /hello 计数器加1
Docker 进阶篇

NODEJS 版

可直接跳转到 github NodeJs 版示例

Docker Swarm

集群

购买服务器

Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇
Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

使用 xshell 连接服务器
Docker 进阶篇

4 台机器安装 Docker

Docker 进阶篇

Docker 进阶篇
Docker 进阶篇

安装
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇

上面的命令 这样输入即可
Docker 进阶篇

工作模式

来自官网
Docker 进阶篇

搭建集群

Docker 进阶篇
docker 网络为 最基本的

查看帮助
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇
可以用
私网、公网, 公网是要钱的

ip addr 查看私网 ip (要用自己的 ip)
Docker 进阶篇

docker1 作为主节点, 初始化一个集群
Docker 进阶篇

加入一个 worker 节点
Docker 进阶篇
docker2 加入 docker1 (docker1 ip 为 172.24.82.149)
Docker 进阶篇

在主节点上
Docker 进阶篇

docker1 生成 让 别的服务 加入到本集群的命令
Docker 进阶篇

docker3 中 运行 加入 命令, 使 docker3 成为 worker 节点
Docker 进阶篇

docker1 中查看所有的节点

Docker 进阶篇

docker4 成为主节点 (manager 节点

在 docker1 主节点上 运行 docker swarm join-token manager, 生成令牌(加入主节点命令)。必须在主节点运行,这是主节点命令。

Docker 进阶篇

docker4 上运行 生成的命令
Docker 进阶篇

再次在 docker1 中查看所有的节点
Docker 进阶篇

如果有 100 台,也是一样的道理
Docker 进阶篇

Docker 进阶篇

Raft 协议

Docker 进阶篇
Docker 进阶篇

在启动 docker1 ,但是 docker1 已经不是 主节点 leader 了, 成了 docker4
Docker 进阶篇

使 docekr3 离开集群
Docker 进阶篇
docker4 查看节点
Docker 进阶篇

Docker 进阶篇

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

docker3 (刚刚已经离开了节点了)中运行,使其 加入的到集群,并成为 管理节点

Docker 进阶篇

worker 节点是 不能运行 manger 命令的,比如 docker node ls
Docker 进阶篇

再次将 docker1 停止
Docker 进阶篇
docker4 中查看
Docker 进阶篇
docker3 中查看
Docker 进阶篇

docker3 也是可用的。

此时 管理节点有 docker3 和 docker4
思考: 现在 把 docker3 也停掉 docker4 还能用吗?

停掉 docker3
Docker 进阶篇

docker4 中查看
Docker 进阶篇

发现只有一个 管理节点的时候, 集群是不可用的 (集群已经不安全了, 如果这个挂了,数据就会丢失了,所以就不允许工作了,可用性不能保证了)

Docker 进阶篇

最少 3 台 管理节点,这样 任意一台 挂了,其它两个还是能保证安全的(数据还能相互备份),还可以正常使用。

体会

开始前 4 台服务器是的状态为

docker1 docker3 docker4 是 manger 管理节点
docker2 是 worker 节点

Docker 进阶篇
Docker 进阶篇

灰度发布: 金丝雀发布!(不停机发布)


查看 docker services create --help 命令的使用
Docker 进阶篇
Docker 进阶篇
Docker 进阶篇

创建一个 服务

Docker 进阶篇

查看 my-nginx 集群服务 下的 进程状态
Docker 进阶篇

查看集群服务
REPLICAS 副本为 1
Docker 进阶篇

查看服务的详细信息 docker service inspect my-nginx
Docker 进阶篇

我们在 docker1 中启动 nginx,看看启动到了哪里

分别 在 docker2 docker3 docker4 中运行 docker ps, 发现帮我们启动到了 docker3
Docker 进阶篇

假如现在 我们的网站 访问人数上升了,要对 nginx 进行 扩缩容,对 nginx 更新成 3 个副本

Docker 进阶篇

再看看 启动到哪里了

docker4 查看
Docker 进阶篇
docker3 查看
Docker 进阶篇
docker2 查看
Docker 进阶篇

使用 docker 1 ~ 4 中的任意 一台 外网 ip 都可以访问到, 这里是 用的 docker2 外网 IP 的

Docker 进阶篇

Docker 进阶篇

docker1 中是 没有 运行 nginx 容器的
Docker 进阶篇

使用 docker1 外网 ip 访问 测试
Docker 进阶篇

Docker 进阶篇

图解:
Docker 进阶篇

动态扩缩容
Docker 进阶篇

如果我们将 副本 扩到 10 个, 也是可以的
Docker 进阶篇

查看 docker4 现在运行的容器 (2个)

Docker 进阶篇

查看 docker3 现在运行的容器 (2个)

Docker 进阶篇

查看 docker2 现在运行的容器 (3个)
Docker 进阶篇

查看 docker1 现在运行的容器 (3个)
Docker 进阶篇

加起来 刚好 2 + 2 +3 + 3 10个

Docker 进阶篇

加入没有这么大的需求了, 不想要这么多 副本了, 也是可以回滚的,
将副本 回滚到 1个

在管理节点上 运行 docker service update --replicas 1 my-nginx
Docker 进阶篇

查看 docker4 现在运行的容器 (0个)
Docker 进阶篇

查看 docker3 现在运行的容器 (1个)
Docker 进阶篇

查看 docker2 现在运行的容器 (0个)
Docker 进阶篇

查看 docker1 现在运行的容器 (0个)

--
Docker 进阶篇

刚刚使用 docker service update --replicas [副本数] [服务名] 也可以使用 docker service scale 进行扩缩容
Docker 进阶篇

让 my-nginx 动态扩缩容到 5 份

Docker 进阶篇

让 my-nginx 动态扩缩容到 2 份
Docker 进阶篇

这个 较方便一些比 docker service update


移除

如果想要 移除一个服务

Docker 进阶篇

查看 就没有 my-nginx 服务了
Docker 进阶篇

Docker 进阶篇

概念总结

swarm
Docker 进阶篇
Node
Docker 进阶篇

Service (我们在用的时候 也主要操作这一层)
Docker 进阶篇
Docker 进阶篇

Task

Docker 进阶篇

Docker 进阶篇

docker 引擎原理
Docker 进阶篇

逻辑是不变的 *(和 k8s)

Docker 进阶篇


服务副本与全局服务

Docker 进阶篇
(可以指定 服务的模式全局模式 还是 副本模式全局服务可以跑在 管理节点工作节点上, 副本服务 只能跑 工作节点上.
Docker 进阶篇


拓展:
docker service inspect my-nginx 可以找到

网路模式:"PublishMode": "ingress"
Docker 进阶篇
Docker 进阶篇

Docker 进阶篇
Docker 进阶篇

整体!


Docker Stack

docker-compose 单机部署项目!

docker stack 部署、集群部署!

部署 wordpress 为例
Docker 进阶篇

Docker 进阶篇

stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每个服务。
stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。

Docker Secret

安全!配置密码, 证书!
Docker 进阶篇

Dcoker Config

Docker 进阶篇


Docker 下半场总结

Docker 进阶篇

拓展到 k8s

云原生时代

大趋势!

Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

Docker 进阶篇

相关文章: