打开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. JS高阶编程技巧--compose函数

    先看代码: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 ...

  2. SpringCloud之Ribbon负载均衡的入门操作

    使用Ribbon进行负载均衡 在使用Ribbon之前,我们先想一个之前的问题,之前我们将服务提供者注册进了eureka注册中心,但是在消费者端,我们还是使用的restTemplate调用的时候,其中写 ...

  3. 使用 Apache James 3.3.0(开源免费) 搭建内网电子邮件服务器(基于 Windows + Amazon Corretto 8)

    电子邮件服务器,对于很多公司,都是需要的. 虽然现在很多人,使用 QQ .微信进行一对一的工作沟通,使用QQ 群.微信群进行多人沟通,但这些即时聊天工具,与电子邮件相比,仍有很多不足: a. 电子邮件 ...

  4. Git安装与配置,以及pycharm提交代码到github

    1.下载git,安装 下载好后直接下一步到底,安装成功(选择组件页面,可以勾选上控制台窗口字体选项,如下图) 2.配置Git信息 1.打开窗口中,输入:git --version 查看已安装的git版 ...

  5. Git操作:查看所有分支的提交修改

    我们在廖雪峰Git教程或者一些书籍学习git分支时,大都会学习到这样一个命令git log --graph或者就是单纯的git log,他可以用来查看当前分支.但是这个弊端就是:它只能查看与当前分支有 ...

  6. PL/SQL不安装Oracle连接,Oracle instantclient安装

    ================================ ©Copyright 蕃薯耀 2020-01-07 https://www.cnblogs.com/fanshuyao/ 第一步: 下 ...

  7. POSIX简介

    POSIX:Potable Operating System Interface of UNIX (可移植操作系统接口),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的 ...

  8. 安装Nexus到Linux(源码)

    运行环境 系统版本:CentOS Linux release 7.4.1708 (Core) 软件版本:Sonatype-Nexus-3.14.0 硬件要求:无 安装过程 1. 调整系统参数 需要调整 ...

  9. Linux中“没有可用的软件包XX,但是它被其他软件包引用”的解决方法

    踩坑经历 今天刚在虚拟机上安装好了ubuntu系统,在执行sudo apt install net-tools 命令时报错"没有可用的软件包net-tools,但是它被其他软件包引用&quo ...

  10. c#中for与foreach的使用

    for循环示例: static void Main(string[] args) { string[] s = new string[] { "a,b,c,d,e,f,g" }; ...