尚硅谷 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 镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

image-20220820205504549

构建三步骤:

  • 编写 Dockerfile 文件
  • docker build 命令构建镜像
  • docker run 依镜像运行容器实例

2. DockerFile 构建过程解析

2.1 Dockerfile 内容基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. ”#“ 表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

2.2 Docker 执行 Dockerfile 的大致流程

  1. docker 从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似 docker commit 的操作提交一个新的镜像层
  4. docker 再基于刚提交的镜像运行一个新容器
  5. 执行 dockerfile 中的下一条指令直到所有指令都执行完成

image-20220820210155728

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

  1. 下载 jdk,并且移到虚拟机下
  2. jdk 所在目录下编写 Dockerfile 文件(注意:D 要大写)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM centos
MAINTAINER zzyy<zzyybs@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  1. 构建

docker build -t 新镜像名字:TAG .

注意:有个空格,有个 . 在后面

image-20220820211646875

  1. 运行新镜像

docker run -it 新镜像名字:TAG

5. 虚悬镜像

仓库名、标签都是<none>的镜像,俗称 dangling image

image-20220820211845643

5.1 查看虚悬镜像

docker image ls -f dangling=true

image-20220820211914803

5.2 删除虚悬镜像

docker image prune

虚悬镜像已经没用了,可以删除。

二. Docker 微服务实战

1.新建一个普通微服务模块

不是主要内容,省略

2.通过 Dockerfile 发布部署到 Docker 容器

  1. 在 IDEA 中利用 maven 打好 jar 包

image-20220820212326092

  1. 编写 Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
  1. 把 jar 包和 Dockerfile 放到同一个目录下

image-20220820212434019

  1. 构建镜像

docker build -t zzyy_docker:1.6 .

image-20220820212511503

  1. 运行镜像

docker run -d -p 6001:6001 zzyy_docker:1.6

image-20220820212628318

  1. 访问测试

image-20220820212645444

三. Docker 网络

1. Docker 网络是什么

当我们启动 Docker 后,会产生一个名为 docker0 的虚拟网桥

image-20220820212848431

2. Docker 网络常用基本命令

image-20220820212956626

命令 描述
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 地址和子网掩码,让主机和容器之间可以通过网桥相互通信

image-20220820213446573

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、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

image-20220820213740450

5. 自定义网络

利用 Docker 自带的 bridge 网络模式,在容器内部之能按照 IP 互相 ping 通,但是我们的 ip 地址是有可能不断变化的,这就导致我们不能硬编码写死在程序中,怎么解决这个问题呢?

  • 自定义网络本身就维护好了主机名和 ip 的对应关系(ip 和域名都能通)
  1. 新建网络

image-20220820214038698

  1. 新建容器加入新建的自定义网络

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

  1. 互相 ping

image-20220820214120397

image-20220820214125060

可以看到能够通过服务名来 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…

  1. docker-compose.yml 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: "3"

services:
microService:
image: zzyy_docker:1.6
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- atguigu_net
depends_on:
- redis
- mysql

redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf

mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'zzyy'
MYSQL_PASSWORD: 'zzyy123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

networks:
atguigu_net:
  1. 修改微服务工程

将配置文件中的 Mysql 和 Redis 的 ip 地址用服务名代替,与 IP 无关

  1. 执行 docker-compose up 或者 执行 docker-compose up -d

image-20220820215426659

image-20220820215433199

搞定!

五.可视化工具 Portainer

Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理 Docker 环境,包括单机环境和集群环境。

官网

1.安装

参照官网就完事了

六.Docker 监控 CAdvisor+InfluxDB+Granfana

90CIG 容器重量级监控系统介绍哔哩哔哩_bilibili