1、Docker概述
- 官网:https://www.docker.com
- 仓库地址:https://hub.docker.com
- Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖到一个可移植的镜像中,然后发布到任何流行的Linux和Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
- Docker和虚拟机技术的不同
- 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所有就轻便了
- 每个容器是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响
- docker的基本组成
- 镜像(image):docker镜像就好比一个模板,可以通过这模板来创建容器服务,tomcat镜像-->run-->tomcat容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
- 容器(container):docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
- 仓库(repository):存放镜像的地方
2、安装Docker
2.1、安装
- 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 需要的安装包
yum install -y yum-utils
- 设置镜像仓库(阿里云的)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装docker
yum install docker-ce docker-ce-cli containerd.io
- 启动docker
systemctl start docker
- 查看docker版本
docker version
- 运行镜像
docker run hello-world
- 查看本地镜像
docker images
2.2、卸载
- yum remove docker-ce docker-ce-cli containerd.io
- rm -rf /var/lib/docker
2.3、阿里云镜像加速
3、Docker常用命令
docker version #显示docker版本信息
docker info #显示docker的系统信息
docker 命令 --help #帮助信息
3.1、镜像命令
docker images 查看所有本地主机上的镜像
- 可选项
- -a : 列出所有的镜像
- -q :只显示镜像的id
docker search 搜索镜像
- 可选项
- --filter=STARS=3000 :搜索出来的镜像就是STARS大于3000的
docker pull 下载镜像
- 指定版本下载
- docker pull 镜像名:[tag]
docker rmi 删除镜像
- docker rmi -f 镜像id :删除指定的镜像
- docker rmi -f 镜像id 镜像id 镜像id :删除多个镜像
- docker rmi -f $(docker images -aq) :删除全部镜像
3.2、容器命令
- 说明:有了镜像才可以创建容器,linux,下载一个centos镜像测试
docker pull centos
- 新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名称,用于区分容器
-d 后台运行方式
-it 使用交互式运行,进入容器查看内容
-p 指定容器端口
-P 随机指定端口
# 测试 启动并进入容器
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -it centos /bin/bash
[root@dacefc4cfdcb /]#
# 退出容器,从容器中退回主机
exit # 容器直接停止并退出
Ctrl + P +Q #容器不停止退出
- 列出所有的运行的容器
# docker ps
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器 + 历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
- 删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
- 停止和启动容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
3.3 常用其他命令
- 后台启动容器
# docker run -d 镜像名
- 查看日志
docker logs -tf --tail 10 容器id
-f # 显示日志
--tail number # 要显示日志条数
- 查看容器中的进程信息
docker top 容器id
- 查看容器的元数据
docker inspect 容器id
- 进入当前正在运行的容器
docker exec -it 容器id /bin/bash
docker attach 容器id
# docker exec # 进入容器后开启一个新的终端,可以在里面操作
# docker attach # 进入容器正在运行的终端,不会启动新的进程
- 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
4、部署Tomcat
- 下载tomcat
docker pull tomcat:9.0
- 启动运行
docker run -d -p 3344:8080 --name tomcat01 tomcat
-
将webapp.dist文件中的内容拷贝到webapp,或删除webapp将webapp.dist重命名为webapp
-
访问
4、Dokcer镜像
镜像是什么
- 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时的库、环境变量和配置文件
Dokcer镜像加载原理
- UnionFS(联合文件系统)
- UnionFS(联合文件系统):Union系统(UnionFS)是一种份分层、轻量级并且高性能的文件系统,它支持文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
- 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
- Docker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成,这种层级关系的文件系统UnionFS
- bootfs(boot file system)主要包括bootLoader和kernel,bootLoader主要是引导加载kernel,Linux刚启动时会架子bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,抱恨boot加载器和内核。当boot加载完成之后整个内核都在内存中了,此时内存的使用权已由boot转交给内核,此时系统也会卸载bootfs
- rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统的发行版,比如Ubuntu,Centos等等
- 对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。因此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同发型版本可以公用bootfs
分层理解
- 所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层
- Dokcer镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层
commit镜像
docker commit
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
- 实战测试
- 启动一个默认的tomcat
- 发现默认的tomcat是没有webapps应用
- 拷贝进入基本的文件
- 将操作的容器通过commit提交为一个镜像
[root@izbp1jbs6mikenptx3k00bz ~]# docker commit -a="cml" -m="add webap"
d64ce9e05617 tomcat-cml:1.0
sha256:a2abc348f45bdaed212143adf15e31f9bea14e6c04d2efed518506a835d19709
[root@izbp1jbs6mikenptx3k00bz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-cml 1.0 a2abc348f45b 14 seconds ago 209MB
5、容器卷技术
- Docker容器中产生的数据,同步到本地,目录的挂载,将我们的容器的目录挂载到Linux上面
- 容器的持久化和同步数据,容器间也是可以数据共享的
5.1、使用容器卷技术
# docker run -it -v 主机目录:容器目录
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -it -v /home/centos:/home centos /bin/bash
# 启动之后查看容器的消息信息
docker inspect 容器id
"Mounts": [
{
"Type": "bind",
"Source": "/home/centos", # 主机内地址
"Destination": "/home", #docker容器内地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
5.2、mysql同步数据
# 获取镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载
docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1 mysql:5.7
- 连接测试
5.3、具名挂载和匿名挂载
- 匿名挂载
# 匿名挂载,在挂载的时候只写了容器内的路径,没有写容器外的路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有卷的情况
[root@izbp1jbs6mikenptx3k00bz home]# docker volume ls
DRIVER VOLUME NAME
local 0dc52ad4ec2467b095683bec6c6dd1ed41bb4771efb37589ab7697cdbd913926 # 匿名卷挂载
- 具名挂载
docker run -d -P --name nginx01 -v nginx:/etc/nginx nginx
[root@izbp1jbs6mikenptx3k00bz home]# docker volume ls
DRIVER VOLUME NAME
local nginx # 具名挂载
-
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/...
-
ro(readonly) rw(readwrite)
docker run -d -P --name nginx01 -v nginx:/etc/nginx nginx:ro
docker run -d -P --name nginx01 -v nginx:/etc/nginx nginx:rw
5.4、初识Dokcerfile
-
Dockerfile 就是用来构建docker镜像的构建文件(命令脚本),通过这个脚本可以生成镜像,镜像是一层一层的,脚本每个命令都是一层
-
创建volumefile文件
vim dockerfile
- 编写volumefile文件
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
- 构建镜像
docker build -f /home/docker-test-volume/dockerfile -t cml/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 1aa3663f64bf
Removing intermediate container 1aa3663f64bf
---> 31b45322c01a
Step 3/4 : CMD echo "-----end-----"
---> Running in b94a197fb3d7
Removing intermediate container b94a197fb3d7
---> 40b6382df689
Step 4/4 : CMD /bin/bash
---> Running in fea3e4e1594d
Removing intermediate container fea3e4e1594d
---> 80f7a3e9a61d
Successfully built 80f7a3e9a61d
Successfully tagged cml/centos:1.0
- 查看构建的镜像 cml/centos
[root@izbp1jbs6mikenptx3k00bz docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cml/centos 1.0 80f7a3e9a61d About a minute ago 209MB
- 启动自己创建的镜像
docker run -it 80f7a3e9a61d /bin/bash
[root@48404c83c808 /]# ls -ll
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 22 02:00 dev
drwxr-xr-x 1 root root 4096 Feb 22 02:00 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 90 root root 0 Feb 22 02:00 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Feb 22 02:00 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Feb 22 02:00 volume01 # 生成目录就是我们生成镜像的时候自动挂载的,数据卷目录
drwxr-xr-x 2 root root 4096 Feb 22 02:00 volume02
- 查看卷挂载位置
docekr inspect 容器id
"Mounts": [
{
"Type": "volume",
"Name": "2ee46c6f0ca4a8d1c598d9d8de1478d8b5bcaa78f8ce7f979505bae2f90ade38",
"Source": "/var/lib/docker/volumes/2ee46c6f0ca4a8d1c598d9d8de1478d8b5bcaa78f8ce7f979505bae2f90ade38/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "2bdbda467044bb9cf3d9ab235b4acd5d2d362d56a3b99b4d0af7984191b9a50f",
"Source": "/var/lib/docker/volumes/2bdbda467044bb9cf3d9ab235b4acd5d2d362d56a3b99b4d0af7984191b9a50f/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
- 卷挂载位置
[root@izbp1jbs6mikenptx3k00bz volumes]# pwd
/var/lib/docker/volumes
[root@izbp1jbs6mikenptx3k00bz volumes]# ll
total 32
drwx-----x 3 root root 4096 Feb 22 10:00 2bdbda467044bb9cf3d9ab235b4acd5d2d362d56a3b99b4d0af7984191b9a50f
drwx-----x 3 root root 4096 Feb 22 10:00 2ee46c6f0ca4a8d1c598d9d8de1478d8b5bcaa78f8ce7f979505bae2f90ade38
5.5、数据卷容器
- 多个容器同步数据(--volumes-from)
# 查看镜像(cml/centos)
[root@izbp1jbs6mikenptx3k00bz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cml/centos 1.0 80f7a3e9a61d 25 minutes ago 209MB
# 启动cml/centos镜像 --name docker01
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -it --name docker01 cml/centos:1.0
# 启动cml/centos镜像 --name docker02 挂载到docker01
docker run -it --name docker02 --volumes-from docker01 cml/centos:1.0
# 启动cml/centos镜像 --name docker03 挂载到docker01
docker run -it --name docker03 --volumes-from docker01 cml/centos:1.0
6、DokcerFile
6.1、DockerFile介绍
- dockerfile是用来构造docker镜像的文件,命令参数脚本
- 构建步骤
- 编写一个dockerfile文件
- docker build构造成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub,阿里云镜像仓库)
- 查看一下官方是怎么做的(centos7)
- 很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
6.2、DockerFile搭建过程
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
-
表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
- DockerFile :构建文件,定义了一切的步骤
- DokcerImages :通过DockerFile构建生成的镜像,最终发布和运行的产品
- Docker容器 :镜像运行起来提供服务器
6.3、DockerFile指令
指令 | 说明 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 指定维护者信息,姓名+邮箱 |
RUN | 镜像构造的时候需要运行的命令 |
ADD | 添加内容 |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载目录 |
EXPOSE | 暴露端口 |
CMD | 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令 |
COPY | 将我们的文件拷贝到镜像中 |
ENV | 构造的时候设置环境变量 |
6.4、实战测试
6.4.1、构建centos镜像
- 编写dockerfile-centos
FROM centos
MAINTAINER cml<[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
- 通过dockerfile文件构建镜像
[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker build -f dockerfile-centos -t mycentos:1.0
[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 ef41b76755e2 53 seconds ago 282MB
- 查看镜像构建过程(docker history 镜像id)
[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 ef41b76755e2 7 minutes ago 282MB
[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker history ef41b76755e2
IMAGE CREATED CREATED BY SIZE COMMENT
ef41b76755e2 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
fff85f9b5d60 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
7729d8686dd5 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
b33a03f878d4 7 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
e3f132221a90 7 minutes ago /bin/sh -c yum -y install net-tools 14.3MB
0e5bef2bd9ff 7 minutes ago /bin/sh -c yum -y install vim 58MB
3b99b59c0b28 7 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
6f2546f9b347 7 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
615dd81bbe53 7 minutes ago /bin/sh -c #(nop) MAINTAINER cml<507545713@… 0B
300e315adb2f 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
6.4.2、构建tomcat镜像
- 上传tomcat 和 jdk 到linux服务器
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# pwd
/home/dokcerfile/my-tomcar9
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# ll
total 151592
-rw-r--r-- 1 root root 11483588 Feb 22 18:49 apache-tomcat-9.0.43.tar.gz
-rw-r--r-- 1 root root 796 Feb 22 22:13 Dockerfile
-rw-r--r-- 1 root root 143722924 Feb 22 19:00 jdk-8u281-linux-x64.tar.gz
- 编写Dockerfile
FROM centos
MAINTAINER cml<[email protected]>
# 把java与tomcat添加到容器中
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.43.tar.gz /usr/local/
# 安装vim编辑器
RUN yum -y install vim
# 设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.43
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.43
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA/lib:$CATALINA_HOME/bin
# 容器运行时监听端口
EXPOSE 8080
# 启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.43/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.43/bin/logs/catalina.out
- build镜像
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# docker build -t my-tomcat9 .
- 启动镜像
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# docker run -d -p 3344:8080 --name my-tomcat9 -v /home/dokcerfile/my-tomcar9/test:/usr/local/apache-tomcat-9.0.43/webapps/test -v /home/dokcerfile/my-tomcar9/logs/:/usr/local/apache-tomcat-9.0.43/logs --privileged=true my-tomcat9
- 访问tomcat
6.5、发布镜像
6.5.1、dockerhub
- linux登录docker
[root@izbp1jbs6mikenptx3k00bz ~]# docker login -u 507545713
- 发布镜像
[root@izbp1jbs6mikenptx3k00bz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
507545713/tomcat 9.0 f2fc7d0b29b2 12 hours ago 640MB
[root@izbp1jbs6mikenptx3k00bz ~]# docker push 507545713/tomcat:9.0
6.5.1、阿里云镜像服务
- 阿里云容器镜像服务
- 创建命名空间
- 创建镜像仓库
- 操作步骤参考官方文档
7、Dokcer网络
7.1、Dokcer0
- 测试
# 启动tomcat01
docker run -d -P --name tomcat01 tomcat
# 查看容器内部网络地址,发现容器启动的时候会得到一个eth0@if99 ip地址,docker分配的
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
98: eth0@if99: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
# linux ping docker容器内部
[root@izbp1jbs6mikenptx3k00bz ~]# ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.057 ms
原理
- 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用 veth-pair技术
- 再次测试ip addr
- 启动tomcat02,发现又对了一对网卡
- tomcat02 ip addr
# 发现这个容器带来网卡都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连接协议,一端彼此相连
# veth-pair 充当一个桥梁,连接各种虚拟网络设备
- 测试tomcat01 和 tomcat02 能否ping通
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01 ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.070 ms
# 容器和容器之间是可以互相ping通的
- 结论:tomcat01和tomcat02,是公用的一个路由器docker0,所有容器不指定容器的情况下,都是docker路由的,docker会给我们的容器分配一个默认的可用ip
- 只要容器删了对应的一对网桥就没了
7.2、--link
- 启动tomcat01 tomcat02 用tomcat01 ping tomcat02,无法ping通
[root@izbp1jbs6mikenptx3k00bz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c74538b006c1 tomcat "catalina.sh run" 5 hours ago Up 3 minutes 0.0.0.0:49158->8080/tcp tomcat02
f65f8ec0d264 tomcat "catalina.sh run" 6 hours ago Up 3 minutes 0.0.0.0:49157->8080/tcp tomcat01
[root@izbp1jbs6mikenptx3k00bz ~]# dokcer exec -it tomcat01 ping tomcat02
-bash: dokcer: command not found
- 启动tomcat01 启动tomcat02 --link 连接tomcat01,用tomcat02 ping tomcat01 可以ping通
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -d -P --name tomcat01 tomcat
6f5539ba86e78377ec0406dd8e6b1bc915954a4a174572d35c19dc15fb569c83
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -d -P --name tomcat02 --link tomcat01 tomcat
deddaadf62030a875caf8d7596cebf9eee39c82ccaffbffe271681f5e540a7b4
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (172.18.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.18.0.2): icmp_seq=1 ttl=64 time=0.092 ms
64 bytes from tomcat01 (172.18.0.2): icmp_seq=2 ttl=64 time=0.076 ms
- 查看hosts配置,--link就是我们在tomcat02zhong 增加了一个tomcat01(172.18.0.2)的映射
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 tomcat01 6f5539ba86e7
172.18.0.3 deddaadf6203
7.3、自定义网络
- 查看所有的docker网络
[root@izbp1jbs6mikenptx3k00bz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c78db2fe3f94 bridge bridge local
769b9db06398 host host local
e40b892c0ac8 none null local
-
网络模式
- bridge 桥接(默认)
- none 不配置网络
- host 和宿主机共享网络
-
测试
# 我们直接启动的命令 --net bridge (docker0)是默认启动的
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0 特点,默认的,域名不能访问,--link可以打通连接
# 自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@izbp1jbs6mikenptx3k00bz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c78db2fe3f94 bridge bridge local
769b9db06398 host host local
ecfe36802163 mynet bridge local # 自定义网络
e40b892c0ac8 none null local
- 查看自己创建的网络
[root@izbp1jbs6mikenptx3k00bz ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ecfe36802163f114bba1897312101f130319ff2e9b960a958de90a1633f59d14",
"Created": "2021-02-27T15:27:26.539448898+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
- 启动tomcat01 和 tomcat02 使用自定义网络,使用tomcat01 ping tomcat02
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -d -P --name tomcat01-mynet --net mynet tomcat
10ee97ca1b8ad04f4628c25b9947a08af834d054a28f280dddfde22038849dce
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -d -P --name tomcat02-mynet --net mynet tomcat
ace61514f044477f3db7716d38fa1abc938a291a23bc7b52dae61b300c381ede
# 不使用 --link 也可以ping名字了
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01-mynet ping tomcat02-mynet
PING tomcat02-mynet (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02-mynet.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.153 ms
64 bytes from tomcat02-mynet.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.074 ms
- 不同的集群使用不同的网络保证集群的安全和健康
7.3、网络连通
- 容器连接到网络(connect)
- 启动tomcat01 使用docker0网络
docker run -d -P --name tomcat01 tomcat
[root@izbp1jbs6mikenptx3k00bz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aef405af1a8 tomcat "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:49159->8080/tcp tomcat01
ace61514f044 tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:49158->8080/tcp tomcat02-mynet
10ee97ca1b8a tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:49157->8080/tcp tomcat01-mynet
- 测试打通tomcat01 --> mynet网络
# tomcat01容器连接到mynet网络
docker network connect mynet tomcat01
# 查看mynet网络
docker network inspect mynet
# tomcat01 放到了 mynet网络下 ,一个容器两个ip
"Containers": {
"10ee97ca1b8ad04f4628c25b9947a08af834d054a28f280dddfde22038849dce": {
"Name": "tomcat01-mynet",
"EndpointID": "492e4d8f1e907801e665c503e45a5ee40f66114670dae15c9dfb8d0c6c2de526",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"4aef405af1a80ea21c927e5c03eca970215372904e724a9060ee25006d553281": {
"Name": "tomcat01",
"EndpointID": "047ffeed0bbcf2129332b37a4de85eec90bf6fb20bde0d7254ace48d7914cb61",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"ace61514f044477f3db7716d38fa1abc938a291a23bc7b52dae61b300c381ede": {
"Name": "tomcat02-mynet",
"EndpointID": "7a10a022d61daae53088b840f85bb9e504b14afb9a56948e16380cc00f0f632e",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
}
- tomcat01 ping tomcat01-mynet
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01 ping tomcat01-mynet
PING tomcat01-mynet (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01-mynet.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from tomcat01-mynet.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms
标签:容器,--,tomcat01,镜像,docker,root
From: https://www.cnblogs.com/blackyoumo/p/16864460.html