暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

从Docker到Docker-Swarm集群再到Java SpringBoot

一叶扁舟 2021-01-17
1916
image.png

目录)

一、Docker基础概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

image.png

镜像(Image)

镜像可以理解为一个软件的安装包。

容器(Container)

容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

仓库(Repository)

Docker仓库是Docker集中存放镜像文件的场所。

二、Docker基本操作

2.1、Docker信息

查看docker容器版本

docker version

查看docker容器信息

docker info

查看docker容器帮助

docker --help

2.2、镜像

搜索镜像

可以去dockerhub搜索,也可以命令搜索

docker search 镜像名

拉取镜像

docker pull 镜像 docker pull -a redis // 下载仓库所有Redis镜像

查看镜像

docker images // 列出本地images docker images -q // 只显示镜像ID docker images --digests // 显示镜像摘要信息(DIGEST列) docker images --no-trunc // 显示镜像完整信息

删除镜像

docker rmi [-f] 镜像 docker rmi -f $(docker images -q) // 删除本地全部镜像

运行镜像(创建容器)

docker run [参数] 镜像 // 参数 -p 8080:80 // 映射端口(本地8080映射到docker容器的80端口) -d // 后台运行并打印容器id -t // 分配一个伪终端 -i // 以交互式模式运行容器,通常与-t同时运行,可以直接写成-it -c // 限制cpu优先级 -m //限制内存大小 -h //设置主机名称 // 运行ubuntu, 本地80映射到docker容器的81端口, cpu优先级为100,内存限制512MB,主机名为test1,名为docker_test 后台运行 docker run -p 80:81 -it -c 100 -m 512MB -h test1 -d --name="docker_test" ubuntu

2.3、容器

查看容器

docker ps // 查看正在运行的容器 docker ps -a // 查看所有容器 docker ps -q // 查看正在运行的容器的ID docker ps -s // 显示运行容器总文件大小 docker ps -l // 显示最近创建容器 docker ps -n 3 // 显示最近创建的3个容器 docker inspect <container_id> // 查看容器详细信息 docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) // 查看所有容器的ip docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis // 获取正在运行的容器redis的 IP

容器启停

docker stop [container_id ...] // 停止容器 docker kill redis // 杀掉一个运行中的容器 docker start [container_id ...] // 启动停止的的容器 docker pause container_id // 暂停容器 docker unpause container_id // 继续容器 docker restart container_id // 重启容器

删除容器

docker rm [container_id ...] // 删除已停止的容器 docker rm -f redis // 删除一个运行中的容器 docker rm -f $(docker ps -a -q) // 删除所有容器 docker rm -v redis // 删除容器,并删除容器挂载的数据卷

容器变为镜像

docker commit [container_id ...] // 容器变为镜像

进出容器

docker exec -it container_id bin/bash // 进入容器 exit // 关闭容器并退出 Ctrl + P + Q // 仅退出容器,不关闭

文件操作

docker cp 本地路径 容器names:/路径 // 将本地文件copy到容器(在本地操作) docker cp 容器names:/路径 本地路径 // 将容器中文件copy到本地(在本地操作)

日志

docker logs rabbitmq // 查看容器日志 docker logs -f -t --tail=20 redis // 查看redis容器日志,参数:-f 跟踪日志输出;-t 显示时间戳;--tail 仅列出最新N条容器日志; docker logs --since="2019-05-21" --tail=10 redis // 查看容器redis从2019年05月21日后的最新10条日志。

打包为镜像

// 基于当前redis容器创建一个新的镜像;参数:-a 提交的镜像作者;-c 使用Dockerfile指令来创建镜像;-m :提交时的说明文字;-p :在commit时,将容器暂停 docker commit -a="xxx" -m="my redis" [redis容器ID] myredis:v1.1

三、Dockerfile

3.1、Dockerfile规范

FROM python:3.8-buster   #拉取镜像 FROM 镜像名:镜像版本

LABLE k='v' k1='v1'   #标志作用,没其他作用

WORKDIR /app   #指定shell执行的目录

SHELL /bin/bash  #指定shell的解析器

COPY requirements.txt requirements.txt #将宿主机文件copy到镜像中
ADD goose.py /goose.py  #和like一样,但是ADD可以copy url

RUN pip instsll -r requirements.txt   #运行shell命令

EXPOSE 8070  #指定镜像暴露的端口号

ENV A=10   #定义环境变量
ARG B=12   #定义局部变量(只有在构建的时候有用,运行启动时无效)
ONBUILD ENV C=10  #当前容器构建和运行时无效,基于该镜像的容器构建时启动时有效

VOLUME /a/b  #将镜像中文件映射到宿主机

CMD ["python", "goose.py"]  #指定代码运行的命令(参数可被docker run传入的参数覆盖)
ENTRYPOINT ["python", "goose.py"]  #指定代码运行的命令(参数不会被覆盖)

3.2、构建镜像

docker build dockerfile所在目录 -t 镜像名:版本号

四、Docker stack

4.1、stack与compose

docker-compose和docker-stack相同点

  • 都是用与多服务编排
  • 都是通过docker-compose.yml文件控制多个service
  • docker-compose v3版本 与 docker-stack一样,可以用docker-stack运行v3版本的docker-compose

不同点

  • docker-compose在需要下载工具才能运行,docker-stack有docker就能运行
  • docker-compose v1和v2版本不能用docker-stack

4.2、docker-compose.yml规范

Docker Compose配置文件详解

version: '3.7' # 版本号 services: # 服务 xxx networks: # 网络 xxx secrets: # 秘钥 xxx volumes: # 数据卷配置 xxx configs: # configs配置 xxx

日常常用配置

version: '3.7' # 版本号必须写且在3.0及以上,不然无法使用docker-stack运行 services: redis: # service名 build: # 构建镜像(与image二选一) context: . # 指定包含Dockerfile的目录路径或git仓库url dockerfile: Dockerfile-alternate # 指定Dockerfile文件。 args: # 添加构建参数,这些只能在构建过程中访问的环境变量(首先在Dockerfile文件中指定$buildno) buildno: 1 gitcommithash: cdc3b19 image: redis:alpine # 指定本地镜像名(与build二选一) ports: # 暴露端口 - target: 80 # 指定容器内的端口 published: 80 # 指定公开的端口 protocol: tcp # 指定端口协议(tcp或udp) mode: host # 使用host在每个节点公开一个主机端口,使用ingress对swarm mode端口进行负载均衡。 volumes: # 指定所挂载的主机路径或数据卷名称。 - "/u01:/u01" # 本地地址:容器内地址 environment: # 设置环境变量。 TZ: Asia/Shanghai deploy: # 指定部署和运行服务的相关配置,该配置仅在swarm mode下生效,并只能通过docker stack deploy命令部署,docker-compose up和docker-compose run命令将被忽略 mode: replicated # 指定服务的容器副本模式:(global:每个swarm节点只有一个该服务容器。replicated:整个集群中存在指定份数的服务容器副本,为默认值。) replicas: 2 # 指定运行的容器副本数量 update_config: # 配置如何更新服务。 parallelism: 1 # 一次更新的容器数量 delay: 10s # 更新一组容器之间的等待时间 order: stop-first # 设置更新顺序。stop-first为在开启新任务之前停止旧任务,start-first为首先启动新任务,和正在运行任务短暂重叠 restart_policy: # 指定容器的重启策略。 condition: on-failure # 重启策略为失败时重启

4.3、docker-stack相关操作

docker stack deploy --compose-file docker-compose.yaml stack_name //启动stack docker stack down service_name //关闭stack docker stack ls // 查看stack下service列表 docker stack services service_name //查看指定service的所有容器 docker stack ps service_name // 查看指定service的所有容器运行状态详情

五、Docker Swarm

5.1、梳理

5.1.1、演进梳理

  • docker run:只能启动一台服务器一个contanner
    • docker pull:只能使用提交到dockerhub上的镜像
    • Dockerfile:定制特定的镜像
  • docker-stack:同时启动一台服务器多个service(一个compose里可以配置多个service,每个service可以有一个contanner的多个replicas)
    • docker-compose:可控制多个service
  • docker-swarm:同时启动多台服务器多个service

5.1.2、关系梳理

image.png
  • Swarm:一个Swarm是一个集群,下面有多个node节点
  • node:node分为manager和worker节点(一个node一个服务器)
  • Stack:管理多个Service
  • Service:每个服务有多个contanner
  • Contanner:每个contanner对应多个replicas
  • Replicas:每个replicas对应一个task(任务)被合理分配到不同的node上

5.2、常用命令

搭建集群生成manager

docker swarm init // 搭建集群并指定当前服务器为集群manager节点 docker swarm init --advertise-addr 192.168.1.10 // 搭建集群并指定ip为集群manager节点

生成worker节点

docker swarm join-token worker // 生成token,复制token,去worker服务区执行

集群操作

  • node操作

    docker node ls //查看节点信息(master上) docker node ps //查看节点上的Task任务 //退出节点 docker node update --availability drain ID // 放空指定节点(master上) docker node update --availability active <NODE-ID> // 恢复放空(master上) docker swarm leave // 节点退出(worker上) docker node rm ID //删除节点(master上) //节点变更 docker node promote node2 // 将worker提升为manger docker node demote node1 // 将manger降级为worker // 节点分配 docker node update —availability drain node1 //node1不分配节点 docker node update —availability active node1 //恢复node1分配
  • Stack操作

    // 部署 docker stack deploy --compose-file docker-compose.yaml stack_name //启动stack docker stack down service_name //关闭stack docker stack ls // 查看stack下service列表 docker stack services service_name //查看指定service的所有容器 docker stack ps service_name // 查看指定service的所有容器运行状态详情
  • Service操作

    // 查看service docker service ls //查看该服务下所有容器 docker service ps 容器名 // 查看指定容器运行状态详情 docker service logs 容器名 // 查看指定容器的运行日志
  • Replicas操作

    // 控制容器副本数(重启stack后会失效) docker service scale 容器名=副本数量 # 增加/缩减副本数量 // 在compose文件中设定(重启不会失效) deploy: mode: replicated replicas: 2

六、使用 Docker 部署 Spring Boot

在plugins 中添加 Docker 构建插件

相当于执行maven时,自动执行docker build dockerFile位置 -t 镜像名:版本号---->把整个项目打包为一个镜像

<!--在pom.xml的project下定义artifactId和version--> <artifactId>artifactId</artifactId> <version>version</version> <build> <plugins> <!-- Docker maven plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.10</version> <executions> <!-- 1、配置当执行 mvn package(打jar包)的时候,顺便也执行一下 docker:build --> <execution> <id>build</id> <goals> <goal>build</goal> <!--<goal>push</goal>--> </goals> </execution> <!-- 2、给docker镜像打上最新标签 --> <execution> <id>tag</id> <goals> <goal>tag</goal> </goals> <configuration> <tag>latest</tag> </configuration> </execution> </executions> <configuration> <imageName>imageName</imageName> <!-- 3、指定 Dockerfile 路径,不指定默认与pom.xml同级--> <dockerDirectory>dockerFilePath</dockerDirectory> <!-- 4、复制 jar 包(项目整体的jar包)到 docker 容器指定目录 【与5二选一】 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <!-- 5、把变量(项目jar包名)传到dockerfile里面,进行jar包的copy 【与4二选一】 --> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> <\plugins> <\build>
  • 解释${project.build.finalName}

    • pom.xml源码

      <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
    • pom-4.0.0.xml源码

      <project> ... <build> ...... <!--因此,需要在pom.xml的project下定义artifactId和version--> <finalName>${project.artifactId}-${project.version}</finalName> ...... </build> ...... </project>

编写Dockerfile 文件

略,方法参见章节三,具体根据实际业务编写

# docker-plugings中第5步传参的使用(复制 jar 包到 docker 容器指定目录)
ARG JAR_FILE
ADD target/${JAR_FILE} name.jar
最后修改时间:2021-01-17 16:36:02
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论