【狂神说Java】Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili
官网:https://www.docker.com/
文档地址: https://docs.docker.com/ (Docker 官网文档超级详细)
仓库地址:https://hub.docker.com/
容器单独没有什么意义,有意义的是容器编排
1、Docker Compose 1.1 Compose 概念Docker Compose 作用
Docker
DockerFile build run手动操作,单个容器!
微服务。100个微服务!依赖关系。
Docker Compose来轻松高效的管理容器i。
作用:批量容器编排
Docker Compose 概念
Compose是一个用于定义和运行多容器Docker应用程序的工具。
使用Compose,您可以使用yaml文件配置应用程序的服务。然后,使用一个命令,从配置中创建并启动所有服务
使用Compose基本上是一个三步过程:
- 使用 定义应用的环境,以便可以在任何位置重现它。Dockerfile定义构成应用的服务,以便它们可以在隔离的环境中一起运行。docker-compose.yml运行,Docker 撰写命令将启动并运行整个应用。您也可以使用 docker-compose 二进制文件运行
docker-compose.yml (yaml配置文件)示列:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
理解
Compose是Docker官方的开源项目。需要安装!
Dockerfile让程序在任何地方运行。web服务。redis、mysqk nginx …多个容器。run
docker-compose up 100 个服务。
Compose :重要的概念。
服务services: 容器。应用。(web、redis、mysql…)项目project: 一组关联的容器。博客、web网站 1.2 安装 Compose
Install Docker Compose | Docker documentation
官方下载地址慢,不推荐官方的下载地址,使用国内的镜像
1、运行以下命令下载 Docker Compose 的当前稳定版本:
curl -L https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@192 compose]# curl -L https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 16.7M 100 16.7M 0 0 2672k 0 0:00:06 0:00:06 --:--:-- 3033k
2、将可执行权限应用于二进制文件:
chmod +x /usr/local/bin/docker-compose
3、安装成功
[root@192 bin]# docker-compose version docker-compose version 1.25.5, build 8a1c60f6 docker-py version: 4.1.0 CPython version: 3.7.5 OpenSSL version: OpenSSL 1.1.0l 10 Sep 20191.3 Compose 快速开始
目标
在此页面上,您将构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。该应用程序使用 Flask 框架,并在 Redis 中维护一个命中计数器。虽然该示例使用 Python,但即使您不熟悉此处演示的概念,也应该可以理解它。
先决条件
确保你已经安装了 Docker 引擎和 Docker Compose。您不需要安装Python或Redis,因为两者都是由Docker映像提供的。
1.3.1 设置定义应用程序依赖项。
1、为项目创建目录:
$ mkdir composetest $ cd composetest
项目目录:/home/composetest
[root@192 composetest]# pwd /home/composetest
2、创建一个在项目目录中调用的文件,并将其粘贴到:app.py(pythonw文件)
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)
在此示例中,是应用程序网络上 redis 容器的主机名。我们使用 Redis 的默认端口(6379)。
创建在项目目录中调用的另一个文件,并将其粘贴到:`requirements.txt`
flask redis1.3.2 创建 Docker 文件
在此步骤中,您将编写一个构建 Docker 映像的 Docker 文件。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。
在项目目录中,创建一个名为以下内容并粘贴以下内容的文件:Dockerfile
# syntax=docker/dockerfile:1 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"]
这告诉 Docker:
从 Python 3.7 映像开始构建映像。将工作目录设置为 。/code设置命令使用的环境变量。flask安装 gcc 和其他依赖项复制并安装 Python 依赖项。requirements.txt向映像添加元数据以描述容器正在侦听端口 5000将项目中的当前目录复制到映像中的 workdir。.``.将容器的缺省命令设置为 。flask run
有关如何编写 Dockerfile 的更多信息,请参阅 Docker 用户指南和 Dockerfile 参考。
1.3.3 在撰写文件中定义服务创建在项目目录中调用的文件并粘贴以下内容:docker-compose.yml
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
此文件定义了两个服务: web(网络服务) 和redis
网络服务
该服务使用从 当前目录中生成的映像。然后,它将容器和主机绑定到公开的端口 。此示例服务使用 Flask Web 服务器的缺省端口。web Dockerfile 5000:5000
Redis 服务
该服务使用从 Docker Hub 注册表中提取的公共 Redis 映像。
版本问题version
version版本不要填太高
docker-compose.yml 版本问题 - soowin - 博客园 (cnblogs.com)
项目文件汇总
[root@192 composetest]# ls app.py docker-compose.yml Dockerfile requirements.txt1.3.4 使用撰写构建和运行应用
1、从项目目录中,通过运行 启动应用程序。docker-compose up
$ docker-compose up
[root@192 composetest]# docker-compose up Creating network "composetest_default" with the default driver Building web Step 1/10 : FROM python:3.7-alpine # ... Successfully built f34d94accbfe # 成功built Successfully tagged composetest_web:latest # ... redis_1 | 1:C 05 Feb 2022 03:43:44.272 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 05 Feb 2022 03:43:44.272 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf redis_1 | 1:M 05 Feb 2022 03:43:44.274 * monotonic clock: POSIX clock_gettime redis_1 | 1:M 05 Feb 2022 03:43:44.275 * Running mode=standalone, port=6379. # redis 端口6379 # ... redis_1 | 1:M 05 Feb 2022 03:43:44.275 * Ready to accept connections web_1 | * Serving Flask app 'app.py' (lazy loading) # Flask app 'app.py web_1 | * Environment: production web_1 | Use a production WSGI server instead. web_1 | * Debug mode: off web_1 | * Running on all addresses. # 警告:这是一个开发服务器。不要在生产部署中使用它。 web_1 | WARNING: This is a development server. Do not use it in a production deployment. web_1 | * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit) # Flask网页运行成功 web_1 | 192.168.64.1 - - [05/Feb/2022 03:45:00] "GET / HTTP/1.1" 200 - # 访问常规
2、Compose 将拉取 Redis 映像,为代码生成映像,并启动您定义的服务。在这种情况下,代码在生成时静态复制到映像中。
3、内网和外网在浏览器中输入 http://ip:5000/ 以查看正在运行的应用程序,访问成功。
[root@192 ~]# curl http://127.0.0.1:5000/ Hello World! I have been seen 6 times.
查看运行容器和下载的镜像
[root@192 ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69e3e717caab redis:alpine "docker-entrypoint.s…" 12 minutes ago Up 11 minutes 6379/tcp composetest_redis_1 6ee894e2943d composetest_web "flask run" 12 minutes ago Up 11 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp composetest_web_1 [root@192 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE composetest_web latest f34d94accbfe 17 minutes ago 189MB python 3.7-alpine e72b511ad78e 5 hours ago 46.4MB redis alpine 3900abf41552 2 months ago 32.4MB
composetest_web_1 默认服务名: 文件名_服务名_num
多个服务器,集群。 _num 代表 副本数量
集群状态。服务都不可能只有一个运行实例。弹性,高可用
kubectl service 负载均衡
网络
[root@192 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 72d780a6ab91 bridge bridge local a21a2d695614 composetest_default bridge local # 桥接 7e6c1bad6c42 host host local 285b996502c9 none null local
[root@192 ~]# docker network inspect composetest_default
[root@192 ~]# docker network inspect composetest_default
[
{
"Name": "composetest_default",
# ...
"Containers": {
"69e3e717caab28b75bbc1e7a2ade520efd94508f7835cb6641bb61c530f259a8": {
"Name": "composetest_redis_1",
"EndpointID": "982cad680954face54af1e60034399a3d32888ecdfdbf0fbc0de9481966c942a",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"6ee894e2943d88c35d075f036ebbdab0a46cd5252b48296413c8e95d364b514b": {
"Name": "composetest_web_1",
"EndpointID": "1a1e07335b2c8ae04b40f9d2283cf0a0c7d46921fb11aebfbca46a7e2259bc28",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": { # compose
"com.docker.compose.network": "default",
"com.docker.compose.project": "composetest",
"com.docker.compose.version": "1.25.5"
}
}
]
关闭服务
docker-compose down1.4 Yaml配置文件规则
对着文档学习:撰写文件版本 3 参考|Docker 文档
yaml配置文件共三层:
version: "3" #第一层 版本
services: #第二层 服务
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
#第三层 其他配置 网络/卷、全局规则
volumes:
networks: :
config:
学习方法
对着文档学习,不会的找就行,官方文档要详细的解释 撰写文件版本 3 参考|Docker 文档
depends_on
depends_on:表达服务之间的依赖关系。depends(取决于)
示例:
version: "3.9"
services:
web:
build: .
depends_on: # 表示启动web服务前要先启动db和redis服务
- db
- redis
redis:
image: redis
db:
image: postgres
服务依赖关系会导致以下行为:
docker-compose up按依赖关系顺序启动服务。在示例中,和 db在redis之web前启动。docker-compose up SERVICE自动包含 的依赖项。在示例中,SERVIC Edocker-compose up还创建web 并启动 db 和 redis。docker-compose stop按依赖关系顺序停止服务。在示例中,web 在 db 和 redis 之前停止。
deploy
deploy(部署):指定与服务的部署和运行相关的配置。这仅在部署到部署了 docker 堆栈的群 时生效,并且被docker-compose up和 docker-compose run忽略。
2、使用Compose一键部署博客使用Compose一键部署WordPress博客(推荐一个开源博客系统,FutureCMS)
Quickstart: Compose and WordPress | Docker documentation
使用 Docker Compose 在使用 Docker 容器构建的独立环境中轻松运行 WordPress。本快速入门指南演示了如何使用撰写来设置和运行WordPress。
2.1 定义项目1、创建项目目录/home/my_wordpress。
例如,如果您将目录命名为 :my_wordpress
cd my_wordpress/
2、创建一个启动博客的文件和一个单独的实例,其中包含用于数据持久性的卷装载:
docker-compose.yml
version: "3"
services:
db:
image: mysql:5.7
volumes: # 挂载
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress # root用户 的 密码
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: {}
2.2 生成项目
现在,从项目目录运行。docker-compose up -d
这将在分离模式下运行 docker-compose,拉取所需的 Docker 映像,并启动 wordpress 和数据库容器,如下面的示例所示。
$ docker-compose up -d
[root@192 my_wordpress]# docker-compose up -d Creating network "my_wordpress_default" with the default driver Creating volume "my_wordpress_db_data" with default driver Creating volume "my_wordpress_wordpress_data" with default driver Pulling db (mysql:5.7)... 5.7: Pulling from library/mysql # ... Digest: sha256:3e28e1e0b732e1828028d7d500eb73f273fc8365215f633414e60cdc631e0d91 Status: Downloaded newer image for wordpress:latest Creating my_wordpress_db_1 ... done Creating my_wordpress_wordpress_1 ... done2.3 启动WordPress
此时,WordPress应该在Docker主机的端口8000上运行,您可以作为WordPress管理员完成"著名的五分钟安装"。
注意:WordPress站点不会立即在端口8000上可用,因为容器仍在初始化中,并且可能需要几分钟才能首次加载。
如果您使用的是 Docker Desktop for Mac 或 Docker Desktop for Windows,则可以将其用作 IP 地址,并在 Web 浏览器中打开。 http://localhost:8000或 http://ip:8000
2.4 关机和清理查看容器
[root@192 ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 434c7968618f wordpress:latest "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:8000->80/tcp, :::8000->80/tcp my_wordpress_wordpress_1 93d0e3cbbe5b mysql:5.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 3306/tcp, 33060/tcp my_wordpress_db_1
命令 docker-compose 将删除容器和默认网络,但保留您的 WordPress 数据库。
该命令删除容器、默认网络和 WordPress 数据库。
$ docker-compose down --volumes3、实战:自己编写微服务上线 3.1 创建项目
1、控制器
package com.example.compose.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello(){
// 自增
Long view = redisTemplate.opsForValue().increment("views");
return "hello,this views is: "+view;
}
}
2、application.properties配置文件
# 应用名称 spring.application.name=Compose # 应用服务 WEB 访问端口 server.port=8080 spring.redis.host=redis
3、编写Dockerfile,用于构建镜像
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]
4、docker-compose.yml 编排项目
version: "3"
services:
myapp:
build: .
image: myapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "redis:alpine"
5、 macen打包
3.2 FTP安装与配置关闭防火墙
#关闭防火墙 $ systemctl stop firewalld.service #禁止防火墙开机启动 $ systemctl disable firewalld.service
安装
#安装 yum install -y vsftpd #设置开机启动 systemctl enable vsftpd.service #启动 systemctl start vsftpd.service #停止 systemctl stop vsftpd.service #查看状态 systemctl status vsftpd.service3.3 上传文件并运行
上传文件
运行
失败原因是关闭防火墙之后docker需要重启,执行以下命令重启docker即可:
[root@192 myapp]# service docker restart Redirecting to /bin/systemctl restart docker.service
docker-compose up
运行成功
访问测试成功
[root@192 ~]# curl http://127.0.0.1:8080/hello hello,this views is: 63.4 重新构建
假如项目出错,需要重新构建
docker-compose ip --build4、Swarm集群搭建
Swarm mode overview | Docker documentation
4.1 环境准备MobaXterm免费版都比Xshell好用的多,
学生还是用虚拟机吧,内存不够,两台机子用虚拟机桥接网络就可以连通(推荐工具[RdViewer 远程控制软件)
服务器(虚拟机)ip
192.168.64.134、192.168.64.135、192.168.64.136、192.168.64.137 (4台服务器: 二主(管理)二从(工作))
1、4台服务器安装docker
同时操作服务器,用虚拟机时用同一镜像时不推荐
2、 启动Docker并设置开机自启动
# 启动Docker $ systemctl start docker # 查看当前版本号,是否启动成功 $ docker version # 设置开机自启动 $ systemctl enable docker4.3 Swarm集群介绍
Docker Swarm 常用命令 - kevin.Xiang - 博客园 (cnblogs.com)
节点工作模式
搭建集群
$ docker swarm --help Usage: docker swarm COMMAND Manage Swarm Commands: ca # Display and rotate the root CA init # 初始化一个Swarm join # 加入一个集群作为一个节点 和/或 管理者 join-token # 管理生成的令牌 leave # 离开swarm unlock # 解锁swarm unlock-key # 解锁密钥管理 update # 更新swarm
$ docker swarm init --help
1、设置主节点(192.168.64.134)
$ docker swarm init --advertise-addr 192.168.64.134
[root@192 ~]# docker swarm init --advertise-addr 192.168.64.134
# Swarm初始化: 当前节点(...)现在是一个manager(管理节点)。
Swarm initialized: current node (n2ws0fm7fvsiniuo9wjmq3dfh) is now a manager.
# 翻译:要添加一个worker(工作节点)到这个swarm,运行以下命令(令牌)
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
# 翻译:要添加一个swarm(管理节点)到swarm,运行'docker swarm join-token manager',
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2、生成令牌(管理生成的令牌)
# 生成管理节点的令牌 $ docker swarm join-token manager # 生成工作节点的令牌 $ docker swarm join-token worker
[root@192 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
# 【添加一个管理节点的命令】
docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-4bocoqdhfypuppql3yqxt0u2p 192.168.64.134:2377
[root@192 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
# 【添加一个工作节点的命令】
docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
3、将服务器(192.168.64.135)加入工作节点(在192.168.64.135运行命令)
# 【添加一个工作节点的命令】 $ docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
[root@192 ~]# docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377 This node joined a swarm as a worker.# 成功变为工作节点
4、查看所有节点信息
[root@192 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION n2ws0fm7fvsiniuo9wjmq3dfh * 192.168.64.134 Ready Active Leader 20.10.12 y1clyylemoiqbrquha4hpgdg7 192.168.64.135 Ready Active 20.10.12
5、将服务器(192.168.64.136)加入工作节点
# 【添加一个工作节点的命令】 $ docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
[root@192 ~]# docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377 This node joined a swarm as a worker.
# 查看所有节点信息 [root@192 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION n2ws0fm7fvsiniuo9wjmq3dfh * 192.168.64.134 Ready Active Leader 20.10.12 y1clyylemoiqbrquha4hpgdg7 192.168.64.135 Ready Active 20.10.12 29g0dvdvrtajsxr5d6lgutddr 192.168.64.136 Ready Active 20.10.12
6、移除节点
# 从swarm中删除一个节点 | -f 删除多个节点 $ docker node rm 节点id
# 管理节点自己离开 $ docker swarm leave --force [root@192 ~]# docker swarm leave --force Node left the swarm.
7、将服务器(192.168.64.137)加入管理节点
这里manager加不进去的话应该也是要防火墙开放2377端口或关闭防火墙
# 永久关闭防火墙 $ systemctl disable firewalld $ systemctl stop firewalld # 停止并禁用开机启动 $ systemctl disable firewalld
# 【添加一个管理节点的命令】 $ docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-4bocoqdhfypuppql3yqxt0u2p 192.168.64.134:2377
[root@192 ~]# docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-4bocoqdhfypuppql3yqxt0u2p 192.168.64.134:2377 This node joined a swarm as a manager. # 成功进入管理节点
8、查看所有节点信息
[root@192 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION n2ws0fm7fvsiniuo9wjmq3dfh * 192.168.64.134 Ready Active Leader 20.10.12 y1clyylemoiqbrquha4hpgdg7 192.168.64.135 Ready Active 20.10.12 29g0dvdvrtajsxr5d6lgutddr 192.168.64.136 Ready Active 20.10.12 mbtufs92q1q1kbsrdkfh3gx7s 192.168.64.137 Ready Active Reachable 20.10.124.3 Raft一致性协议了解
双主双从->假设一个节点挂了,其他节点是否可用? 不可用
Raft协议:保证大多数节点存活才可用
三个管理器的群体最多可以容忍一个管理器的损失。一个五管理器群可以容忍最大同时丢失两个管理器节点。一个N管理器集群最多可以容忍管理器的丢失 (N-1)/2。Docker 建议一个群最多有七个管理器节点。
ps:manager 节点不是越多越好
三个manager节点,停止一个manager之后仍可用三个manager节点,停止两个manager之后不可用
实验:
1、一个主节点挂了,另一个主节点也不能用了
[root@tencent-h1 ~]# systemctl docker [root@tencent-h1 ~]# docker node ls # 日志含义可能在线的managers太少了。确保半数以上的managers在线。 Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
2、将某一个worker节点离开,仍可用
3、work节点不能查看节点信息,仅用来工作,命令只能在manager(管理节点)上执行
[root@192 ~]# docker node ls # 来自daemon的错误响应:这个节点不是一个集群管理器。工作节点不能用于查看或修改集群状态。请在管理节点上执行此命令或将当前节点提升为管理节点。 Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.5、Swarm集群弹性创建服务
扩缩容功能,创建服务,动态扩展服务,更新服务,日志,灰度发布(更新网站(服务)时依旧提出服务,不挂404)
功能:扩缩容功能(扩容:增加容器,缩容:减少容器),灰度发布
目的:创建 nginx 服务、动态扩展服务、动态更新服务
[root@192 ~]# docker service --help Usage: docker service COMMAND Manage services Commands: create # 创建一个新服务 inspect # 显示一个或多个服务的详细信息 logs # 获取服务或任务的日志 ls # 服务列表 ps # 列出一个或多个服务的任务 rm # 删除一个或多个服务 rollback # 回滚恢复对服务配置的更改 scale # 扩展扩展一个或多个复制业务 update # 更新服务
1、创建服务(192.168.64.134)
以前是docker run(单机),现在是 docker service (集群)
$ docker service create -p 8888:80 --name my-nginx nginx
2、查看服务(192.168.64.134)
$ docker service ls
[root@192 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS cccvbtrm38lt my-nginx replicated 1/1 nginx:latest *:8888->80/tcp
虽然是在192.168.64.134机器上创建的,但也有可能跑在其他机器上
$ docker ps
[root@192 ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9c147315120 nginx:latest "/docker-entrypoint.…" about a minute ago Up about a minute 80/tcp my-nginx.1.z9q9ym9npjh6nx5mrmz0whcfa
查看my-nginx 服务的状态
[root@192 ~]# docker service ps my-nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS z9q9ym9npjh6 my-nginx.1 nginx:latest 192.168.64.134 Running Running 28 minutes ago
3、动态扩缩容,扩容到3个副本 集群中的任意节点都可访问,实现高可用
$ docker service update --replicas 3 my-nginx [root@192 ~]# docker service update --replicas 3 my-nginx my-nginx overall progress: 3 out of 3 tasks 1/3: running 2/3: running 3/3: running verify: Service converged
# 动态扩容成功 [root@192 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS cccvbtrm38lt my-nginx replicated 3/3 nginx:latest *:8888->80/tcp
4、动态扩缩容(scale 同 updata)
$ docker service scale my-nginx=10
[root@192 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS cccvbtrm38lt my-nginx replicated 10/10 nginx:latest *:8888->80/tcp
动态更新nginx成3个副本,三台主机上都有nginx服务。(但用第四台主机的ip也能访问到nginx)
5、动态缩容,回滚到1个
$ docker service scale my-nginx=1
[root@192 ~]# docker service scale my-nginx=1 my-nginx scaled to 1 overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [root@192 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS cccvbtrm38lt my-nginx replicated 1/1 nginx:latest *:8888->80/tcp
k8s更难,功能更多。swarm相当于简单版的k8s
Swarm概念总结
swarm
集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入。(管理、工作者)
Node
就是一个docker节点。多个节点就组成了一个网络集群。(管理、工作者)
Service
任务,可以在管理节点或者工作节点来运行。核心。!用户访问!
Task
容器内的命令,细节任务!



