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

镜像(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规范
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、关系梳理

- 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




