Docker高级篇
尚硅谷 2022 版 Docker 实战教程官方课程资料:https://pan.baidu.com/s/1AyYbnDRoD-m2xBPvfvjh7Q?pwd=8gfh
提取码:8gfh
Docker 高级
一. DockerFile 解析
1. DockerFile 是什么
官网地址:https://docs.docker.com/engine/reference/builder/
Dockerfile 是用来构建 Docker 镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三步骤:
- 编写 Dockerfile 文件
- docker build 命令构建镜像
- docker run 依镜像运行容器实例
2. DockerFile 构建过程解析
2.1 Dockerfile 内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- ”#“ 表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
2.2 Docker 执行 Dockerfile 的大致流程
- docker 从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- docker 再基于刚提交的镜像运行一个新容器
- 执行 dockerfile 中的下一条指令直到所有指令都执行完成
3. Dockerfile 常见保留字
保留字 | 说明 |
---|---|
FROM | 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是 from |
MAINTAINER | 镜像维护者的姓名和邮箱地址 |
RUN | 容器构建时需要运行的命令,RUN 是在 docker build 时运行(RUN yum -y install vim) |
EXPOSE | 当前容器对外暴露出的端口 |
WORKDIR | 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 |
USER | 指定该镜像以什么样的用户去执行,如果都不指定,默认是 root,一般不指定 |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像且会自动处理 URL 和解压 tar 压缩包 |
COPY | 类似 ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置,COPY <src 源路径> <dest 目标路径> |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定容器启动后的要干的事情,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换 |
ENTRYPOINT | 也是用来指定一个容器启动时要运行的命令,类似于 CMD 指令,但是 ENTRYPOINT 不会被 docker run 后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序 |
4. 案例
需求:在 CentOS7 镜像中添加 vim,ifconfig,jdk8,并生成一个新的自定义镜像 mycentosjava8
- 下载 jdk,并且移到虚拟机下
- 在jdk 所在目录下编写 Dockerfile 文件(注意:D 要大写)
1 | FROM centos |
- 构建
docker build -t 新镜像名字:TAG .
注意:有个空格,有个 . 在后面
- 运行新镜像
docker run -it 新镜像名字:TAG
5. 虚悬镜像
仓库名、标签都是<none>的镜像,俗称 dangling image
5.1 查看虚悬镜像
docker image ls -f dangling=true
5.2 删除虚悬镜像
docker image prune
虚悬镜像已经没用了,可以删除。
二. Docker 微服务实战
1.新建一个普通微服务模块
不是主要内容,省略
2.通过 Dockerfile 发布部署到 Docker 容器
- 在 IDEA 中利用 maven 打好 jar 包
- 编写 Dockerfile
1 | # 基础镜像使用java |
- 把 jar 包和 Dockerfile 放到同一个目录下
- 构建镜像
docker build -t zzyy_docker:1.6 .
- 运行镜像
docker run -d -p 6001:6001 zzyy_docker:1.6
- 访问测试
三. Docker 网络
1. Docker 网络是什么
当我们启动 Docker 后,会产生一个名为 docker0 的虚拟网桥
2. Docker 网络常用基本命令
命令 | 描述 |
---|---|
docker network ls | 查看网络 |
docker network inspect XXX 网络名字 | 查看网络源数据 |
docker network rm XXX 网络名字 | 删除网络 |
3. Docker 网络能干嘛
- 容器间的互联和通信以及端口映射
- 容器 IP 变动时候可以通过服务名直接网络通信而不受到影响
4. 网络模式
- bridge 模式:使用–network bridge 指定,默认使用 docker0
- host 模式:使用–network host 指定
- none 模式:使用–network none 指定
- container 模式:使用–network container:NAME 或者容器 ID 指定
docker 容器内部的 ip 是有可能会发生改变的
4.1 bridge
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为 docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
4.2 host
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。容器将不会获得一个独立的 Network Namespace, 而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的 IP 和端口。
4.3 none
在 none 模式下,并不为 Docker 容器进行任何网络配置。 也就是说,这个 Docker 容器没有网卡、IP、路由等信息,只有一个 lo,需要我们自己为 Docker 容器添加网卡、配置 IP 等。
4.4 container
新建的容器和已经存在的一个容器共享一个网络 ip 配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
5. 自定义网络
利用 Docker 自带的 bridge 网络模式,在容器内部之能按照 IP 互相 ping 通,但是我们的 ip 地址是有可能不断变化的,这就导致我们不能硬编码写死在程序中,怎么解决这个问题呢?
- 自定义网络本身就维护好了主机名和 ip 的对应关系(ip 和域名都能通)
- 新建网络
- 新建容器加入新建的自定义网络
docker run -d -p 8081:8080 –network zzyy_network –name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 –network zzyy_network –name tomcat82 billygoo/tomcat8-jdk8
- 互相 ping
可以看到能够通过服务名来 Ping 通。
四. Docker-compose 容器编排
目前我们的容器较少,一个一个启动也不那么费劲,但是我们可以试想,如果我的一个项目,用到了 Mysql,Redis,还有各个微服务,那么每次启动都要一个一个启动,而且有时还需要保证启动的顺序,是不是很头疼,那么我们就需要一个“总管”,能够帮我们一次性的按照顺序的启动我们需要的容器。
1. Docker-compose 是什么
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件 docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。
Compose 允许用户通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
官网:https://docs.docker.com/compose/compose-file/compose-file-v3/
官网下载:https://docs.docker.com/compose/install/
2. Compose 核心概念
一文件:docker-compose.yml
两要素:
- 服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql 容器、nginx 容器或者 redis 容器
- 工程(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
3. Compose 使用步骤
- 编写 Dockerfile 定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
4. Compose 常用命令
命令 | 描述 |
---|---|
docker-compose -h | 查看帮助 |
docker-compose up | 启动所有 docker-compose 服务 |
docker-compose up -d | 启动所有 docker-compose 服务并后台运行 |
docker-compose down | 停止并删除容器、网络、卷、镜像。 |
docker-compose exec yml 里面的服务 id | 进入容器实例内部 docker-compose exec |
docker-compose ps | 展示当前 docker-compose 编排过的运行的所有容器 |
docker-compose top | 展示当前 docker-compose 编排过的容器进程 |
docker-compose logs yml 里面的服务 id | 查看容器输出日志 |
docker-compose config | 检查配置 |
5. Compose 编排微服务
假设一个微服务需要用到 MySQL,Redis…
- docker-compose.yml 文件
1 | version: "3" |
- 修改微服务工程
将配置文件中的 Mysql 和 Redis 的 ip 地址用服务名代替,与 IP 无关
- 执行 docker-compose up 或者 执行 docker-compose up -d
搞定!
五.可视化工具 Portainer
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理 Docker 环境,包括单机环境和集群环境。
官网
1.安装
参照官网就完事了