在使用Docker容器时,我们需要访问容器的内部网络,或需要在容器间相互访问。Docker 容器默认不会开放任何端口,因此需要将容器与宿主机进行端口映射,使容器可外部访问。而容器间互相访问,除了可以基于端口映射进行访问外,还可以通过容器链接(Link)的方式,也可以通过Docker 网络(Networking)实现。

  1. 端口映射与外部访问容器

    • 1.1 -P绑定宿主机随机端口
    • 1.2 -p指定端口、IP地址绑定
    • 1.3 其它
  2. 容器链接(Link)
    • 2.1 容器的命名
    • 2.2 容器的互联
  3. Docker网络(Networking)
    • 3.1 创建网络
    • 3.2 创建容器并连接到网络
    • 3.3 将已有容器连接到Docker网络
    • 3.4 断开网络与网络删除

1. 端口映射与外部访问容器

Docker 容器运行后默认不会开启任何网络端口,这样就无法通过网络访问容器。要使容器可以通过外部网络访问Docker 容器的内部网络,就需要将容器端口与宿主机端口建立映射关系。

容器与宿主机间建立端口映射关系时,可以在运行容器时使用-P-p参数指定端口映射。两者区别如下:

  • -P参数会随机分配一个49000~49900之间的端口到容器内部开放的网络(通过EXPORT指定的)端口
  • -p则可以具体指定要映射的端口,并且在一个指定端口上只能绑定一个容器

1.1 -P绑定宿主机随机端口

-P参数会随机绑定一个49000~49900之间的端口所运行容器的导出端口。

如,运行一个容器,并使用-P绑定宿主机端口:

在这个示例中,我们通过itbilu/express-app镜像创建并运行了一个名为express-app的容器。运行容器时,我们通过-P参数进行了端口映射。这时,可以通过docker ps命令查看所分配的端口号:

如上所示,宿主机的32771端口被绑定到了容器的3000端口。

1.2 -p指定端口、IP地址绑定

如果不想使用随机端口,则可以使用-p参数来指定要绑定的端口号。-p参数除了可以指定端口号外,还可以指定宿主机的IP,这一点在使用过程中非常有用。

-p支持以下几种绑定格式:

绑定宿主机所有的IP

使用hostPort:containerPort格式进行宿主机及容器端口映射时,默认会将宿主机的所有IP绑定到容器。如:

在这个示例中,将宿主机的3000端口映射到了容器的3000端口。在这种情况下,会绑定本地所有接口上的所有IP地址。

映射到指定地址的指定端口

使用ip:hostPort:containerPort格式可以将宿主机指定的IP及端口,绑定到容器端口。

如,绑定127.0.0.1IP到容器:

映射指定地址及随机端口

ip::containerPort格式会绑定宿主机的指定IP地址及随机端口到容器端口。如:

使用docker ps查看所分配的端口:

1.3 其它

在前面示例中,我们通过docker ps查看已创建的容器及容器所绑定的端口。除了docker ps命令外,还可以使用docker port查看所绑定的端口及IP地址:

容器内部可能会使用多个网络端口,使用docker port命令时,可以指定端口参数,以查看容器指定端口的绑定情况:

在创建/运行容器时,-p参数可以被多次使用,以绑定多个容器端口:

Docker进行端口绑定时,默认会绑定TCP端口。还可以使用udp标记来绑定udp端口:

2. 容器链接(Link)

容器的连接(link)系统是除了端口映射外,另一种跟容器中应用交互的方式。该系统会在源容器和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。Docker的链接是一个可以将具体的容器连接到一起来进行通信的抽像层。

2.1 容器的命名

Docker的连接系统会依据容器的名称来进行连接,因此,首先需要定义容器的名称。在不指定容器命令的情况,系统会随机分配一个名称。但相对来说,自定义容器名称更容易记。

自定义容器名称,可以使用--name参数:

命令并运行容器后,可以通过docker ps命令来查看相关信息。也可以使用docker inspect命令来查看容器的名称:

2.2 容器的互联

使用--link参数可以让容器间安全的进行互联。

如,我们可以像下面这样创建一个名为web的容器,并将它连接到db容器:

这样就在webdb之间建立了互联关系。

--link参数格式

--link参数的格式为--link name:alias,其中:name表示要连接的容器的名称,而alias表示连接后的别名。

通过--link参灵敏,Docker 会在两个互联的容器之间创建了一个安全的隧道,且不用映射它们的端口到宿主主机上。在前面我们启动db容器的时,并没有使用-p-P参数,从而避免了暴露数据库端口到外部网络上,增加了容器的安全性。

3. Docker网络(Networking)

在Docker 1.9及之后,增加了Docker Networkingdocker network命令。容器之间的连接通过网络来创建,这被称为Docker Networking

通过端口映射的方式开放容器的内部网络,这种方式并不够灵活、强大,且会暴露端口到外部网络。容器链接和Dcoker Networking是更好的处理方式,Docker 1.9之前的版本推荐使用容器链接(Link)的方式,在Docker 1.9及之后则更推荐使用Dcoker Networking。相对链接来说,Networking具有以下优点:

  • Dcoker Networking可以将容器连接到不同宿主机上的容器
  • 通过Dcoker Networking连接的容器,可以在不更新连接的情况下对容器进行停止、启动或重启。而链接则需要通过更新配置,重启对应的容器来更新容器之间的网络
  • 使用Dcoker Networking可以不用关心容器是否已运行,也不用关心容器的运行顺序,而可以在网络内部获取容器名的解析和发现

Docker 安装会,有三个网络会被自动创建。可以通过docker network ls命令查看:

在Docker历史上,这三个网络是Docker执行的一部分。在运行容器时,可以使用--network指定要运行容器的网络,面这三个网络都可选。

3.1 创建网络

Docker Networking允许用户创建自己的网络,容器间可以通过这个网络互相通讯。Docker Networking允许容器跨越不同的宿主机通讯,且网络配置方式更灵活。

Docker Engine 会在引擎安装时自动创建一个名为bridge(桥接)网络,这个网络会与docker0(Docker内部网络)相对应。

除此之外,用户还可以自行创建bridgeoverlay类型的网络。bridge网络适用于单台宿主机运行的单Docker引擎环境,而overlay网络允许我们跨多台宿主机进行通讯。

要实现Docker Networking互联,首先要使用docker network create命令创建一个网络:

如上,我们创建了一个名为my_network的网络,现在可以通过docker network inspect查看这个新建的网络:

在不添加额外参数的情况下,创建的是一个本地桥接网络。而创建overlay网络,需要预先存在一些条件,详细官方文档:Create networks

使用docker network ls命令也可以看到这个新建的网络:

3.2 创建容器并连接到网络

创建网络后,可以在创建容器时通过--network参数指定容器要使用的网络:

使用docker network inspect查看的网络情况:

可以看到my_network网络的Containers参数中,包含了网创建的容器的信息,表中容器已连接到我们所创建的网络,而该容器的IP地址为172.18.0.2

接下来,创建一个交互式容器,并查看该容器内部的网络情况:

然后使用ping测试是否可以连接到db容器:

由此可见在同一网络中的容器是可以互相访问的。

3.3 将已有容器连接到Docker网络

当需要将已在运行的容器添加到已有的网络时,可以使用docker network connect命令。

删除刚创建的web容器,并使用以下命令重新创建:

将这个容器连接到已创建的名为my_network的网络:

使用docker network inspect查看的网络情况,Containers节点内容如下:

一个容器可以连接入多个网络,从而构建出非常复杂的网络模型。

3.4 断开网络与网络删除

还可以使用docker network disconnect命令将容器与网络断开连接:

这样就将容器web与网络my_network断开的了连接。

网络不在需要后,可以使用docker network rm命令将网络删除:

注意:删除网络时,需要已断开所容器的连接,否则会删除失败。

Docker 网络-端口映射、容器链接、Networking相关推荐

  1. 在Linux中进行docker网络端口映射

    在Linux中有两种安装docker的方法,一种是使用官方安装脚本自动安装docker,另一种是手动安装docker. 容器中可以运行一些应用,要让外部也可以访问这些应用,可以通过"-P或- ...

  2. docker 添加端口映射_Docker容器修改端口映射

    对于已经建立的docker容器,需要新增容器对主机的端口映射,主要分为三种: 一:通过修改配置文件修改docker容器端口映射 1.使用docker ps -a命令找到要修改容器的CONTAINER ...

  3. 【Docke进阶篇】Docker网络模式与容器间通信

    本篇主要是Docker网络模式与容器间通信. 上一篇:[Docker基础篇]Docker核心概念与指令 文章目录 一.预备知识点 二.Docker网络模式 1.查看Docker网络模式 2.bridg ...

  4. docker的端口映射顺序

    docker的端口映射顺序 docker run -d -p 5433:5432 postgres -p 宿主机端口5433 : 容器端口5432

  5. qemu 网络端口映射

    我主要是想在 模拟出来的 ARM 设备中 使用 SSH 服务,还有一些别的网络服务,这样的功能我们可以直接使用网络端口映射来实现. 比如我的宿主机的IP是 172.21.60.89 ,而我模拟出来的A ...

  6. centos7 docker删除端口映射_容器Docker详解

    概述 基本概念Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源.Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Li ...

  7. docker 添加端口映射_Docker三大核心概念之容器

    ​容器 1.新建容器 docker create命令创建一个容器,例如: docker create -it hello-world 使用docker create命令新建的容器处于停止状态.可以使用 ...

  8. docker 添加端口映射_苟且偷生的程序猿没法摸鱼了,从docker搭建elasticsearch集群开始学习...

    最近刚换了公司,然后公司刚好使用的docker.而本人作为一个石锤的搬砖员,之前只知道搬砖们,对于这些东西确实没学过.今天在本地使用docker搭建elasticsearch集群,记录下过程,而且el ...

  9. docker系列-端口映射

    1 使用方式 容器中可以运行一些应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射. -P:随机映射一个物理机的 49000~49900 之间的端口到内部容器开放的网络端口 ...

最新文章

  1. 说得太好了!阿里巴巴为什么不用 ZooKeeper 做服务发现?
  2. 今日工作总结及计划: 2022-02-14
  3. 基于FPGA的AES加解密读写控制系统,实现FLASH内部读写内容的销毁功能
  4. Mybatis 逆向工程 自动生成代码
  5. E. Company(Codeforces Round #520 (Div. 2))
  6. 高中计算机教师招聘试题,中小学信息技术教师招聘考试真题及答案.doc
  7. Snap svg 主要对象
  8. Linux生态ox版本,从折腾说Linux生态圈
  9. mysql授予权限和撤销权限的关系_MySQL数据库常用的授予权限和撤销权限的命令讲解...
  10. jsp springmvc 视图解析器_springMVC配置jsp/html视图解析器
  11. mysql函数commit_mysql的函数不能用commit吗?
  12. iphone-common-codes-ccteam源代码 CCCommon.h
  13. 区块链 用户身份权限模式 方案
  14. sdr 软件_SDR软件定义无线电是什么?不仅仅是大频谱
  15. long在python中的意思_Python中的Long对象
  16. 【综合篇】Web前端性能优化原理问题
  17. ubuntu20.04中打开echo daytime服务
  18. Python小程序之超市买水果
  19. 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?
  20. 如何更改MySQL数据库密码(免密)

热门文章

  1. 各类 HTTP 返回状态代码详解
  2. phpadmin 安装
  3. 解决`向github提交代码是老要输入用户名密码`
  4. 一维数组的初始化问题(函数体内与函数体外)
  5. 【机器学习】高斯过程python包安装过程
  6. 为DbHelper工具类添加关闭资源的方法 jdbc 20210412_212728.mp4
  7. 日期控件的用法 winform
  8. 办公自动化-发送邮件功能-无格式-有格式-带附件-0225
  9. dj电商-需求分析-商品模块
  10. 基本电路概念(一)什么是电压?