认识Docker

Docker 安装

Docker 组成

image-20241126202557785

镜像 (images):

类似于 C++的类,有了类,基于这个 就能 new 出新的不同的对象(或者说这是一个模板,可以通过此创建不同的对象)

容器(containers):

Docker 的容器技术就体现在这,各个容器之间分离,使用不同的内核与内容

每个容器都是一个微型的 Linux 系统

仓库(repository):

存放镜像的地方,分为公有和私有

国外 DockerHub,国内配置镜像访问

Docker 安装

文档

卸载方法

 # 1.卸载依赖
 sudo yum remove docker-cli docker-ce-cli container.io
 
 # 2.删除资源
 rm -rf /var/lib/docker
 # /var/lib/docker docker默认工作路径

底层原理

Docker 是如何工作的?

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

Docker-Server 接收到 Docker-Client 的指令就会执行这个指令

image-20241127100737521

Docker 的常用命令

帮助命令

 docker version
 docker info #  更详细的版本信息

帮助文档:https://docs.docker.com/reference/

镜像命令

 # 搜索镜像
 $ docker search [images]
 # 拉取镜像
 $ docker pull [images]:tag
 # 不写tag默认最新
 # 分层下载是docker images的核心
 
 # 删除镜像
 $ docker rmi -f [id]
 $ docker rmi [images]:tag  #若只有一个,则不用指定tag
 $ docker rmi -f $(docker images -aq) #删除全部容器

容器命令

前提:有了镜像才能创建容器

新建容器并且启动

 $ docker run [可选参数] image
 
 #参数说明
 --name="Name"       # 容器名字 用于区分容器
 -d                  # 后台运行
 -it                 # 交互方式运行,进入容器查看内容
 -p                  # 指定容器端口 -p 8080:8080
     -p ip:主机端口:容器端口
     -p 主机端口:容器端口(常用)
     -p 容器端口
     容器端口
 -P                  # 随机指定端口
 # 测试,交互启动
 [root@centos79 etc]# docker run -it centos /bin/bash 
 [root@db728d3bbc68 /]# ls
 bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
 dev  home  lib64  media       opt  root  sbin  sys  usr
 [root@db728d3bbc68 ~]# exit
 exit
 [root@centos79 etc]# 

列出所有运行的容器

 # docker ps 命令
 -a      #列出所有
 -n=?    #显示最近创建的容器
 -q      #
 

推出容器

 exit    #直接容器停止退出
 ctrl+P+Q  #容器不停止退出

删除容器

 docker rm 容器id                  #删除指定容器
 docker rm -f $(docker ps -aq)    # 删除所有容器
 docker ps -a -q|xargs docker rm  # 删除所有容器,xargs搭配管道使用,将|前作为参数给|后

启动和停止容器

 docker start 容器id   #启动
 docker stop 容器id    #停止
 docker restart 容器id #重启
 docker kill 容器id    #强制停止

其他常用命令

后台启动容器

 $ docker run -d 镜像名
 
 # 常见问题,docker容器使用后台运行,必须有一个前台进程,否则会直接结束

查看日志

 docker logs -tf --tail num 容器id
 

查看容器中的进程信息

 docker top 容器id

查看镜像的元数据

 docker inspect 容器id

进入当前运行的容器

 # 我们经常容器用后台运行,如果需要进入容器修改配置,则
 
 # 命令1 docker exec
 docker exec -it 容器id /bin/bash
 
 # 测试
 [root@centos79 etc]# docker ps
 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
 d61aebdf9a85   centos    "/bin/sh -c 'while t…"   10 minutes ago   Up 10 minutes             quirky_greider
 [root@centos79 etc]# docker ps
 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
 d61aebdf9a85   centos    "/bin/sh -c 'while t…"   12 minutes ago   Up 12 minutes             quirky_greider
 [root@centos79 etc]# docker exec -it d61aebdf9a85 /bin/bash
 [root@d61aebdf9a85 /]# ls
 bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
 dev  home  lib64  media       opt  root  sbin  sys  usr
 [root@d61aebdf9a85 /]# ps -ef
 UID        PID  PPID  C STIME TTY          TIME CMD
 root         1     0  0 08:12 ?        00:00:00 /bin/sh -c while true; do echo hello; sleep 1; done
 root       762     0  0 08:24 pts/0    00:00:00 /bin/bash
 root       798     1  0 08:25 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang = sleep /usr/bin/s
 root       799   762  0 08:25 pts/0    00:00:00 ps -ef
 
 
 # 命令 2  
 docker attach  -it 容器 id /bin/bash
 #测试
 $ docker attach 容器 id
 正在执行的代码。。。
 
 # docker exec    # 进入容器后开启一个新的终端,可以在里面操作(常用)
 # docker attach  # 进入容器正在运行的终端,不会启动新的进程 

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

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

小结

Docker Commands Diagram

 attach    Attach to a running container                     # 附加到一个正在运行的容器
 build     Build an image from a Dockerfile                  # 从 Dockerfile 构建一个镜像
 commit    Create a new image from a container's changes     # 从容器的更改创建一个新的镜像
 cp        Copy files/folders from the containers filesystem to the host path    # 从容器文件系统复制文件/文件夹到主机路径
 diff      Inspect changes on a container's filesystem       # 检查容器文件系统的更改
 events    Get real time events from the server              # 从服务器获取实时事件
 export    Stream the contents of a container as a tar archive    # 将容器的内容作为 tar 归档流出
 history   Show the history of an image                      # 显示镜像的历史记录
 images    List images    # 列出镜像
 import    Create a new filesystem image from the contents of a tarball    # 从 tarball 的内容创建一个新的文件系统镜像
 info      Display system-wide information                   # 显示系统范围的信息
 inspect   Return low-level information on a container       # 返回容器的低级信息
 kill      Kill a running container                          # 杀死一个正在运行的容器
 load      Load an image from a tar archive                  # 从 tar 归档加载一个镜像
 login     Register or Login to the docker registry server   # 注册或登录到 docker 注册服务器
 logs      Fetch the logs of a container                     # 获取容器的日志
 port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查找 NAT 到 PRIVATE_PORT 的公用端口
 pause     Pause all processes within a container            # 暂停容器内的所有进程
 ps        List containers    # 列出容器
 pull      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                         # 删除一个或多个镜像
 run       Run a command in a new container                  # 在一个新的容器中运行一个命令
 save      Save an image to a tar archive                    # 将一个镜像保存为 tar 归档
 search    Search for an image in the docker index    # 在 docker 索引中搜索一个镜像
 start     Start a stopped container                         # 启动一个已停止的容器
 stop      Stop a running container                          # 停止一个正在运行的容器
 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    # 阻塞直到容器停止,然后打印其退出代码

测试

安装tomcat

 # 官方教程
 $ docker run -it --rm tomcat: 9.0
 
 # 一般来说,我们都用后台启动,希望这个进程留存,  用此方法一般用来测试,用完即删除 
 # 当然,此时镜像还在,只是容器删除
 $ docker run -it -d -p 3344:8080 --name " name " tomcat

注意

想要公网访问网站时候,需要同时开启防火墙规则+服务器安全组

必须两者都有才能访问,否则只能从本地访问

安装可视化Portainer

https://zhuanlan.zhihu.com/p/709299396

====

Docker镜像

镜像是什么?

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

所有的应用,直接打包docker镜像,就可以直接跑起来!

如何得到镜像

  • DockerHub

  • 自己制作DockerFile

  • 从其他地方拷贝

镜像原理

UnionFS(联合文件系统)

UnionFS:是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到用一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作不同具体的镜像

特点:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载原理

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

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

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

img

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

每个镜像都是通过 DockerFile 文本文件定义的,Dockerfile 中的每条指令最终都会成为镜像中的 Layer。Layer 是按顺序构成的,最底层的 Layer 是基础镜像(base image),最上层是最终镜像(final image)。当一个镜像被更新或重新构建时,只有更新的层需要修改,其他没有更新的层可以直接复用本地缓存。这就是 Docker 镜像如此快速和轻量级的部分原因,每一层的大小加起来等于最终镜像的大小。

分层理解

原理理解

Docker Commit

 docker commit 提交容器成为一个新的版本(相当于把自己修改过的部分也打包成为镜像)
 
 docker commit -m =" 提交的信息 " -a =" 作者 " 容器 id 目标镜像名:[TAG]

容器数据卷

什么是容器数据卷

首先,docker的理念是把应用和环境打包成为一个镜像

引出数据的问题?如果数据都在容器中,当容器删除时,数据也随之没了->数据的永久化存储

eg:MySQL,我们希望当容器删除后,数据还留在本地

此时就提出了一种数据共享技术

image-20241128144223699

总结:

容器的持久化和同步技术!容器间的数据也能共享

使用数据卷

方法一:使用-v来进行挂载

 docker run -it -v 主机目录:容器内目录
 
 [root@centos79 home]# docker run -it -v /home/volumetest:/home centos /bin/bash
 # 此时本地/home/volumetest和运行的匿名容器centos下的 /home实现同步功能

[!EXAMPLE]

实战 在mysql中实现

 # 获取镜像
 docker pull mysql
 # 运行容器
 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:var/lib/mysql -e MYSQL_ROOT_PASSWARD=123456 --name mysql01 mysql
 
 # 参数解释
 -d 后台运行
 -p 端口映射
 -v 卷挂载
 -e 环境配置
 --name 容器名字

具名和匿名挂载

 # 匿名卷挂载
 -v 容器内路径
 docker run -d -P --name nginx01 -v /home/nginx nginx
 
 [root@centos79 home]# docker volume ls
 DRIVER    VOLUME NAME
 local     a1b8b84fda279b29ba1bec02fa5079e345f7d0b44ae9d0bc5964e18bb8ebcae3
 
 
 # 具名挂载
 # -v 卷名:容器内路径
 docker run -d -P --name nginx02 -v juming-nginx:/home/nginx nginx
 [root@centos79 home]# docker volume ls
 DRIVER    VOLUME NAME
 local     a1b8b84fda279b29ba1bec02fa5079e345f7d0b44ae9d0bc5964e18bb8ebcae3
 local     juming-nginx
 [root@centos79 home]# docker volume inspect juming-nginx
 [
     {
         "CreatedAt": "2024-11-28T22:07:14+08:00",
         "Driver": "local",
         "Labels": null,
         "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
         "Name": "juming-nginx",
         "Options": null,
         "Scope": "local"
     }
 ]

所有docker容器的卷,没有指定目录的情况下都是在 "/var/lib/docker/volumes/xxxxx/_data"

 -v 容器内路径             #匿名挂载
 -v 卷名:容器内路径         #具名挂载
 -v /宿主机路径:容器内路径   #指定路径挂载

通过ro、rw还能指定卷的访问形式(只读和可读可写)

初始Dockerfile

Dockerfile就是构建镜像的文件,也就是一个命令脚本!

[!EXAMPLE]

 # 创建一个dockerfile文件
 
 FROM centos #指定镜像
 VOLUME ["volume1","volume2"]
 CMD echo "----end-----"
 CMD /bin/bash

image-20241128232545260

 #进入镜像发现(此时相当于创建了一个容器),挂载的数据卷已经出现
 
 [root@centos79 dockerfile-volume-test]# docker run -it 28850d771321 /bin/bash
 [root@c7b7a6199377 /]# ls
 bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var      volume2
 dev  home  lib64  media       opt  root  sbin  sys  usr  volume1
 
 # 退出后容器关闭,但是可以看到本地数据卷已经挂载
 # 并且此时是一个匿名挂载

image-20241128233710047

数据卷容器

用于几个容器之间的数据同步

image-20241129120653910

 # 测试
 docker run -it --name docker01 dai-centos:1.0
 docker run -it --name docker02 --volumes-from docker01 dai-centos:1.0
 docker run -it --name docker03 --volumes-from docker01 dai-centos:1.0
 
 

结论:

容器间的配置信息传递,数据容器卷的生命周期一直持续到没有容器为止

但是如果你持续化到本地,本地的数据是不会删除的

Dockfile

Dockerfile 介绍

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

构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(Docker Hub、阿里云镜像)

image-20241129150216609

windows 部署docker镜像 windows server docker 镜像_Docker

Dockerfile 指令

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

数据卷及Dockerfile - LONG的个人小站

实战测试

构建一个centos

 # 1、编写自己的DockerFile文件
 
 FROM centos:7
 
 MAINTAINER dai<2248604517@qq.com>
 
 ENV MYPATH /usr/local
 WORKDIR $MYPATH
 
 CMD /bin/bash
 
 RUN yum -y install net-tools
 RUN yum -y install vim
 
 EXPOSE 80
 
 CMD echo $MYPATH
 CMD echo "-------end-------"
 
 # 2、构建镜像
 docker build -f dockerfile路径 -t 镜像名:[tag] .

image-20241129162453768

发布自己的镜像

Dockerhub

image-20241129165125187

小结

img

Docker网络

Docker0

image-20241129190343015

[!QUESTION]

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

 # 首先创建一个容器
 docker run -it -P --name tomcat01 tomcat
 
 # 发现问题,创建的容器中无法查询ip addr
 # 解决如下
 apt update
 apt install -y iproute2
 apt install -y iputils-ping
 apt install net-tools
 
 # 1、创建容器查看网络
 # 继续查看容器内网络,发现启动后容器中有一个60: eth0@if61 ,这就是docker分配的地址
 root@02a768054956:/usr/local/tomcat# 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
     inet6 ::1/128 scope host 
        valid_lft forever preferred_lft forever
 60: eth0@if61: <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
 
 # 2、发现Linux系统能之间ping到容器内
 [root@centos79 ~]# 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.052 ms
 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.051 ms
 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.065 ms
 
 # 3、由于下载iproute2的过程有些麻烦,我们自己制作镜像在本地
 docker commit tomcat01的id -m="add the iproute2" -a="dai" mytomcat:1.0
 # 得到
 [root@centos79 ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 mytomcat     1.0       e8a2e8b061d0   5 minutes ago   705MB
 
 # 4、接着再次创建一个容器,并且直接注入ip addr
 docker run -it -P --name tomcat02 mytomcat:1.0
 docker exec -it tomcat02 ip addr
 
 [root@centos79 ~]# docker exec -it tomcat02 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
     inet6 ::1/128 scope host 
        valid_lft forever preferred_lft forever
 62: eth0@if63: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
     link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
     inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever

原理

1、我们没启动一个docker容器,docker都会自动创建并且分配 一个ip,我们只要安装了docker,就会有一个docker网卡docker0

这个docker0使用的是桥接模式,使用的技术是evth-pair

2、我们发现容器带来网卡,都是一对一对的,evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连接着协议,一段彼此连接。正因为这个特性,evth-pair充当一个桥梁,连接各种虚拟网路设备的

3、结论:容器和容器之间也是互通的,但不是两个之间直接互连,而是通过docker0进行路由

4、所有的容器在不指定网路的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认的可用IP

image-20241129195846215

小结

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0

Docker中的所有网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件快)

image-20241129200431531

--Link

思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可用处理这个问题,可用怎么来进行访问容器?

 [root@centos79 ~]# docker exec -it tomcat02 ping tomcat01
 ping: tomcat01: Name or service not known
 
 # 如何解决“?
 # 通过--link来解决网络连接的问题
 [root@centos79 ~]# docker run -d -P --name tomcat03 --link tomcat02 mytomcat:2.0
 9f7389b5a0d2aad7cf7a0bc02570afbe1cf23c64cd55a2f431c4139650e277b9
 [root@centos79 ~]# 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.096 ms
 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.071 ms
 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.055 ms
 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.055 ms
 
 # 此时tomcat03能成功ping通tomcat02,但是反过来不可以
 # 原理发现 通过--link 配置,实际配置的就是hosts文件,并且一次只能配置一个
 root@centos79 ~]# docker exec -it tomcat03 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.17.0.3  tomcat02 78e0d5358e18
 172.17.0.4  9f7389b5a0d2
 [root@centos79 ~]# 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.17.0.3  78e0d5358e18

本质探究,--link就是在所配置的容器中多一条 172.17.0.3 tomcat02 78e0d5358e18 但是明显这样不是特别方便,所以在之后的使用中,如果有需要,得自己配置网络,而不是使用docker0分配

自定义网络

image-20241129204720271

网络模式

  • bridge:桥接docker(默认,自己创建也使用bridge模式)

  • none:不配置网络

  • host:和宿主机共享网络

 # 1、我们直接启动的命令 --net bridge,而这个就是我们的docker0
 docker run -it -P --name tomcat01 tomcat
 docker run -it -P --name tomcat01 --net bridge tomcat
 
 # docker0 的特点:默认,域名不能访问,--link可以打通
 # 2、我们自己创建网络
 [root@centos79 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
 
 # 可以通过docker netword inspect [所配置的网络]来查看配置
 
 # 3、在自定义网络下创建新的容器,发现容器出现在该网段下
 [root@centos79 ~]# docker run -d -P --name network-tomcat01 --net mynet mytomcat:2.0
 0807603313d6014d10c1571ab1ee35cbcec7d63bbb6c631565a6f65ce0ccc8f6
 [root@centos79 ~]# docker run -d -P --name network-tomcat02 --net mynet mytomcat:2.0
 fccbf4e86bf2e3985627b6a00e00e2ddcbe9a43ec5fe81c578968b37a51c92f9
 [root@centos79 ~]# docker network inspect mynet
 [
     {
         "Name": "mynet",
         "Id": "fb84316efb96bfadbf230c8233e74ac26eaa2371fbc209c94676e1b8101e14d3",
         "Created": "2024-11-29T21:36:45.381499207+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": {
             "0807603313d6014d10c1571ab1ee35cbcec7d63bbb6c631565a6f65ce0ccc8f6": {
                 "Name": "network-tomcat01",
                 "EndpointID": "ea3d43c5d13a88f8e61cd576ecd4988aec7a638ae8d08f6c503f84e5bcab0261",
                 "MacAddress": "02:42:c0:a8:00:02",
                 "IPv4Address": "192.168.0.2/16",
                 "IPv6Address": ""
             },
             "fccbf4e86bf2e3985627b6a00e00e2ddcbe9a43ec5fe81c578968b37a51c92f9": {
                 "Name": "network-tomcat02",
                 "EndpointID": "3f361df5dd9099dc3440c53040bce3c49b16b7d4ed51164021201992c2ceb7c6",
                 "MacAddress": "02:42:c0:a8:00:03",
                 "IPv4Address": "192.168.0.3/16",
                 "IPv6Address": ""
             }
         },
         "Options": {},
         "Labels": {}
     }
 ]
 
 # 4、测试
 # 发现此时可以直接通过容器名称就直接可以ping通
 [root@centos79 ~]# docker exec -it network-tomcat01 ping network-tomcat02
 PING network-tomcat02 (192.168.0.3) 56(84) bytes of data.
 64 bytes from network-tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.060 ms
 64 bytes from network-tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.055 ms
 
 [root@centos79 ~]# docker exec -it network-tomcat02 ping network-tomcat01
 PING network-tomcat01 (192.168.0.2) 56(84) bytes of data.
 64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.042 ms
 64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.054 ms
 64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.058 ms
 

好处:不同的集群使用不同的网络,保证集群是安全和健康的

网络连通

 # 测试联通 tomcat-mynet
 
 # 发现连通之后 tomcat01 放到了mynet网络下
 
 # 此时一个容器有了两个ip地址
 # 就比如 阿里云服务器也有两个IP:一个公网IP、一个私网IP
 
 [root@centos79 ~]# docker network connect mynet tomcat01
 [root@centos79 ~]# docker exec -it tomcat01 ping network-tomcat01
 PING network-tomcat01 (192.168.0.2) 56(84) bytes of data.
 64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.080 ms
 64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.056 ms
 64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.055 ms

image-20241129225538796

阅读剩余
THE END