本篇是关于 docker 容器的端口映射和容器之间的互联内容。

注:环境为 CentOS7,docker 19.03。

docker 的容器除了能连接网络外,在许多时候,我们需要让多个容器来协同完成任务。为了应对这样的需求,docker 提供了两种机制:

  • docker 容器和主机间的端口映射。
  • 利用互联机制让多个容器通过容器名来快速访问。

端口映射实现容器访问

容器启动时,如果不指定对应的参数,容器外部是无法访问容器内部的。要让外部能访问内部的话,在容器启动时利用选项 -p | -P 可以实现端口的映射。

  • -p :指定映射端口。
  • -P(大写):Docker会随机映射⼀个49000~49900的端⼜到内部容器开放的⽹络端口。
# docker run -d -P training/webapp python app.py
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a91ece91213 training/webapp "python app.py" 8 seconds ago Up 6 seconds 0.0.0.0:32768->5000/tcp eloquent_fermat

指定 -P 随机分配主机的32768端口映射到容器的5000端口,访问主机的32768输出如下:

# curl http://127.0.0.1:32768
Hello world!

端口映射类型

利用选项 -p | -P 能实现不同的映射类型。

1.指定端口映射:-p HostPort:ContainerPort

# docker run -d -p 5000:5000 training/webapp python app.py

2.多个端口映射,多次使用 -p 实现

# docker run -d -p 5001:5000 -p 3000:80 training/webapp python app.py

3.映射到指定地址的指定端口 -p IP:HostPort:ContainerPort

# docker run -d -p 127.0.0.1:5000:5000  training/webapp python app.py

4.映射到指定地址的任意端口 -p IP::ContainerPort

# docker run -d -p 127.0.0.1::5000  training/webapp python app.py

5.映射到指定的协议 tcp 或 udp -p IP::ContainerPort/protocol

# docker run -d -p 127.0.0.1:5000:5000/udp  training/webapp python app.py

查看端口映射

查看 docker 容器的映射端口可以使用 inspect 命令,同时 docker 也提供了更直观的子命令 port

# docker port f061c03d
5000/udp -> 127.0.0.1:5000

容器互联

容器的互联(linking) 是⼀种让多个容器中的应⽤进⾏快速交互的⽅式。 它会在源和接收容器之间创建连接关系, 接收容器可以通过容器名快速访问到源容器, ⽽不⽤指定具体的IP地址。

连接系统依据容器的名称来执⾏。所以在启动容器的时候需要使用 --name 选项指定容器名称,虽然容器启动时会被随机分配一个名称,但互联是指定名称还是必要的。

# docker run -d -p 127.0.0.1:5000:5000 --name web  training/webapp python app.py

注:docker 名唯一。

容器互联使用选项 --link name:alias,前者是容器名,后者是自定义的别名。

例如我们创建一个数据库容器 db ,再创建一个web应用容器 web 连接 db

# docker run -d --name db training/postgres
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73fd1af29108 training/postgres "su postgres -c '/us…" 5 seconds ago Up 4 seconds 5432/tcp db
# docker run -d -P --name web --link db:db training/webapp python app.py
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e983b169dd5 training/webapp "python app.py" 6 seconds ago Up 4 seconds 0.0.0.0:32769->5000/tcp web
73fd1af29108 training/postgres "su postgres -c '/us…" About a minute ago Up About a minute 5432/tcp db

这样一来,web容器就和db容器建立互联关系了。

docker 相当于在两个互联的容器之间创建了⼀个虚机通道, ⽽且不⽤映射它们的端⼜到宿主主机上。 在启动db容器的时候并没有使⽤ -p 和 -P 标记, 从⽽避免了暴露数据库服务端⼜到外部⽹络上。

docker 通过两种⽅式为容器公开连接信息:

  • 更新环境变量;
  • 更新 /etc/hosts ⽂件。

重新启动容器查看它互联的环境变量

# docker run -it -P --name web2 --link db:db --rm training/webapp env
TERM=xterm
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web4/db
DB_ENV_PG_VERSION=9.3
HOME=/root

其中DB_开头的环境变量是供web容器连接db容器使⽤, 前缀采⽤⼤写的连接别名。

除了环境变量, docker 还添加 host 信息到⽗容器的 /etc/hosts 的⽂件。 下⾯是⽗容器 web 的 hosts ⽂件:

172.17.0.3      db 73fd1af29108
172.17.0.4 7e983b169dd5

172.17.0.3 指定 db 容器和对应的 id,172.17.0.4 是 web 容器。当然使用多个 --link 就可以连接多个容器。

docker 实践五:端口映射和容器互联的更多相关文章

  1. Docker入门之六端口映射与容器互联

    一.端口映射 在之前的博客搭建私有仓库时用到这样一句:docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry来r ...

  2. 详解Docker 端口映射与容器互联

    详解Docker 端口映射与容器互联 1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行 ...

  3. Docker实战(五)之端口映射与容器互联

    除了网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问. 1.端口映射实现访 ...

  4. Docker基础-端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...

  5. docker——端口映射与容器互联

    在生产环境中,单个服务往往是独立的,但是服务与服务之间往往是相互依赖的,这样对于容器来说,容器之间就需要相互访问.除了网络访问之外,docker还提供了另外两种方式来满足服务的访问. 一:允许映射容器 ...

  6. Docker学习笔记(二):端口映射与容器互联

    端口映射 使用docker run时,可以指定-P(大写)与-p(小写)参数映射端口. docker run -P -P(大写)会随机映射一个端口到容器的内部端口 -> [feifei@ffma ...

  7. Docker端口映射与容器互联

    Docker提供了两个功能来满足访问的基本需求:一是允许映射容器内应用的服务端口到本地宿主主机:另一个是互联机制实现多个容器间通过容器名来快速实现访问. 一.端口映射实现访问容器 当容器中运行一些网络 ...

  8. Docker-端口映射与容器互联

    在使用docker过程中,通常会碰到需要多个服务组件容器共同协作的情况,这往往需要多个容器之间有能够互相访问到对方的服务除了通过网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求 ...

  9. docker端口映射和容器互相访问

    端口映射 容器运行时如果没有指定端口,与外界是无法通信的,比如当前我们的有一台MySQL的docker container,当前容器正在运行mysql并提供3306端口 # docker ps CON ...

随机推荐

  1. Linux系统配置静态ip

    一.工具/原料 redhat6.2 二.步骤 1."网络适配器"选择"桥接模式" 右键虚拟机,选择"设置"->"网络适配器& ...

  2. 第10组 Alpha冲刺(1/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 史恩泽(组长) 过去两天完成了哪些任务 描述 了解了反馈机制的实现原理 确定好算法的框架 对接口的规范化进行学习 展示Gi ...

  3. Spring Boot核心原理

    Spring Boot核心原理 spring-boot-starter-xxx  方便开发和配置 1.没有depoy setup tomcat 2.xml文件里面的没有没有了 @SpringBootA ...

  4. 在使用PhpSpreadsheet出现空行导入的问题

      在使用PhpSpreadsheet出现空行导入的问题,项目一直报错,原来是读取excel后会多读取几行,或者说读取的行数有错误.因此必须加一个,去除空行.暂时没有研究源码可能源码里面有这样的功能. ...

  5. android strings: %s、%1$s、%d、%1$d占位符

    实际开发的过程中我们有时候会遇到,一个TextView里面会遇到会有一个一大串固定的文字,而里面的数字或者个别字需要根据后台的接口而展示的.这个时候我们最简单的方法就是在string.xml文件里 使 ...

  6. vmware配置双网卡

    最近在学习使用iptables做网关服务器,即SNAT设置 我们的宿主机有两块网卡,地址分别是: 192.168.6.108/24 192.168.66.119/24 我们的目标是在虚拟机VMware ...

  7. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...

  8. Leetcode: Campus Bikes II

    On a campus represented as a 2D grid, there are N workers and M bikes, with N <= M. Each worker a ...

  9. shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计

    shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...

  10. django 实战3 simpleui

    pip3 install django-import-export pip3 install django-simpleui pip3 install mysqlclient python3 mana ...