Docker 容器详解

Docker安装

Docker的基本组成

镜像

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务器

tomcar镜像==> run ==> tomcat容器(提供服务器)

通过这个镜像可以创建多个容器(最终服务器或者项目运行在容器中)

容器

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建

启动 停止 删除 基本命令

可以把容器理解为一个简单的linux系统

仓库

就是存放镜像的地方

仓库分为公有和私有

HelloWorld 流程回顾

docker种子搜索_docker

docker种子搜索_学习_02

Docker底层原理

Docker是怎么工作的?

Docker是一个Client-Server 结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问

DockerServer接收到Docker-Client的指令,就会执行这个命令

docker种子搜索_后端_03

Docker为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,VM需要是Guest OS

docker种子搜索_Docker_04

所以说,新建一个容器的时候,Docker不需要像虚拟机那样重新加载一个操作系统内核,避免引导,虚拟机的加载Guest OS,分钟级别的,而Docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级

Docker常用命令

帮助命令

docker version    #显示docker的版本信息
docker info       #显示docker的系统信息,包括镜像和容器的数量
docker --help     #帮助命令

镜像命令

docker images 查看所有本地的主机上的镜像

[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   11 months ago   13.3kB

#解释
REPOSITORY   镜像的仓库源
TAG          镜像的标签
IMAGE ID     镜像的id
CREATED      镜像的创建时间
SIZE         镜像的大小

#可选项
 -a, --all             # 列出所有镜像
 -q, --quiet           # 只显示镜像的id

docker search 搜索镜像

[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13166     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5031      [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   625       [OK]       
percona                         Percona Server is a fork of the MySQL relati…   584       [OK]       
bitnami/mysql                   Bitnami MySQL Docker Image                      76                   

#可选项,通过搜索来过滤
--filter=STARS=3000    #搜索出来的经镜像就是stars大于3000的
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   13166     [OK]       
mariadb   MariaDB Server is a high performing open sou…   5031      [OK]

docker pull 下载命令

#下载镜像docker pu17镜像名[:tag]
[root@kuangshen /]# docker pu11 mysql
Using default tag: latest     #如果不写tag,默认就是1atest
1atest: Pu17ing from 1ibrary/mysq1
5b54d594fba7: Pu11 complete #分层下载,docker iamge的核心  联合文件系统
o7e7d6a8a868: Pu11 complete
abd946892310: Pu11 complete
dd8f4d07efa5: Pu11 complete
076d396a6205: Pu11 complete
cf6b2b93048f: Pu11 complete
530904b4a8b7: Pu11 complete
fb1e55059a95: Pu11 complete
4bd29a0dcde8: Pu11 complete
b94a001c6ec7: Pu11 complete
cb77cbeb422b: Pu11 complete
2a35cdbd42cc: Pu11 complete
Digest: sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625  #签名
status : Downloaded newer image for mysq7 : latest
docker.io/1ibrary/mysq1 :latest#真实地址

docker rmi 删除镜像

# docker rmi    -f  镜像id    #册除指定的镜像
# docker rmi    -f  镜像id  镜像id  镜像id  镜像id   #删除多个镜像 
# docker rmi -f $(docker images -aq)    #删除全部的镜像

容器命令

说明:有了镜像才可以创建容器,Linux,下载一个centos镜像来学习

docker pull centos

新建容器并启动

docker run[可选参数]image
#参数说明
--name="name"       #容器名字 tomcat01 tomcat02 用来区分容器
-d                  #后台方式运行
-it                 #使用交互方式运行,进入容器查看内容
-p                  #指定容器的端口  -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
-p                  #随机指定端口

#测试 启动并进入容器
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker run -it centos /bin/bash
[root@8f6dedc2b14c /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

列出所有运行的容器

# docker ps 命令
       #列出当前正在运行的容器
-a     #列出当前正在运行的容器+带出历史运行的容器
-n=?   #显示最近创建的容器
-q     #只显示容器的编号
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
8f6dedc2b14c   centos         "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago             hungry_haibt
931fca9daf06   feb5d9fea6a5   "/hello"      18 hours ago    Exited (0) 18 hours ago              dazzling_greider

退出容器

exit       #直接容器停止并退出
Ctrl+p+q   #容器不停止退出

删除容器

docker rm 容器id                    #删除指定容器  不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq)      #删除所有容器
docker ps -a -q|xargs docker rm    #删除所有的容器

启动和停止容器的操作

docker start 容器id      #启动容器
docker restart 容器id    #重启容器
docker stop 容器id       #停止当前正在运行的容器
docker kill 容器id       #强制停止当前容器

常用其它命令

后台启动容器

#后台启动容器  docker run -d 镜像名
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker run -d centos
68edd2094d03ed53fc2f8e8717e248cf178007bcfa9f4645df8174e30d64084b

#问题  docker ps 发现centos停止了

#常见的坑 docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs -f -t --tail 容器,没有日志

#自己编写一段shell脚本
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker run -d centos /bin/sh -c "while true;do echo heitu;sleep 1;done"
0f386d3b73d999e19af4ac3dc9dabab1472af65b18f7e8d5c95fda659c3336ea

#[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
0f386d3b73d9   centos    "/bin/sh -c 'while t…"   17 seconds ago   Up 16 seconds             pedantic_varahamihira

#显示日志
-tf            #显示日志
--tail +number #要显示的日志条数
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker logs -tf --tail  10 0f386d3b73d9

查看容器中进程信息

#命令  docker top 容器id 
[root@iZ0jl73kn1zl36lmdmit1zZ ~]# docker top 0f386d3b73d9
UID                 PID                 PPID                C                   STIME               TTY     
root                16137               16117               0                   15:01               ?       
root                16711               16137               0                   15:10               ?

查看镜像的元数据

# docker inspect 容器id

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

#命令 docker exec -it 容器id bashshell

#方式二
docker attach 容器id
进入的是正在执行的代码

#docker exec      进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach    进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径  目的主机路径

小结

attach   Attach to a running container   #当前she1l 下attach 连接指定运行镜像
bui1d    Bui1d an image from a Dockerfile  #通过Dockerfile定制镜像
commit   create a new image from a container changes #提交当前容器为新的镜像
cp       Copy files/folders from the containers filesystem to the host path#从容器中拷贝指定文件或者目录到宿主机中
create   Create a new container          #创建一个新的容器,同run,但不启动容器
diff     Inspect changes on a container 's filesystem   #查看docker容器变化
events   Get real time events from the server     #从 docker服务获取容器实时事件
exec     Run a command in an existing container     #在已存在的容器上运行命令
export   Stream the contents of a container as a tar archive   #导出容器的内容流作为一个 tar 归档文件[对应import ]
history  show the history of an image    #展示一个镜像形成历史
images   List images     #列出系统当前镜像
import   create a new filesystem image from the contents of a tarba1l    # 从tar包中的内容创建一个新的文件系统映像[对应export]
info     Display system-wide information      #显示系统相关信息
inspect  Return low-leve1 information on a container       #查看容器详细信息.
kill     Kill a running container   #kill指定docker容器
load     Load an image from a tar archive   #从一个tar包中加载—个镜像[对应save]
login    Register or Login to the docker registry server #注册或者登陆一个docker源服务器
1ogout   Log out from a Docker registry server   #从当前Docker registry退出
logs     Fetch the 1ogs of a container      #输出当前容器日志信息
port     Lookup the public-facing port which is NAT-ed to PRTVATE_PORT #查看映射端口对应的容器内部源端口
pause    Pause a11 processes within a container       #暂停容器
ps       List containers    #列出容器列表
pu11     Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push     Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart  Restart a running container       #重启运行的容器
rm       Remove one or more containers     #移除一个或者多个容器
rmi      Remove one or more images         #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run      Run a command in a new container    #创建一个新的容器并运行一个命令
save     save an image to a tar archive    #保存一个镜像为—个 tar 包[对应load]
search   search for an image on the Docker Hub      #在docker hub中搜索镜像
start    start a stopped containers       #启动容器
stop     Stop a running containers       #停止容器
tag      Tag an image into a repository      #给源中镜像打标签
top      Lookup the running processes of a container   #查看容器中运行的进程信息.
unpause  Unpause a paused container      #取消暂停容器
version  show the docker version information     #查看docker版本号
wait     Block until a container stops,then print its exit code#截取容器停止时的退出状态值

Docker镜像

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置文件。

如何得到镜像:

  • 从远程仓库下载
  • 从别人那里拷贝
  • 自己制作一个镜像DockerFile

Docker镜像加载原理

UnionFS(联合文件系统)

UnionFS(联合文件系统):Union文件系统 ( UnionFS ) 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的LinuxUnix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, letc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。

docker种子搜索_docker种子搜索_05

平时我们安装虚拟机的Centos都是好几个G,为什么Docker这里才200M?

docker种子搜索_后端_06

对于一个精简的OS , rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel ,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。

分层理解

分层的镜像

我们可以去下载一个镜像,通过发现下载的日志输出,可以看到的是一层一层的在下载

docker种子搜索_后端_07

理解

所有的Docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层

举一个例子,假如基于Ubuntu linux 16 创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层,如果继续添加一个安全补丁,就会创建第三个镜像层。

该镜像当前已经包含3个镜像层,如下图所示

docker种子搜索_后端_08

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,下图中,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件

docker种子搜索_docker种子搜索_09

上图中的镜像层跟之前图中的有一点区别,只要目的是便于展示文件

下图是一个稍稍复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本

docker种子搜索_docker_10

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

docker种子搜索_Docker_11

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部

这一层就是通常说的容器层,容器之下的都加镜像层

commit镜像

docker commit    #提交容器曾为一个新的副本
#命令和git原理相似
docker commit -m ="提交的描述信息" -a="作者" 容器id  目标镜像名,[tag]

容器数据卷

场景:通常情况下,我们将一个容器删除后,里面的数据也会一并被删除,但是有时候我们需要里面的数据,仅仅删除容器即可。

容器数据卷很好的解决了上述的问题,通过容器数据卷我们可以将数据同步到本地,与拷贝不同的是,容器数据卷将容器与本地“打通",能够实时同步,并且是双向的,即在容器中生成的数据会同步到本地,同时在本地生成的文件也会同步到容器。

docker种子搜索_Docker_12

例:将容器中centos的/home目录的内容同步到本地的/home/docker-test目录

#docker run -it -v 主机目录,容器内目录
docker run -it -v /home/docker-test:/home centos /bin/bash

docker种子搜索_docker_13

具名挂载和匿名挂载

#具名挂载
-v 卷名:容器内的路径
docker run -d -P --name nginx02 -v heitu-nginx: /etc/nginx nginx

#匿名挂载
docker run -d -P ngix01 -v /etc/nginx nginx

#不指定容器外的路径,默认存放在:/var/lib/docker/volumes/xxxx
,还是指定路径挂载
#如何确定是具名挂载还是匿名挂载
-v 容器内路径         #匿名挂载
-v 卷名:容器内路径     #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载

docker种子搜索_后端_14

#可以通过 docker volume inspect 卷名  来查看具体的信息

docker种子搜索_docker_15

扩展

#通过 -v 容器内路径:ro rw 改变读写权限
ro   readonly    #只读
rw   readwrite   #可读可写

#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx01 -v heitu-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v heitu-nginx:/etc/nginx:rw nginx
#ro只要看到是ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的

初识Dockerfile

Dockerfile就是用来构建docker镜像的构建文件,命令脚本,

通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!

#数据卷挂载的另一个方式

# 创建一个dockerfile文件,名字可以随机
# 文件中的内容 指令*大写) 参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo  "--------end---------"
CMD /bin/bash
#这里的每个命令,就是镜像的一层

docker种子搜索_后端_16

#启动写的容器

docker种子搜索_docker_17

这个卷一定和外部有一个同步的目录

docker种子搜索_学习_18

docker种子搜索_学习_19

测试是否同步

docker种子搜索_docker_20

数据卷容器

docker种子搜索_docker种子搜索_21


docker种子搜索_docker种子搜索_22

DockerFile

用来构建docker镜像的文件,命令参数脚本

构建步骤:

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

DockerFile构建过程

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交

DockerFile的指令

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

实践测试

创建一个自己的centos

#编写dockerfile的文件
[root@heitu dockerfile]# cat heitu-dockerfile
FROM centos
MAINTAINER heitu<zm3084464055@163.com>
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  

#通过这个文件构建镜像
[root@heitu dockerfile]# docker build -f heitu-dockerfile -t mycentos:1.0 .

Docker网络

docker种子搜索_Docker_23

–link

一个场景,编写了一个微服务,database url=ip,项目不重启,数据库IP换了,处理这个问题可以用名字来访问容器吗?

[root@heitu ~]# docker exec -it tomcat02 ping tomcat01
OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown
#在ping的过程中报以上错误
#解决办法
进入容器内部执行一下命令
apt-get update
apt install iputils-ping
apt install net-tools

#接着在执行
[root@heitu ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

#还是不能ping通,应该怎么解决
#在启动一个容器,使用--link与其中一个容器相连
[root@heitu ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
#此时还需要进入tomcat03容器,执行一下命令
apt-get update
apt install iputils-ping
apt install net-tools
#接着退出容器在执行命令就可以ping通
[root@heitu ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.056 ms

#思考 tomcat03可以ping通tomcat02,反向可以ping通吗?
[root@heitu ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
#原因是,toncat02里面没有进行配置

tomcat03可以ping通tomcat02的原因

docker种子搜索_docker种子搜索_24

自定义网络

#自定义网络
#--driver bridge            桥接
#--subnet 192.168.0.0/16    子网地址
#--gateway 192.168.0.1      网关
[root@heitu ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
e755eabaea31cb639479da9a5fc92941a5577d1a59567a34bb9275f6ef12bd7f
[root@heitu ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a9cbdce823ed   bridge    bridge    local
7bc51ad60d38   host      host      local
e755eabaea31   mynet     bridge    local
1fc39a82a312   none      null      local

docker种子搜索_后端_25

[root@heitu ~]# docker run -d -P --name tomcat-net01 --net mynet tomcat

[root@heitu ~]# docker run -d -P --name tomcat-net02 --net mynet tomcat

[root@heitu ~]# docker network inspect mynet
#得到以下结果

docker种子搜索_Docker_26

#此时两个容器可以不用--link就可以直接ping通
[root@heitu ~]# docker exec -it tomcat-net01 ping tomcat-net02
PING tomcat-net02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.058 ms

网络连通

docker种子搜索_docker种子搜索_27

#两边的能否ping通呢?  tomcat01 ping tomcat-net01?
[root@heitu ~]# docker exec -it tomcat01 ping tomcat-net01
ping: tomcat-net01: Name or service not known

docker种子搜索_docker种子搜索_28

# tomcat01 ping tomcat-net01的过程

[root@heitu ~]# docker network connect mynet tomcat01
[root@heitu ~]# docker network inspect mynet
#连通之后就是将tomcat01放到了mynet网络下
#一个容器两个ip地址

docker种子搜索_Docker_29

#此时就可以ping通
[root@heitu ~]# docker exec -it tomcat01 ping tomcat-net01
PING tomcat-net01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.066 ms

#此时tomcat02是无法打通的
#[root@heitu ~]# docker exec -it tomcat02 ping tomcat-net02
ping: tomcat-net02: Name or service not known