首页 > 技术文章 > docker的容器管理和网络模式

zhijiyiyu 2021-10-10 17:11 原文

docker 容器操作和网络模式

一: Docker 容器操作

1.1 容器创建

容器创建:就是将镜像加载到容器的过程。

新创建的容器处于停止状态,不会运行任何程序,需要在其中发起一个进程来启动容器.

格式:

docker   create  [选项]  镜像


常用选项:

-i:  让容器的输入保持打开

-t:   让Docker 分配一个伪终端


#创建容器。
[root@host103 ~]# docker create  -it nginx:latest  nginx
9fc8616471fd701f085d59f95160e2a93f71147a5eaa53ac0a62f53a3ebbd04f



1.2 查看容器运行状态

格式: docker   ps    [选项]

直接使用 docker ps ,只查看当前正在运行的容器

选项:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • --format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • --no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。
#查看当前运行的容器
root@host103 ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


#查看当前所有容器
[root@host103 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS    PORTS     NAMES
9fc8616471fd   nginx:latest   "/docker-entrypoint.…"   9 minutes ago   Created             frosty_shockley

#查看当前所有容器的ID号
[root@host103 ~]# docker ps -aq
9fc8616471fd

#查看当前所有容器的大小
[root@host103 ~]# docker ps -as
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS    PORTS     NAMES             SIZE
9fc8616471fd   nginx:latest   "/docker-entrypoint.…"   9 minutes ago   Created             frosty_shockley   0B (virtual 133MB)


#查看最后创建的2 个镜像
[root@host103 ~]# docker ps -n 2
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS    PORTS     NAMES
900f0d65f120   nginx:latest   "/docker-entrypoint.¡­"   53 seconds ago   Created             optimistic_driscoll
ca4d8118fd97   nginx:latest   "/docker-entrypoint.¡­"   56 seconds ago   Created             stoic_snyde

CONTAINER ID :容器的ID号

IMAGE: 加载的镜像

COMMAND: 运行的程序

CREATED: 创建时间

STATUS: 当前的状态

PORTS : 端口映射

NAMES: 名称,如果不自定义会随机生成

image-20211007172210514

image-20211007171656440

image-20211007172614456



1.3 启动容器

格式: docker   start   容器ID/名称

[root@host103 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND   CREATED          STATUS    PORTS     NAMES
93efaac05479   centos:7   "bash"    19 seconds ago   Created             xenodochial_buck


#使用容器id 启动容器。
[root@host103 ~]# docker start 93ef
93ef

#再次查看状态,status 状态项为 up 
[root@host103 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND   CREATED          STATUS         PORTS     NAMES
93efaac05479   centos:7   "bash"    42 seconds ago   Up 4 seconds             xenodochial_buck

image-20211007180004658



1.4 创建并启动容器

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

  1. 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  2. 利用镜像创建并启动一个容器;
  3. 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  4. 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  5. 分配一个地址池中的 IP 地址给容器;
  6. 执行用户指定的应用程序,执行完毕后容器被终止运行。

Docker的机制是让容器后台运行,必须至少有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),会自动退出

#立即停止所有容器
[root@host103 ~]# docker kill $(docker ps -aq)
aefa6d6e9db5
#删除所有容器
[root@host103 ~]# docker rm  $(docker ps -aq)
aefa6d6e9db5
#强制删除所有镜像
[root@host103 ~]# docker rmi -f $(docker images -q)


#使用centos:7 镜像创建容器,如果没有该镜像则自动从公有仓库拉取
#容器创建后执行 ls  / 命令
[root@host103 ~]# docker run centos:7 bash  -c  "ls /"

image-20211007190228271


在后台持续运行docker run 创建的容器

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束.

使用 itd 选项,可以创建并持续运行容器。即使进入容器后使用exit命令退出,也不会停止容器

#后台运行容器并执行死循环命令
[root@host103 ~]# docker run  -d centos:7 /usr/bin/bash -c "while true;do sleep 1; done"


#创建容器并持续运行容器.使用--name 指定名称
[root@host103 ~]# docker run -itd --name system1 centos:7 /bin/bash

image-20211007191349552



1.5 终止容器运行

格式: docker   stop/kill   容器ID/名称

stop: 停止容器,可以给容器一个等待时间,以防止数据的丢失。

kill: 立即强行停止一个容器(相当于linux命令 kill -9) ,不会给容器反应时间,可能会造成数据丢失

[root@host103 ~]# docker stop b401
[root@host103 ~]# docker kill system1

image-20211007193056276



1.6 容器的进入

使用docker 原生方法进入容器,可以使用 docker attach 和 docker exec 命令进入。或者也可以使用docker run -it 在创建容器时就进入容器。

使用 exit 容器停止退出

使用 ctrl +p ctrl +q 容器不停止退出

1.6.1 使用 docker attch 的方法

docker attch 可以进入一个已经运行容器。然后输入命令执行动作.

格式:

docker  attch  容器ID或名称

输入exit 进行退出。这个会退出docker attch 进程,通常容器也会退出,处于终止状态

输入 ctrl +p 和 ctrl +q 或者 按住ctrl 键 然后依次输入 p 键 q 键 可以退出 attach 进程而不停止容器

#使用docker attch 容器ID/名称  进入运行的容器
[root@host103 ~]# docker attach  system1
#输入exit 退出后,容器也终止了
[root@5a51e6a3c5bf /]# exit 
exit
[root@host103 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS                           PORTS     NAMES
5f3b3050c107   centos:7   "bash"                   13 minutes ago      Exited (0) 13 minutes ago                  system2
5a51e6a3c5bf   centos:7   "/bin/bash"              About an hour ago   Exited (0) 2 seconds ago                   system1

#启动容器
[root@host103 ~]# docker start  system1
system1
#attach 进入容器
[root@host103 ~]# docker attach  system1 

#使用Ctrl p 和 Ctrl q 键退出,不终止容器
[root@5a51e6a3c5bf /]# read escape sequence
[root@host103 ~]# 
[root@host103 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS                           PORTS     NAMES
5f3b3050c107   centos:7   "bash"                   16 minutes ago      Exited (0) 16 minutes ago                  system2
5a51e6a3c5bf   centos:7   "/bin/bash"              About an hour ago   Up 2 minutes                               system1

image-20211007204509481


1.6.2 使用docker  exec 命令进入容器

docker  exec   [选项]   容器id/名称  bash或/bin/bash等  [ -c ]   "命令序列"


关于 docker  exec 选项

  • 可以看出只用-i 时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令

返回值都可以正确获取。

  • 使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致

整个容器退出。

  • 如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin

的输出,无法看到命令执行情况

  • 在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回

程序在后台运行。如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成

才返回。


关于docker  exec 后面的命令

  • 我们通常会使用 docker    exec   -it   bash 进入容器并开启一个bash环境的伪终端。也可以将bash 换成其他一条命令,让容器执行完后,将结果输出到屏幕
  • 后面可以跟上   -c 选项  “命令序列",命令序列可以是多个命令,使用分号隔开,可以一次性执行多条命令

#单独使用 -i 选项,则没有命令行提示符等,但是可以正常的执行命令,且有返回结果
[root@host103 ~]# docker exec -i system1 bash
... 
#使用exit 退出
exit 


#如果只使用 -t, 则只分配了伪终端。无法执行命令。只能使用 ctrl +c 终止
root@host103 ~]# docker exec -t system1 bash
[root@5a51e6a3c5bf /]# ls
^C


#使用 -it 选项,则类型与正常的终端,可以正常执行命令
root@host103 ~]# docker exec -it system1 bash
[root@5a51e6a3c5bf /]# ls
.......
[root@5a51e6a3c5bf /]# touch a.txt
[root@5a51e6a3c5bf /]# ls
a.txt  .....
[root@5a51e6a3c5bf /]# exit
exit



#如果只使用 -it 选项直接执行命令,当某个命令执行时间长,则终端会一直等待命令执行完毕
[root@host103 ~]# docker exec -it system1 sleep 10 

#加上 -d 选项,则会将命令在后台执行。使用 -c 选项,后面可以执行一些列命令
[root@host103 ~]# docker exec -itd  system1  bash -c "sleep 10;touch text.txt;touch zww.txt"
[root@host103 ~]# 
[root@host103 ~]# docker exec -it  system1  ls
 zww.txt  text.txt  var

image-20211008141230920

image-20211008141813699

image-20211008142101756

image-20211008142518567

image-20211008143333324



1.7 容器和宿主机之间的文件复制

1.7.1 从宿主机复制到容器中

docker   cp   宿主机文件路径   容器ID或名称:路径

#查看当前启动的容器
[root@host103 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED        STATUS        PORTS     NAMES
5a51e6a3c5bf   centos:7   "/bin/bash"   20 hours ago   Up 18 hours             system1
[root@host103 ~]# touch  aaa.txt

#将宿主机的 aaa.txt 文件复制到容器5a51的 /opt目录下
[root@host103 ~]# docker cp aaa.txt 5a51:/opt/

[root@host103 ~]# docker exec -it  5a51 ls /opt/aaa.txt
/opt/aaa.txt

image-20211008145933101


1.7.2 从容器复制到宿主机

docker  cp   容器ID或名称:文件路径   宿主机路径

#在容器的/opt目录下创建 bbb.txt 
[root@host103 ~]# docker exec -it 5a51 bash -c "touch /opt/bbb.txt;ls /opt/"
aaa.txt  bbb.txt

#将容器的/opt/bbb.txt 文件复制到宿主机的 /opt目录下
[root@host103 ~]# docker cp  5a51:/opt/bbb.txt /opt/
[root@host103 ~]# ls /opt/bbb.txt
/opt/bbb.txt

image-20211008150001891



1.8 容器的导入和导出

用户可以将任何一个Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用 docker  export

命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移.


1.8.1 导出容器 

格式:

docker   export   容器ID/名称   >   文件名

[root@host103 ~]# docker  export  5a51 > /opt/centos.tar
[root@host103 ~]# ls /opt/centos.tar 
/opt/centos.tar

image-20211008165508833


1.8.2 导入容器

格式:

cat   文件名   |   docker   import  -   镜像名称:标签

导入后会生成镜像,但是不会创建容器

[root@host103 ~]# cat /opt/centos.tar  | docker import  - centos7:test

[root@host103 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos7      test      40938b787741   9 seconds ago   204MB

image-20211008170114521



1.9 删除容器

格式:

docker   rm   [-f]   容器ID/名称  


docker rm  容器ID/名称   ------ 删除容器(必须是处于终止状态的容器)

docker  rm  -f  容器ID/名称   -----强行删除容器(可以删除正在运行的容器)

docker  rm  [-f]  $(docker  ps  -aq)   -------批量清理停止的容器( 加 -f 选项则删除所有

docker stop   $(docker ps -aq)   -------批量停止容器


批量停止容器

docker  ps -a  |  awk 'NR >=2{print "docker stoop  "$1 }' | bash

docker ps -a | awk 'NR >= {print $1}' | xargs docker stop


批量删除所有容器

docker ps -a | awk 'NR>=2{print "docker rm  " $1}' | bash

docker ps -a | awk 'NR >= {print $1}' | xargs docker rm


批量删除镜像

docker images | awk 'NR>=2{print "docker rmi  " $3}' | bash


删除none镜像

docker images | grep none | awk '{print $3}' | xargs docker rmi


#删除终止的容器,553d
[root@host103 ~]# docker rm 553d

#删除所有已经终止的容器
[root@host103 ~]# docker rm $(docker ps -aq)

#强行删除所有容器(包括启动的)
[root@host103 ~]# docker rm  -f $(docker ps -aq)

#删除所有的镜像
[root@host103 ~]# docker images | awk 'NR>=2{print "docker rmi  " $3}' | bash 

image-20211008172540028

image-20211008172643045

image-20211008172740061

image-20211008172804053



在创建容器时报错与解决

报错:

在使用docker create -it nginx:latest /bin/bash 命令,创建容器时,发现提示信息

“WARNING: IPv4 forwarding is disabled. Networking will not work.”

image-20211007165625036


解决:

打开ip转发功能,然后重启网卡和docker ,然后在重新创建容器 即可.

#打开ip转发功能
[root@host103 ~]# echo "net.ipv4.ip_forward=1" >>  /etc/sysctl.conf 
[root@host103 ~]# sysctl  -p
net.ipv4.ip_forward = 1

#重启网卡和docker 服务
[root@host103 ~]# systemctl  restart network
[root@host103 ~]# systemctl  restart docker 

#删除之前创建的容器,然后再重新创建
[root@host103 ~]# docker rm b040
[root@host103 ~]# docker create  -it nginx:latest  /bin/bash

image-20211007165953492





二: docker 网络

2.1 docker网络实现原理

docker 使用linuxc 桥接,在宿主机虚拟一个docker 容器网桥(docker0) ,docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP 直接通信.


docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射)即docker run 创建容器时候,通过 -p 或者 -P 参数来启用。访问容器的时候,就通过 [宿主机IP]:[容器端口]访问容器


2.1.1 为容器创建端口映射

方法一:随机映射端口(从32768开始)

docker   run   -d   --name   为容器指定名称   -P    镜像


方法二: 指定映射端口

docker   run   -d   --name   为容器指定名称   -p   宿主机端口:容器内端口   镜像


[root@host103 ~]# docker pull nginx

#使用nginx镜像创建容器,名称为web1 ,随机映射端口
[root@host103 ~]# docker run -d --name web1 -P nginx
#使用nginx镜像创建容器,名称为web2,将容器内的80端口映射到宿主机的42399端口
[root@host103 ~]# docker run -d --name web2 -p 42399:80 nginx
[root@host103 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
94149199d007   nginx     "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds    0.0.0.0:42399->80/tcp, :::42399->80/tcp   web2
5a4c130c6952   nginx     "/docker-entrypoint.…"   38 seconds ago   Up 37 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   web1


[root@host103 ~]# firefox  http://192.168.23.103:42399
[root@host103 ~]# firefox  http://192.168.23.103:49153

image-20211010100607469

image-20211010100759672

image-20211010100834411



2.2 Docker 的网络模式

  • Host:容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口
  • Container: 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围
  • None: 该模式关闭了容器的网络功能。
  • Bridge:默认为该模式,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0 的虚拟网桥,通过docker 0 网桥以及iptables nat 表配置与宿主机通信。
  • 自定义网络

2.2.1 查看docker 的网络列表

在安装Docker 时,它会自动创建三个网络,bridge(创建容器默认连接到此网络),none,host

方法一

docker   network   ls


方法二:

docker   network   list

[root@host103 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
17b848a78bfb   bridge    bridge    local
1e4c6afbe445   host      host      local
84db6f9ab742   none      null      local


[root@host103 ~]# docker network  list
NETWORK ID     NAME      DRIVER    SCOPE
17b848a78bfb   bridge    bridge    local
1e4c6afbe445   host      host      local
84db6f9ab742   none      null      local

image-20211010101751372

image-20211010102826553


2.2.2 指定容器网络模式

使用docker run 创建Docker 容器时,可以使用 --net或者--network 选项指定容器的网络模式

  • host 模式 : 使用 --net=host 指定
  • none模式:使用 --net=none指定
  • container模式: 使用--net=contatiner:NAME_or_ID 指定
  • bridge模式: 使用 --net=bridge指定,默认设置,可以省略

2.3 docker  网络模式详解

2.3.1 host模式

  • host 模式 : 使用 --net=host 指定

  • 相当于VMware 中的桥接模式,与宿主机在同一个网络中,但是没有独立IP地址

  • Docker 使用了Linux 的Namespace 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace 隔离网络等。一个Network Namespace 提供了一份独立的网络环境,包括网卡,路由,iptable 规则等都与其他Network Namespace 隔离。一个Docker 容器一般会分配一个独立的Network Namespace

  • 但是如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口.此时容器不再拥有隔离的、独立的网络栈。不拥有所有端口资源

image-20211010104441169


#创建容器web 3,指定网络模式为 host
#因为是host模式,所有宿主机和容器共享ip和端口
[root@host103 ~]# docker run -d --name web3 --net=host nginx

#访问宿主机的ip和80端口,则可以访问到web3的nginx服务
[root@host103 ~]# firefox  http://192.168.23.103:80

image-20211010105106603


2.3.2 container模式

  • container模式: 使用--net=contatiner:NAME_or_ID 指定

  • 这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。可以在一定程度上节省网络资源,容器内部依然不会拥有所有端口。

  • 同样,两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的。

  • 两个容器的进程可以通过lo网卡设备通信.

image-20211010143047756


#基于镜像centos:7 创建爱一个 名为test1的容器
[root@host103 ~]# docker run -itd --name test1 centos:7 /bin/bash
#查看容器的pid号
[root@host103 ~]# docker inspect -f '{{.State.Pid}}' test1
19294
#查看该容器的命名空间编号
[root@host103 ~]# ls -l /proc/19294/ns
lrwxrwxrwx 1 root root 0 10ÔÂ 10 14:43 ipc -> ipc:[4026532797]
lrwxrwxrwx 1 root root 0 10ÔÂ 10 14:43 mnt -> mnt:[4026532795]
lrwxrwxrwx 1 root root 0 10ÔÂ 10 14:42 net -> net:[4026532800]
lrwxrwxrwx 1 root root 0 10ÔÂ 10 14:43 pid -> pid:[4026532798]
lrwxrwxrwx 1 root root 0 10ÔÂ 10 14:43 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 10ÔÂ 10 14:43 uts -> uts:[4026532796]




#创建test2容器,使用container网络模式,和test1共享network Namespace
[root@host103 ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
#查看test2容器的pid
[root@host103 ~]# docker inspect -f '{{.State.Pid}}' test2
19463
#查看该容器的命名空间编号
[root@host103 ~]# ls -l /proc/19463/ns/
lrwxrwxrwx 1 root root 0 10月 10 14:44 ipc -> ipc:[4026532893]
lrwxrwxrwx 1 root root 0 10月 10 14:44 mnt -> mnt:[4026532891]
lrwxrwxrwx 1 root root 0 10月 10 14:44 net -> net:[4026532800]
lrwxrwxrwx 1 root root 0 10月 10 14:44 pid -> pid:[4026532894]
lrwxrwxrwx 1 root root 0 10月 10 14:44 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 10月 10 14:44 uts -> uts:[4026532892]

image-20211010145109858


2.3.3 none 模式

  • none模式:使用 --net=none指定

  • 使用none 模式,docker 容器有自己的network Namespace ,但是并不为Docker 容器进行任何网络配置。也就是说,这个Docker 容器没有网卡,ip, 路由等信息。

  • 这种网络模式下,容器只有lo 回环网络,没有其他网卡。

  • 这种类型没有办法联网,封闭的网络能很好的保证容器的安全性

  • 该容器将完全独立于网络,用户可以根据需要为容器添加网卡。此模式拥有所有端口。(none网络模式配置网络)

image-20211010154637178


#基于busybox镜像创建网络模式为 none 的容器
[root@host103 ~]# docker run -it --name test3 --net=none busybox
#在容器内使用ip a 查看网卡,发现只有 lo回环网卡,其他网卡需要自己配置
/ # ip a
1: lo:........
/ # exit

#查看容器test3 的网络模式
[root@host103 ~]# docker inspect test3  | grep -i 'networkmode'
            "NetworkMode": "none",

image-20211010162121496


2.3.4 bridge 模式

bridge模式是docker的默认网络模式,不写 -- net参数,就是bridge模式

相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。

  1. 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  2. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
  3. Docker将veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中, 以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过 brctl show 命令查看。
  4. 使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。

image-20211010163738852


[root@host103 ~]# docker run -itd --name  test4 centos:7 /bin/bash
[root@host103 ~]# docker inspect  test4 | grep -i 'networkmode'
            "NetworkMode": "default",

image-20211010164021178


 2.3.5 自定义网络模式

直接使用bridge 模式,还是无法指定IP运行docker 的,可以先自定义网络,在指定IP运行docker

如:

docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

------ docker 1 为 执行ifconfig -a 命令时显示的网卡名,如果不适用 --opt 参数指定此名称,使用 ifconfig -a 查看网卡的网络信息时,看到的将会是类似 br-110....... 这样的名字

----- mynetwork 为执行 docker network list 命令时 显示的 bridge 网络模式名称

#直接执行此命令,则报错
[root@host103 ~]# docker run -itd --name test6   --network bridge --ip 172.17.0.10 centos:7  /bin/bash

#先自定义网络,设置网卡地址池,网卡名,网络模式名
[root@host103 ~]# docker network  create  --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

#再使用网络创建自定义网络的容器
[root@host103 ~]# docker run -itd  --name test7  --net mynetwork --ip 172.18.0.10  centos:7 /bin/bash

image-20211010170116098

image-20211010170206729

推荐阅读