本篇是关于 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. python format 时间格式

    trainData['survey_time'] = pd.to_datetime(trainData['survey_time'],format = '%Y/%m/%d %H:%M') trainD ...

  2. 表观 | Enhancer | ChIP-seq | 转录因子 | 数据库专题

    需要长期更新! 参考:生信修炼手册 enhancer的基本概念: 长度几十到几千bp,作用是提高靶基因活性,属于顺式作用原件,DNA作用到DNA,转录因子就是反式,是结合到DNA的蛋白. 1981年, ...

  3. Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'kindergarten.n.stuMChkTime' which is not functionally dependent on columns in GROUP BY clause; this is in

    错误原因: ​ sql _mode中only _full _group _by不兼容的问题 解决思路: ​ 既然是only _full _group _by不兼容,那就把它去掉就好啦 show var ...

  4. $objPHPExcel=$objReader->load() 报错路径不存在

    PHPexcel导入excel内容到数据库出错, $objPHPExcel=$objReader->load()报错 Could not open /public/upload/20191028 ...

  5. tomcat中设置Java 客户端程序的http(https)访问代理

    1.假定http/https代理服务器为 127.0.0.1 端口为8118 2.在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS,如下图: 保存后重启tomcat就能生 ...

  6. Ubuntu配置国内高速apt-get更新源

    Ubuntu配置国内高速apt-get更新源     具体内容直接参考这篇博客:https://www.linuxidc.com/Linux/2017-11/148627.htm 此网站可直接找到符合 ...

  7. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  8. SQL语句精妙集合

    1一.基础  2  31.说明:创建数据库  4Create DATABASE database-name  5  62.说明:删除数据库  7drop database dbname  8  93. ...

  9. 【428】Dijkstra 算法

    算法思想:(单源最短路径) 1个点到所有其他点的最短路径 查找顶点到其他顶点的最短路径,无法到达的记为+∞,找到最小的,就找到了最短路径的顶点 查看上一轮找到的最小点到达其他点的最小值,找到最短路径的 ...

  10. CNN中计算量FLOPs的计算

    1.FLOPs的概念:全称是floating point operations per second,意指每秒浮点运算次数,即用来衡量硬件的计算性能:在CNN中用来指浮点运算次数: 2.计算过程: 如 ...