Docker进阶
- 一、Docker Compose
- 1、概述
- 2、下载
- 3、授权
- 4、创建一个Python项目
- 4.1 创建目录并生成一个app.py文件
- 4.2 创建Dockerfile
- 4.3 创建docker-compose.yml
- 4.4 用compose方式创建并运行应用
- 4.5 停止
- 4.6 启动流程
- 5、yaml文件
- 5.1 官方文档
- 5.2 yaml文件层次:三层
- 5.3 常用选项
- 6、开源项目:博客
- 6.1 源码地址
- 6.2 用compose搭建开源项目
- 7、结合idea实战
- 二、docker swarm
- 1、官方文档
- 2、什么是Docker Swarm
- 3、Docker Swarm 基本结构图
- 4、Swarm的几个关键功能
- 4.1 Docker Swarm
- 4.1.1 概念
- 4.1.2 常用命令
- 4.2 Docker Node
- 4.2.1 概念
- 4.2.2 常用命令
- 4.3 Docker Service
- 4.3.1 概念
- 4.3.2 常用命令
- 4.4 Task
- 4.5 Docker stack
- 4.5.1 概念
- 4.5.2 常用命令
- 4.6 Docker config
- 4.7 docker secret
- 5、Swarm的工作模式
- 5.1 Node
- 5.2 Service
- 5.3 任务与调度
- 5.4 服务副本与全局服务
一、Docker Compose
1、概述
(1)使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知
(2)使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
(3)批量容器编排,如下例
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
(4)重要概念:
服务services:容器、应用,如web、redis、mysql等
项目project:一组关联的容器
2、下载
(1)官方地址,很慢
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(2)国内地址
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
3、授权
sudo chmod +x /usr/local/bin/docker-compose
[root@localhost bin]# docker-compose version
docker-compose version 1.21.2, build a133471
docker-py version: 3.3.0
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
4、创建一个Python项目
4.1 创建目录并生成一个app.py文件
(1)创建目录
mkdir composetest
cd composetest
(2)创建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)
(3)创建requirements.txt文件
flask
redis
4.2 创建Dockerfile
FROM python:3.7-alpine
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
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
4.3 创建docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
4.4 用compose方式创建并运行应用
docker-compose up
4.5 停止
Ctrl+c 或docker-compose stop或docker-compose down
4.6 启动流程
(1)创建默认的网络:
自动创建composetest_default网络,利用该网络可以实现域名访问,避免用ip访问
docker network inspect composetest_default #查看网络细节
(2)执行docker-compose.yml文件
(3)启动服务,服务名为项目所在文件夹名_服务名_副本号
composetest_web_1
composetest_redis_1
5、yaml文件
5.1 官方文档
https://docs.docker.com/compose/compose-file/#specifying-durations
5.2 yaml文件层次:三层
(1)第一层版本:
version: "3.9"
(2)第二层服务:可以有多个
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
(3)其他配置
volumes:
networks:
configs:
5.3 常用选项
(1)依赖,决定服务启动顺序
(2)部署
6、开源项目:博客
6.1 源码地址
地址:https://docs.docker.com/samples/wordpress/
6.2 用compose搭建开源项目
(1)创建目录
mkdir my_wordpress
cd my_wordpress
(2)编写yaml文件:docker-compose.yml
version: "3.9"
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
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
(3)后台启动
docker-compose up -d
(4)前台访问
http://192.168.0.101:8000/ --初始化并选择语言和设置用户名和密码
7、结合idea实战
(1)编写微服务项目
(2)编写Dockerfile,有源码时一般需要Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
(3)编写docker-compose.yml文件编排项目
version: "3.9"
services:
lwpapp:
build: .
image: lwpapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
(4)丢到服务器中启动
docker-compose up -d
#重新构建
docker-compose up --build
(5)前台网页打开
http://192.168.0.101:8080/hello
#输出
hello,lwp! views:12
二、docker swarm
1、官方文档
https://docs.docker.com/engine/swarm/
2、什么是Docker Swarm
(1)Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的DockerClient(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
(2)Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
(3)从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
(4)Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。
3、Docker Swarm 基本结构图
(1)在结构图可以看出 Docker Client使用Swarm对 集群(Cluster)进行调度使用。
(2)上图可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持
4、Swarm的几个关键功能
4.1 Docker Swarm
4.1.1 概念
(1)集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
(2)docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)
4.1.2 常用命令
(1)命令汇总
(2)Swarm初始化docker swarm init
(3)加入集群docker swarm join
(4)管理添加节点的口令docker swarm join-token
swarm添加节点时需要管理节点生成一个口令,待添加的子节点需要凭借这个口令才能加入集群,这个子命令docker swarm join-token更加简单,主要用于管理集群口令,该子命令只能用于管理节点。
(5)更新集群docker swarm update
(6)其他命令
4.2 Docker Node
4.2.1 概念
(1)一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。
(2)要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。
(3)Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。
(4)工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态。
(6)docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)
4.2.2 常用命令
(1)命令汇总
(2)docker node demote
将一个或多个节点从群集中的管理器降级
(3)docker node inspect
(4)docker node ls
(5)docker node promote
将一个或多个节点提升为群集中的管理器
(6)docker node ps
(7)docker node rm
(8)docker node update
4.3 Docker Service
4.3.1 概念
(1)一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。
(2)docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service–help查看帮助)
4.3.2 常用命令
(1)命令汇总
命令 | 描述 |
inspect | 查看具体服务信息 |
logs | 查看服务日志 |
ps | 列出正在运行的服务 |
create | 创建服务 |
update | 更新服务 |
ls | 列出所有服务 |
(2)docker service create:创建一个服务
docker service create –replicas 5 –name myhelloworld alpine ping docker.com
(3)docker service ls命令查看创建出来的服务
(4)ocker service update 更新服务
docker service update –publish-add 80 my_web
(5)docker service inspect 查看服务详情:
docker service inspect my_web
(6)docker service ps:搜索服务命令
(7)docker service rm 删除服务
4.4 Task
(1)任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
(2)docker swarm:集群管理;docker node:节点管理;docker service:服务管理。
(3)node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
manager nodes,也就是管理节点
worker nodes,也就是工作节点
(4)node、service、task之间关系
1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。
3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
4)service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
5)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。
4.5 Docker stack
4.5.1 概念
(1)Stack 是 Docker 原生的部署和管理多服务应用的解决方案。Stack 默认集成在 Docker 引擎中,并且提供了简单的声明式接口对应用进行部署和全生命周期管理。
(2)Stack 还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能。
(3)Stack 是基于 Docker Swarm 之上来完成应用的部署。因此诸如安全等高级特性,其实都是来自 Swarm。
4.5.2 常用命令
(1)命令汇总
docker-stack
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.
(2) docker stsack deploy
用于根据 Stack 文件(通常是 docker-stack.yml)部署和更新 Stack 服务的命令。
(3) docker stack ls
会列出 Swarm 集群中的全部 Stack,包括每个 Stack 拥有多少服务。
(4) docker stack ps
列出某个已经部署的 Stack 相关详情。该命令支持 Stack 名称作为其主要参数,列举了服务副本在节点的分布情况,以及期望状态和当前状态。
(5) docker stack rm
命令用于从 Swarm 集群中移除 Stack。移除操作执行前并不会进行二次确认。
4.6 Docker config
在集群环境中配置文件的分发,可以通过将配置文件放入镜像中、设置环境变量、挂载volume、挂载目录的方式,当然也可以通过 docker config 来管理集群中的配置文件,这样的方式也更加通用。
docker config
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.
4.7 docker secret
(1)在docker swarm架构中,manager节点(单数>3)内置raft分布式存储(可实现manager各节点数据同步),manager与worker之间通信是经过SSL/TLS加密的,而private key是通过加密后存储在manager的raft存储中。
(2)secret管理:
1)存在swarm manager节点raft database里;
2)secret可以assign给一个service,这个service内部就能看到这个secret;
3)在container内部secret看起来像文件,但实际是在内存中。
(3)常用命令
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.
5、Swarm的工作模式
5.1 Node
5.2 Service
5.3 任务与调度
5.4 服务副本与全局服务