打开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. 10分钟快速搭建可用的springboot-web项目

    搭建步骤 工具准备 1. IntelliJ IDEA(开发工具,简称idea) 2. JDK1.8+ 3. MAVEN 4. mysql(数据库) 5. redis(session储存) 创建步骤 S ...

  2. JavaScript-状态模式

    状态模式 一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if...else 来控制 示例:交通信号灯的不同颜色变化 传统的 UML 类图 javascript 中的 UML 类图 cl ...

  3. 记一次Postgres CPU爆满故障

    问题描述 公司项目测试环境调用某些接口的时候,服务器立即崩溃,并一定时间内无法提供服务. 问题排查 服务器配置不够 第一反应是服务器需要升配啦,花钱解决一切!毕竟测试服务器配置确实不高,2CPU + ...

  4. 修改PR Cs6,PS Cs6,AU Cs6的启动界面

    转载来源:https://jingyan.baidu.com/article/09ea3ede00aeedc0aede39ca.html 百度了很多,只见PS Cs6的启动界面修改教程,PR,AU C ...

  5. 给test函数加个装饰器!

    import timedef timer(func): def deco(*args,**kwargs): start_time=time.time() func(*args,**kwargs) st ...

  6. Linux的crontab 命令

    crontab 命令 简介 从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行,即:crontab 是 Linux 系统中添加计划任务,定时执行一些必要的脚本所必不可少的工具 ...

  7. 在NBA我需要翻译 适配器模式

    17.1 在NBA我需要翻译! 17.2 适配器模式 Adapter,将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作, 有些国家 ...

  8. 初识OpenSSH--1

    note:保护你的报文(communique)安全 !  最安全!!! 简介:OpenSSH使用SSH协议进行远程登录的主要连接工具.它对传输数据进行加密,以消除窃听,连接劫持和其他攻击.此外,Ope ...

  9. 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积

    #include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...

  10. PP: Time series anomaly detection with variational autoencoders

    Problem: unsupervised anomaly detection Model: VAE-reEncoder VAE with two encoders and one decoder. ...