打开2个会话,分别运行以下命令

# docker run -it -P --name nginx2 nginx #-P 端口随机映射

再打开一个会话查看 运行中的容器

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e065a4861a7f nginx "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 0.0.0.0:32769->80/tcp nginx2
101c87844e00 nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:32768->80/tcp nginx

可以发现 使用了-P参数后 会从32768开始映射到容器的80端口,不会造成端口冲突,缺点是无法知道每次映射的端口是多少

# docker run -it -p 53:53/udp --name dhcp dhcp #可以指定映射协议/udp
# docker run -it -p 192.168.56.11:80:80 --name ngxin3 nginx #假如宿主机有多个ip,可以指定映射致哪个ip 这个例子是将容器的80端口映射到本机的192.168.56.11的80端口上

容器之间的互联

第一种方法 通过给容器命名别名的方式连接

打开第一个会话,运行以下
# docker run -it --name busybox1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
44: eth0@if45: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

再打开第二个对话,运行以下
# docker run -it --link busybox1:busyboxbieming --name busybox2 busybox # --link起别名
/ # 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.2 busyboxbieming 6e6aca74d76c busybox1
172.17.0.3 35087ae7a3d4
/ # ping busyboxbieming
PING busyboxbieming (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.065 ms

查看hosts文件可以发现多了一条别名的记录,ping别名发现可以解析到第一台的ip,因此可以通过这种别名的方式去连接

第二种方式

# docker network ls #查看网络模式
NETWORK ID NAME DRIVER SCOPE
2e7f4890adbc bridge bridge local
cb1cfe757fe7 host host local
35bc4c0ccb9b none null local

host模式会使容器的网卡信息和宿主机保持一致

先打开一个会话,执行以下命令

#docker run -it --net=host nginx

再打开一个会话,继续执行以下命令

#docker run -it --net=host nginx

此时会报错,提示80端口被占用
# docker run -it --net=host nginx
2020/02/21 16:34:54 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
2020/02/21 16:34:54 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)

再宿主机上执行netstat命令可以发现 80端口已经被第一台容器使用了
# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 959/master
tcp 0 0 192.168.56.11:2375 0.0.0.0:* LISTEN 878/dockerd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7306/nginx: master

这种模式的好处是,性能高,但是容易占用本机端口,一般对网络性能要求高时使用

下面创建一个属于自己的网络

# docker network create --driver bridge mydockernet
76d079e545f183fd799cebc203d4fb55f94110a0043da8377cbeb5009aa32af2

# docker network ls
NETWORK ID NAME DRIVER SCOPE
2e7f4890adbc bridge bridge local
cb1cfe757fe7 host host local
76d079e545f1 mydockernet bridge local
35bc4c0ccb9b none null local

使用刚刚创建的网络来建立容器

# docker run -it --network=mydockernet busybox #--network指定使用的网络
/ #
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
53: eth0@if54: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
可以发现ip变成了172.18.x.0了

实际情况中我们要指定创建的网段,下面继续创建一个指定的网段

#docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2  #--subnet指定子网 --gateway指定网关2b3c58c61fb1bfa6f6959b7eb6b3b2d5c1c73f47b1f5663fcc601c31a93a1bdd

# docker run -it --rm --network=my_net2 --ip 172.22.16.88 busybox    #可以指定ip
/ #
/ #
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:16:10:58 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.88/24 brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # exit

退出之前创建的2台,我们再新建2台容器,测试下互通

# docker run -it --name oldboy1 --rm --network=my_net2 --ip 172.22.16.88 busybox    #新建第一台

# docker run -it --name oldboy2 --rm --network=my_net2 --ip 172.22.16.99 busybox    #新建第二台
互ping发现可以ping通,这是因为使用了docker自定义网络中的dns,使得用户名的已解析,这个解析仅对用户自定义的网络有效,默认的网络是无效的

下面的这种默认方式创建的容器,通过容器名是ping不通的

# docker run -it --rm --name oldboy1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.065 ms
/ # ping oldboy2
ping: bad address 'oldboy2'

# docker run -it --rm --name oldboy2 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping oldboy1
ping: bad address 'oldboy1'

保留刚刚创建的oldboy1,删除oldboy2,然后再新建一个oldboy2

这个oldboy2使用自定网络

# docker run -it --name oldboy2 --rm --network=my_net2 --ip 172.22.16.99 busybox

此时oldboy2和oldboy1之间是通过容器名ping不通的

如果需要2台可以通,可以使用下面的命令

# docker network connect my_net2 oldboy1      #把oldboy1容器加入my_net2网络中

随后即可互相通过容器名ping通

观察oldboy1

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
17: eth1@if18: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.2/24 brd 172.22.16.255 scope global eth1
       valid_lft forever preferred_lft forever

发现多了一块网卡

这样就可以解决不在同一网络的容器互通的问题

记录 Docker 的学习过程 (网络篇)的更多相关文章

  1. 记录 Docker 的学习过程 (网络篇之跨主机互通)

    下面从node3上操作node3# docker run -d -p 8500:8500 --name consul progrium/consul -server -bootstrap node3# ...

  2. 记录 Docker 的学习过程 (日志篇)

    日志收集 elk 在node3上操作 docker pull sebp/elk:5610 node3# sysctl vm.max_map_count=262144 node3# docker run ...

  3. 记录 Docker 的学习过程 (安装基础篇)

    docker 通过内核来实现 特点是效率高 1. centos7 三台(推荐2c 4g 最低 1c1g)2. 关闭防火墙 selinux3. 做好主机名解析,三台能互相ping通主机名host参考文件 ...

  4. 记录 Docker 的学习过程 (数据挂载)

    docker 存储篇 容器中的存储是分层的, 在容器中,如果我们要创建一个文件,会在文件的最上层(可写层)创建 容器中内置的文件,默认来讲是只读的,只有自己创建的文件才是可写状态 比如说 /etc/p ...

  5. 记录 Docker 的学习过程 (自建私有仓库)

    私有仓库的创建 node1#wget http://harbor.orientsoft.cn/harbor-v1.4.0/harbor-offline-installer-v1.4.0.tgz nod ...

  6. 记录 Docker 的学习过程 (dockerfile自动制作镜像)

    自动制作镜像 通过编写dockerfile来自动创建镜像 #vi Dockerfile #编辑dockerfile文件,一定要以这个名字命名 #cat Dockerfile #导入哪个基础镜像FROM ...

  7. 记录 Docker 的学习过程 (单机编排)

    容器的编排 什么是容器的编排?就是让容器有序的启动并在启动的过程加以控制 docker-compose -f bainpaiwenjian.yul up 如果编排文件为默认名称docker-compo ...

  8. Docker容器网络篇

    Docker容器网络篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker的网络模型概述 如上图所示,Docker有四种网络模型: 封闭式网络(Closed conta ...

  9. Docker容器基础入门认知-网络篇

    这篇文章中,会从 docker 中的单机中的 netns 到 veth,再到单机多个容器之间的 bridge 网络交互,最后到跨主机容器之间的 nat 和 vxlan 通信过程,让大家对 docker ...

随机推荐

  1. pikachu-文件包含漏洞(Files Inclusion)

    一.文件包含漏洞概述     在web后台开发中,程序员往往为了提高效率以及让代码看起来简洁,会使用"包含"函数功能.例如把一些功能函数都写进fuction.php中,之后当某个文 ...

  2. 【C#】写文件时如何去掉编码前缀

    我们都知道,文件有不同的编码,例如我们常用的中文编码有:UTF8.GK2312 等. Windows 操作系统中,新建的文件会在起始部分加入几个字符的前缀,来识别编码. 例如,新建文本文件,写入单词 ...

  3. vue目录结构熟悉

    给项目的入口文件做点小改变: [补充:编辑器建议使用vscode,我还没装,暂时先用phpstorm] 打开 APP.vue 文件,代码如下(解释在注释中) <!-- 展示模板 --> & ...

  4. cesium1.63.1api版本贴地贴模型量算工具效果(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材.不少 ...

  5. STM32固件库和自定义工程模板

    固件库结构 本文使用的固件库是STM32F10x_StdPeriph_Lib_V3.5.0,可以在官网获取.该固件库包含四个文件夹和一个库的说明文档,如下图所示,stm32f10x_stdperiph ...

  6. 1级搭建类104-Oracle 12cR2 单实例 FS(阿里云)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  7. vue(二)--条件语句

    条件语句:v-if     v-else   v-else-if    v-show v-else .v-else-if 必须跟在 v-if 或者 v-else-if之后. 1.v-if <bo ...

  8. 文件下载(download) 前后台备注自用

    1.后台 1.1 ResponseBean 返回封装的格式 @Data @Accessors(chain = true) public class ResponseBean { private Str ...

  9. React网络请求跨域代理设置

    之前的之所以可以请求其他域名下的网络数据,是因为我们在服务端设置了相关配置,如下所示 如果将其注释掉,再次测试,如下所示 此时便无法跨域操作,接下来介绍下React如何实现跨域代理 (1)分析 Rea ...

  10. SCPI指令闲扯

    准备用SCPI控制我的汉泰DSO3254示波器,实现如下的功能. 一通道采集数据,二通道作为触发,每触发一次,传输一和二通道采集到数据到电脑. 我以为可以如下设计:电脑发出指令,示波器电脑进入挂起状态 ...