本篇是关于 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. windows 共享文件夹,和共享打印机

    达成的情形,目标主机上登陆用户设置密码,其他pc上需要目标主机的用户和密码才能访问其共享文件夹 步骤:1.目标主机,设置文件夹共享    在文件夹上右键-属性,点击共享选项卡,然后点击共享按钮,继续点 ...

  2. [转载]运行中的DLL自升级

      最近手头有个需求:dll需要注入到某个进程常驻,该dll具备自我升级能力,当发现新的可用版本时,立即Free自己,加载新的.下面是一个实现方案: 开启一个监听线程,从网络上拉新的可用版本,下载放到 ...

  3. RecyclerView 实现快速滚动 (转)

    RecyclerView 实现快速滚动 极小光  简书作者   简评:Android Support Library 26 中终于实现了一个等待已久的功能:RecyclerView 的快速滚动. An ...

  4. peomethues 参数设置 监控网站 /usr/local/prometheus-2.13.0.linux-amd64/prometheus --config.file=/usr/local/prometheus-2.13.0.linux-amd64/prometheus.yml --web.listen-address=:9999 --web.enable-lifecycle

    probe_http_status_code{instance="xxxx",job="web_status"} probe_http_status_code{ ...

  5. Unix下可用的五种 I/O 模型

    介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户 ...

  6. MYSQL Packet for query is too large (12054240 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.

    MYSQL Packet for query is too large (12054240 > 4194304). You can change this value on the server ...

  7. js中const,var,let区别与用法(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36784628/article/d ...

  8. 【转载】 【Tensorflow】卷积神经网络中strides的参数

    原文地址: https://blog.csdn.net/TwT520Ly/article/details/79540251 http://blog.csdn.net/TwT520Ly -------- ...

  9. Linux下文件乱码问题

    通常编码会在windows环境下进行,当把windows下的代码拷贝到linux环境时,会出现 error: “build.sh /bin/bash^M: 坏的解释器:没有那个文件或目录” 等等类似问 ...

  10. 013-docker-安装-Centos7

    1.搜索镜像 docker search centos 2.拉取合适镜像 选择合适tag:https://hub.docker.com/,下载合适版本 docker pull centos:6.6 d ...