第七章 端口映射与容器互联

7.1 端口映射实现访问容器

7.1.1 从外部访问容器应用

在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个端口到内部容器开放的网络端口:

[[email protected] ~]# docker run -d -P training/webapp python app.py

f48059b82c2cbf0109e8a40a8bde1923b493469e643b7e5113ac2833ae1eca66

[[email protected] ~]# docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES

f48059b82c2c        training/webapp     "python app.py"     5 seconds ago       Up 3 seconds        0.0.0.0:32777->5000/tcp   affectionate_jepsen

此时,可以看到本地主机的32777被映射到容器的5000端口。访问宿主机的32777端口即可访问容器内web应用提供的界面。

[[email protected] ~]# curl http://192.168.161.128:32777

Hello world!

-p 可以指定要映射的端口,并且,在一个指定端口上至可以绑定一个容器。支持的格式有IP:HostPort:ContainerPort  |  IP::ContainerPort  |  HostPort:ContainerPort。

[[email protected] ~]# docker run -d --name web02 -p 8089:5000 training/webapp python app.py

c776c888d1d7a27acc8d01686a15b96da1cd455a5e0d9a1b4571b17e68131828

[[email protected] ~]# docker run -d --name web01 -p 192.168.161.128:8088:5000 training/webapp python app.py

E036037074b5c25e813447ceabbfc84f7cc6efeca0a9cc627df7ebccda05f920

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                            NAMES

c776c888d1d7        training/webapp     "python app.py"     About a minute ago   Up About a minute   0.0.0.0:8089->5000/tcp           web02

e036037074b5        training/webapp     "python app.py"     2 minutes ago        Up 2 minutes        192.168.161.128:8088->5000/tcp   web01

f48059b82c2c        training/webapp     "python app.py"     8 minutes ago        Up 8 minutes        0.0.0.0:32777->5000/tcp          affectionate_jepsen

[[email protected] ~]# curl http://192.168.161.128:8088

Hello world!

[[email protected] ~]# curl http://192.168.161.128:8089

Hello world!

7.1.2 映射所有接口地址

使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口,

[[email protected] ~]# docker run -d --name web04 -p 5000:5000 training/webapp python app.py

b7fb414302a3537032a01b1f5f6c4d45a2a14911fc97ff36b466cf242fe59650

此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口,

[[email protected] ~]# docker run -d --name web05 -p 5001:5000 -p 8090:80 training/webapp python app.py

0cf58b4564dbc23d92bb6e80c40e8b66f54856f0a78db00ba4f39a0189f56e75

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

使用IP:HostPort:ContainerPort格式指定映射应用一个特定地址,比如localhost地址127.0.0.1:

[[email protected] ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

eb60a00dca4d17409a8366fb0d3d58412835dd1875e104b185e50366b87d17e4

[[email protected] ~]# curl http://192.168.161.128:5000

curl: (7) Failed connect to 192.168.161.128:5000; 拒绝连接

[[email protected] ~]# curl http://127.0.0.1:5000

Hello world!

7.1.4 映射到指定地址的任意端口

使用  IP::ContainerPort  绑定本地IP的任意端口到容器的5000端口。本地主机会自动分配一个端口。

[[email protected] ~]# docker run -d --name web1 -p 192.168.161.128::5000 training/webapp python app.py

56fda1da9d504b1f7ced696c38f66d75ccd7c23fa8732c3ff9485aa6f6ac0367

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                             NAMES

56fda1da9d50        training/webapp     "python app.py"     17 seconds ago      Up 17 seconds       192.168.161.128:32768->5000/tcp   web1

7.1.5 查看映射端口配置

使用docker port 命令来查看当前映射的端口配置。也可以查看到绑定的地址:

[[email protected] ~]# docker port 56

5000/tcp -> 192.168.161.128:32768

[[email protected] ~]# docker port f4

5000/tcp -> 0.0.0.0:32777

容器有自己的内部网络和IP地址,使用docker inspect +容器ID  可以获取容器的具体信息。

7.2 互联机制实现便捷互访

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

7.2.1 自定义容器命名

虽然当创建容器的时候,系统默认会分配一个名字,但不容易记忆,因此需要我们使用--name 来自定义一个名字,而且重启后也不会发生改变。

[[email protected] ~]# docker run -d --name web -P training/webapp python app.py

5d8ccca093ff696b45ad139f47294b270034d02aeabb7709986513f423a03916

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                             NAMES

5d8ccca093ff        training/webapp     "python app.py"     2 seconds ago       Up 1 second         0.0.0.0:32778->5000/tcp           web

容器的名称是唯一的。

[[email protected] ~]# docker run --name web01 --rm -P training/webapp python app.py

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

使用docker inspect 查看容器的名字:

[[email protected] ~]# docker inspect -f "{{.Name}}" web

/web

在执行docker  run 的时候如果使用--rm参数。则容器在终止后立刻删除。--rm与-d参数不能同时使用。

7.2.2 容器互联

使用--link参数可以让容器之间安全地进行交互。

创建一个DB容器

[[email protected] ~]# docker run -d --name db training/postgres

77a70288dfe54528134c44dbfe6d076f4bacb4969d510d077dcf483c6647be0a

创建一个WEB容器,并将它连接到DB容器

[[email protected] ~]# docker run -d -P --name web --link db:db training/webapp python app.py

5623902d6820fe2e7880bf0a6c2a2849633c6eaccd9b5d22891985e27b089850

[[email protected] ~]# docker ps --no-trunc

CONTAINER ID                                                       IMAGE               COMMAND                                                                                                                                                                    CREATED              STATUS              PORTS                     NAMES

5623902d6820fe2e7880bf0a6c2a2849633c6eaccd9b5d22891985e27b089850   training/webapp     "python app.py"                                                                                                                                                            About a minute ago   Up About a minute   0.0.0.0:32780->5000/tcp   web

77a70288dfe54528134c44dbfe6d076f4bacb4969d510d077dcf483c6647be0a   training/postgres   "su postgres -c ‘/usr/lib/postgresql/$PG_VERSION/bin/postgres -D /var/lib/postgresql/$PG_VERSION/main/ -c config_file=/etc/postgresql/$PG_VERSION/main/postgresql.conf‘"   3 minutes ago        Up 3 minutes        5432/tcp                  db,web/db

 --link参数的格式为--link name:alias ,其中name是要连接的容器名称,alias是这个容器连接的别名。

可以看到两个容器db和web,db容器的name列有db也有web/db。这表示web容器连接到db容器,这允许web容器访问db容器的信息。

Docker相当于在两个互联的容器之间创建了一个虚拟通道,而且不用映射它们的端口到宿主机主机上。在启动DB容器的时候并没有使用-p或-P标记,从而避免了暴露数据库服务端口到外部网络上。

Docker通过两种方式为容器公开连接信息:

□ 更新环境变量;

□ 更新/etc/hosts文件。

使用env命令来查看web容器的环境变量

[[email protected] ~]# docker run --rm --name web02 --link db:db training/webapp env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=71ee2c52219b

DB_PORT=tcp://172.17.0.2:5432

DB_PORT_5432_TCP=tcp://172.17.0.2:5432

DB_PORT_5432_TCP_ADDR=172.17.0.2

DB_PORT_5432_TCP_PORT=5432

DB_PORT_5432_TCP_PROTO=tcp

DB_NAME=/web02/db

DB_ENV_PG_VERSION=9.3

HOME=/root

#--rm 参数在命令env执行完之后,马上会停止,退出,删除容器。

其中DB_开头的环境变量提供Web容器连接DB容器使用,前缀采用大写的连接别名。

除了环境变量之外,Docker 还添加host信息到父容器的/etc/hosts文件。

[[email protected] ~]# docker run -it --rm --link db:db training/webapp /bin/bash

[email protected]:/opt/webapp# 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        db 77a70288dfe5

172.17.0.4        7504aee7305c

这里面两个hosts信息,第一个是web容器,web容器用主机的id作为默认主机名,第二个是db容器的IP和主机名。可以在web容器中用ping命令来测试与db容器的连通:

[email protected]:/opt/webapp# ping db

PING db (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.421 ms

64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.271 ms

用户可以连接多个子容器到父容器,比如可以连接多个web到同一个db容器上。

原文地址:https://www.cnblogs.com/lingxiaolong/p/9209265.html

时间: 2024-11-07 20:50:25

第七章 端口映射与容器互联的相关文章

docker端口映射与容器互联

端口映射与容器互联 1.端口映射实现容器访问 ① 从外部访问容器应用 在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射.当使用-P(大写)标记时,Docker会随机映射一个端口(端口范围在Linux系统使用的端口之外,一般都过万)到内部容器的开放网络端口: [[email protected]_0_9_centos ~]# docker run -d -P tra

Docker容器——镜像管理,端口映射,容器互联

docker镜像的分层  Dockerfile 中的每个指令都会创建一个新的镜像层: 镜像层将会被缓存和复用: 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效: 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效: 镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式 可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建 基于

Docker容器之镜像管理、端口映射、容器互联

docker镜像的分层 ?Dockerfile 中的每个指令都会创建一个新的镜像层:?镜像层将会被缓存和复用:?当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效:?某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效:?镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建基于本地

Docker容器之镜像管理,端口映射,容器互联

docker镜像的分层 Dockerfile 中的每个指令都会创建一个新的镜像层: 镜像层将会被缓存和复用: 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效: 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效: 镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式 可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建 基于本

Docker-端口映射与容器互联

在使用docker过程中,通常会碰到需要多个服务组件容器共同协作的情况,这往往需要多个容器之间有能够互相访问到对方的服务除了通过网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机,另一个是互联机制实现多个容器间通过容器名来快速访问. 端口映射实现访问容器 1.从外部访问容器应用在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的当容器中运行一些网络应用,要让外部访问这些应用时,可以通

docker的网络、端口映射和容器间通信

docker作为服务器内部的一个容器单位,对外的通信也就有了困难.这里提供了一些几个解决方案. 1.Docker独立IP 简单说就是配置独立的网桥,分配给docker IP cd /etc/sysconfig/network-scripts/ vi ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet BRIDGE="br0" BOOTPROTO=static vi ifcfg-br0 DEVICE="b

修改docker容器的端口映射

大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改已有的这个容器呢?有.在stackoverflow上面找到答案了. 方法一 1.停止容器(docker stop d00254ce3af7) 2.停止docker服务(systemctl stop docker) 3.修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果con

macOS修改Docker容器的端口映射配置

查询容器ID 查询需要修改端口映射的容器ID docker inspect [OPTIONS] NAME|ID [NAME|ID...] OPTIONS说明 -f :指定返回值的模板文件. -s :显示总的文件大小. --type :为指定类型返回JSON. 进入Docker文件目录 cd ~/Library/Containers/com.docker.docker 使用screen进行登陆 cd /Data/vms/0 screen tty 进入配置文件夹 cd /var/lib/docker

[docker] 05 docker仓库&数据管理&端口映射

主要内容: 一.仓库市场 二.搭建本地私有仓库 三.数据卷 四.数据卷容器 五.端口映射 六.容器互联 一.仓库市场 1.1. 官方仓库:https://hub.docker.com/search/?q=&type=image 1.2. 第三方仓库:包括腾讯云 网易云.阿里云.DaoCloud等 二.搭建本地私有仓库 2.1. 使用resgistry镜像创建私有仓库 docker run -d -p 5000:5000 registry 查看ip,修改docker服务启动参数默认使用http访问