快速入门Docker(5)——DockerFile|Docker网络

         上篇给大家讲解了镜像的原理,本篇文章主要讲解了关于DockerFile与Docker网络(重点) 还一个部分为DockerFile实践。
看完掌握以下内容:

  • 了解什么是DockerFile
  • 熟练使用DockerFile的命令
  • 搭建一个Tomcat的镜像文件
  • 完成镜像文件的上传(GitHub与阿里云)
  • 了解什么Docker网络
  • 自己定义网络
  • 安装redis集群
    快速入门Docker(5)——DockerFile|Docker网络_第1张图片

一、Docker File

1.1 初始DockerFile

Doceker 就是用来构建 Dcoekr镜像的构建文件!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

#创建一个DocekrFile文件,名字可以随机DockerFile
#构建脚本
FROM centos
 VOLUME ["volume01","volume02"]
 CMD echo "------------END-----------"
 CMD /bin/bash
 
 #测试命令
 [root@192 docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1  -t date/centos:1.0 .

快速入门Docker(5)——DockerFile|Docker网络_第2张图片
这个卷和外部一定有同步的目录!
快速入门Docker(5)——DockerFile|Docker网络_第3张图片

[root@1c65228adcac /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02
查看一下卷挂载目录

快速入门Docker(5)——DockerFile|Docker网络_第4张图片

1.2 数据卷容器

实战操作:多个MySQL之间数据更享
快速入门Docker(5)——DockerFile|Docker网络_第5张图片

#测试启动第一个docker 
[root@192 docker-test-volume]# docker run -it  --name docker002   date/centos:2.0
#第二个依赖与第一个
[root@192 data]# docker run -it --name docker003 --volumes-from docker002 date/centos:2.0
#第一个
[root@b99b1e7c0242 volume01]# touch aa.txt
[root@b99b1e7c0242 volume01]# ls
aa.txt
[root@b99b1e7c0242 volume01]#
#第二个
[root@9f7016f1747b volume01]# ls
[root@9f7016f1747b volume01]# ls
aa.txt
[root@9f7016f1747b volume01]#

多个MySQL 实现数据共享

[root@192 test]# docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7

[root@192 test]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root volumes-from mysql01  --name mysql01 mysql:5.7

结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持久到没有容器使用位置

1.3 DockerFile构建过程

构建步骤:

  1. 编写 一个dockerFIle文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库!)

基础知识:

  1. 每个保留关键字 (指令)都是必须是大小字母
  2. 执行从上到下的顺序执行
  3. #表示注释
  4. 每一个执指令都会创建提交一个新的镜像,并提交
    快速入门Docker(5)——DockerFile|Docker网络_第6张图片
    dockerfile是面像开发的,我们以后做项目要发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单。
    步骤:
    DockerFile: 构建文件,定义了一切的步骤,源代码
    DockerImages:通过dockerFile 构建生成的镜像文件,最终 发布和运行的产品
    Docker容器: 容器就是镜像运行起来提供服务器

1.4 DockerFile命令

FROM                 	#基础镜像,一切从这里开始构建
MAINAINER               #镜像是谁写的,姓名 + 邮箱
RUN                     #镜像构建的时候需要运行指令
ADD                     #步骤: tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR                 #镜像构架目录
VOLUME                  #挂载的目录
EXPOSE                  #保留端口配置
CMD                     #指定这个容器启动的时候运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT              #指定中特容器启动的时候运行的命令,可以追加命令
ONBUILD                 #当构建一个被继承 DockerFile 这个时候会运行 ONBUILD 的命令。触发指令
COPY                    #类似ADD,将我们文件拷贝到镜像中
ENV                     #构建的时候设置环境变量

1.5 实战练习

#构建dockerFile文件
[root@192 dockerfile]# vim dockerfile
FROM centos
MAINTAINER  大数据老哥<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN  yum -y install vim
RUN  yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD  /bin/bash
# 通过这个文件构建镜像
#命令 docker build -f dockerfile  -t 镜像名称:【tag】
[root@192 dockerfile]# docker build -f /home/dockerfile/dockerfile  -t mydockerfile:1.0  .
#执行成功后发现以下信息
Successfully built 59d5939d0709
Successfully tagged mydockerfile:1.0

启动与官方提供的centos进对比

官方

快速入门Docker(5)——DockerFile|Docker网络_第7张图片

启动我们自己知制的镜像

快速入门Docker(5)——DockerFile|Docker网络_第8张图片
我们可以列出本地进项变更的历史
快速入门Docker(5)——DockerFile|Docker网络_第9张图片

1.6 CMD 与 ENTRYPOINT 区别(重点)

测试CMD

#创建cmd dockerfile 
[root@192 dockerfile]# cat dockercmd
FROM centos
CMD ["ls","-a"]
#构建镜像
[root@192 dockerfile]# docker build -f dockercmd  -t docercmd .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 0d120b6ccaa8
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 245e5b211e0f
Removing intermediate container 245e5b211e0f
 ---> e53c44d55553
Successfully built e53c44d55553
Successfully tagged docercmd:latest
[root@192 dockerfile]# docker run e53c44d55553
home
lib
lib64
lost+found
media
mnt
opt
proc
[root@192 dockerfile]# docker run e53c44d55553 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
#cmd 的清理下 -l 替换了 CMD ["ls","-a"] 命令 ,-l 不是命令所有就报错

测试 ENTRYPOINT

#创建 ENTRYPOINT   dockerfile 
[root@192 dockerfile]# cat dockerentrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
[root@192 dockerfile]# docker build -f  dockerentrypoint  -t dockerentrypoint .
Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM centos
 ---> 0d120b6ccaa8
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 0ee3f49352f4
Removing intermediate container 0ee3f49352f4
 ---> a6913221f636
Successfully built a6913221f636
Successfully tagged dockerentrypoint:latest
[root@192 dockerfile]# docker run a6913221f636
bin
dev
etc
home
lib

[root@192 dockerfile]# docker run a6913221f636 -l
total 0
drwxr-xr-x.   1 root root   6 Nov 22 13:43 .
drwxr-xr-x.   1 root root   6 Nov 22 13:43 ..
-rwxr-xr-x.   1 root root   0 Nov 22 13:43 .dockerenv
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
# 我们追加的命令,是直接拼接在我们 ENTRYPOINT  命令后面!

总结: DockerFile 中很多命令十分相似,我们需要了解,我们最好的学习就是对比他们然后进行测试效果!

1.7 制作Tomcat 镜像文件

  1. 准备镜像文件tomcat压缩包,jdk的压缩包
    在这里插入图片描述
  2. 编写dockerFile文件,官方命名Dockerfile,build时会自动寻找这个文件,就不要-f制定了
vim Dockerfile
# 加载基础centos
FROM centos
#设置作者
MAINTAINER 大数据老哥<[email protected]>

# 添加tomcat jar包 添加进去默认就解压
ADD apache-tomcat-9.0.40.tar.gz /usr/local/
# 添加 jdk jar包
ADD jdk-8u144-linux-x64.tar.gz /usr/local/


#设置工作目录

ENV MYPATH /usr/local
WORKDIR $MYPATH

#加载配置文件

ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV ClASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV TOMCAT_HOME /usr/local/apache-tomcat-9.0.40
ENV TOMCAT_BASH /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:TOMCAT_HOME/lib:$TOMCAT_BASH/bin

# 设置端口开放

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
  1. 根据镜像文件构建镜像
docker build -t mytomcat .
  1. 启动镜像
[root@192 jar]# docker run -d  -p 8080:8080 --name mytomcat  -v /opt/jar/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test -v /opt/jar/tomcat/logs:/usr/local/apache-tomcat-9.0.40/logs a57fa3f9952e
00656a7a095285ef618c8785c30ee768e38797c578997e2ad3ae387eca4c55f8
  1. 访问测试
    快速入门Docker(5)——DockerFile|Docker网络_第10张图片
  2. 发布项目

在本地test目录下创建WEB-INF
mkdir WEB-INF

创建web.xml文件

?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="osg.AndroidExample"
      android:installLocation="preferExternal"
      android:versionCode="1"
      android:versionName="1.0">
manifest>

创建JSP文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
           <title>大数据老哥title>
    head>
    <body>
       <h1>微信搜索大数据老哥你值得拥有<h1>
           <%
                 System.out.println("微信关注大数据老哥");
           %>
         body>
   body>
html>
发现:项目部署成功后发现可以直接进行访问

快速入门Docker(5)——DockerFile|Docker网络_第11张图片

1.8 发布镜像GetHub

  1. 地址 https://hub.docker.com/ 注册自己的账号
  2. 登录自己的账号
# 输入自己的账号密码
docker login  -u 
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
  1. 登录完毕后可以提交镜像
# 修改 tag版本
[root@192 ~]# docker tag a57fa3f9952e   dashujulaoge/mytomcat:1.0
[root@192 ~]# docker push  dashujulaoge/mytomcat:1.0
The push refers to repository [docker.io/dashujulaoge/mytomcat]
a220a5aaf18b: Pushing [==================================================>]  377.5MB

1.9 发布镜像阿里云容器上

  1. 登录阿里
  2. 找到容器服务
  3. 创建命名空间
    快速入门Docker(5)——DockerFile|Docker网络_第12张图片
  4. 创建命名空间
    快速入门Docker(5)——DockerFile|Docker网络_第13张图片
    点击管理查看官方文档
    快速入门Docker(5)——DockerFile|Docker网络_第14张图片
    登录账号
root@192 ~]# docker login --username=用户名进行登录 registry.cn-qingdao.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

提交镜像

[root@192 ~]# docker tag  a57fa3f9952e  registry.cn-qingdao.aliyuncs.com/dashujulaoge/test:1.0
[root@192 ~]# docker push registry.cn-qingdao.aliyuncs.com/dashujulaoge/test:1.0
The push refers to repository [registry.cn-qingdao.aliyuncs.com/dashujulaoge/test]
a220a5aaf18b: Pushed
faeecf42435a: Pushed
291f6e44771a: Pushed
1.0: digest: sha256:5fe61237de0a6c3f4fe3d728600c10b42098377b8ceca9bac1a192fb42f28795 size: 954

查看提交成功
快速入门Docker(5)——DockerFile|Docker网络_第15张图片

二、Docker 网络

2.1 Dcoker0

第一个次测试

快速入门Docker(5)——DockerFile|Docker网络_第16张图片

问题: docker 是如何处理容器网络访问的?

快速入门Docker(5)——DockerFile|Docker网络_第17张图片
下载tomcat镜像测试

[root@192 ~]# docker run -d -P  --name tomcat01 tomcat
# 查看容器内部网络地址 IP addr, 发现容器启动的时候回得到一个 eth0@if91 IP地址,docker分配的
[root@192 ~]# docker exec -it tomcat01  ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
90: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

思考: Linux 能不能ping通容器内部?

[root@192 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.050 ms

原理:
我们在启动要给docker 容器,docker 就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0,是一个桥接模式,使用的技术是evth-pair技术。

2.在次测试IP addr

快速入门Docker(5)——DockerFile|Docker网络_第18张图片

3.在启动一个tomcat 容器测试,发现有多了有一堆网卡
快速入门Docker(5)——DockerFile|Docker网络_第19张图片

我们发现这个容器带来网卡,都是一对一对的
evth-pait 就是一对的虚拟设备,他们都是成对出现的,一段连着协议,一段彼此相连
正因为有这个特性,evth-pair  充当一个桥梁,连接各种虚拟网路设备的
Openstac,Docker容器之间的链接,ovs的连接,都是使用的evht-pair 技术

我们来测试下 tomcat01 和tomcat02 是否可以ping通

[root@192 ~]# docker exec -it tomcat01 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.044 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.047 ms
# 结论:容器和容器之间是可以互相 ping通的

网络模型图:
快速入门Docker(5)——DockerFile|Docker网络_第20张图片
结论:

  1. tomcat01 和tomcat02 是公用一个docker01
  2. 所有的容器不指定内网的情况下,都是docker0 的,docker 会给我的容器分配一个默认的可用IP
    快速入门Docker(5)——DockerFile|Docker网络_第21张图片
    Docke中所有的网络接口都是虚拟的。虚拟的转发效率高!
    只要删除容器 ,对应的网桥一对就没了

2.2 自己自定义网络

查看所有的docker网络

在这里插入图片描述

2.2.1 网络模式

  1. bridge: 桥接docke(默认的)
  2. none: 不配置网络
  3. host: 和宿主共享网络
  4. container: 容器网络连通 (局现性)

测试

docker run -d P --name tomcat01 tomcat
docker run -d p --name tomcat01 --net bridge tomcat

#docker0 特点  默认,域名不能访问 --link可以打通连接
#自定义一个网络
[root@192 ~]# docker network  create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
52059516f0e8b6a9dd7beafea725dde886f6e1555141dbe390213689b79bb2c5

[root@192 ~]# docker network  ls
NETWORK ID          NAME                DRIVER              SCOPE
481414b48bb2        bridge              bridge              local
8755abc19f0e        host                host                local
52059516f0e8        mynet               bridge              local
b7b7e4b65752        none                null                local

我们自己的网络创建成功
快速入门Docker(5)——DockerFile|Docker网络_第22张图片
启动两个tomcat进行测试

[root@192 ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
6357504d4d17dac1c94e5b0ed4ddf8df74d9378e168fe05d21fee2da99da5581
[root@192 ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
d6c1577cf71063add76f1f9a8fe0935817c71871eb231bb318b0dac92567604d
# 使用IP 是可以ping通的
[root@192 ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.	
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.047 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.047/0.057/0.067/0.010 ms
# 使用名称也是可以ping通的 就不需要 --like
[root@192 ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.048 ms
^C
--- tomcat-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.038/0.045/0.049/0.005 ms

快速入门Docker(5)——DockerFile|Docker网络_第23张图片

2.2.2 网络连通

快速入门Docker(5)——DockerFile|Docker网络_第24张图片

# 直接ping是ping不通的
[root@192 ~]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
#网卡打通 tomcat01 -mynet
[root@192 ~]# docker network  connect mynet  tomcat01
#测试打通 tomcat01 -mynet 
[root@192 ~]# docker exec -it tomcat01  ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.046 ms
一个容器两个熊地址  类似于阿里云服务公网 IP, 私网ip
[root@192 ~]# docker network  inspect mynet

快速入门Docker(5)——DockerFile|Docker网络_第25张图片
结论:假设要夸网络操作别人,就需要使用docker network connect 连通

2.3 实战部署Redis集群

#创建redis网络
docker network  create redis --subnet 172.38.0.0/16
#设置redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379 
bind 0.0.0.0
cluster-enabled yes 
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

 # 启动6个redis镜像文件
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
    -v /mydata/redis/node-${port}/data:/data \
    -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
# 创建集群
 redis-cli --cluster  create 172.38.0.11:6379 172.38.0.12:6379  172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0
.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 31aea44c244de5afd121beb52a6859cda4397c34 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: eee93f9a07433ffdeba577df2e765159c5145ce3 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: cb0860cbf86334e81764b9d2e31eea3bbaf02c1c 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 4ab3f33fe4b0f65c2ef937f45fe8f07fb770243e 172.38.0.14:6379
   replicates cb0860cbf86334e81764b9d2e31eea3bbaf02c1c
S: b97f99e7fa69faad1a4bbd6d0ba71f90932e1f96 172.38.0.15:6379
   replicates 31aea44c244de5afd121beb52a6859cda4397c34
S: a367c8d7fdec708befde592c9d6c488ba8078bab 172.38.0.16:6379
   replicates eee93f9a07433ffdeba577df2e765159c5145ce3
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 31aea44c244de5afd121beb52a6859cda4397c34 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: b97f99e7fa69faad1a4bbd6d0ba71f90932e1f96 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 31aea44c244de5afd121beb52a6859cda4397c34
S: 4ab3f33fe4b0f65c2ef937f45fe8f07fb770243e 172.38.0.14:6379
   slots: (0 slots) slave
   replicates cb0860cbf86334e81764b9d2e31eea3bbaf02c1c
S: a367c8d7fdec708befde592c9d6c488ba8078bab 172.38.0.16:6379
   slots: (0 slots) slave
   replicates eee93f9a07433ffdeba577df2e765159c5145ce3
M: eee93f9a07433ffdeba577df2e765159c5145ce3 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: cb0860cbf86334e81764b9d2e31eea3bbaf02c1c 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

三、 总结

         好了,经过几天的努力我们终于把Docker学完了,本篇文章可能有点多,后续会分享一些关于Docker进阶版,微信搜索公众号【大数据老哥】第一时间即可阅读。

四、 粉丝福利

         以下内容是博主花费了1个星期的时间总结各大厂商的面试题与拜访大佬总结的内容那个 关注公证号【大数据老哥】回复:Docker基础面试题即可获取。
快速入门Docker(5)——DockerFile|Docker网络_第26张图片

关注老哥不迷路公证号搜索【大数据老哥】可以获取可以获取 大数据面经、Java面经、超级棒的开发软件、各种书籍推荐…等(各种资源等着你呦)。

快速入门Docker(5)——DockerFile|Docker网络_第27张图片

你可能感兴趣的:(Docker,Docker,大数据,运维,运维开发)