端口映射和容器互联

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

 
端口映射实现容器访问
 
在启动容器的时候, 如果不指定对应参数, 在容器外部是无法通过网络来访问容器内的
网络应用和服务的。
 
当容器中运行一些网络应用, 要让外部访问这些应用时, 可以通过 -P 或 -p 参数来指
定端口映射。 
 
-P(大写的)标记时, Docker 会随机映射一个 49000 ~ 49900 的端口到内部容器开放的网络端口。
 
-p (小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定 一个容器。
支持的格式有 IP: HostPort: ContainerPort 或 IP:: ContainerPort  或  HostPort: ContainerPort。
 
HostPort: ContainerPort 格式(映射所有接口地址):默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口。
IP: HostPort: ContainerPort 格式(映射到指定地址的指定端口):指定映射使用一个特定地址。
IP:: ContainerPort 格式(映射到指定地址的任意端口): 绑定IP的任意端口到容器的xxx端口,本地主机会自动分配一个端口。
 
注意:
  • 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
  • -p 标记可以多次使用来绑定多个端口
可以通过 docker logs 命令来查看应用的信息。
使用docker port 来查看当前映射的端口配置,也可以查看到绑定的地址。
 

 
互联机制实现便捷互访
 
容器的互联是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
 
1、自定义容器名(使用 docker  run  --name标记可以为容器自定义命名)
连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。虽然当创建容器的时候,系统默认会分配一个名字,但自定义命名容器有两个好处:一、自定义的命名,比较好记;二、当要连接其他容器时候(即便重启),也可以使用容器名而不用改变
 
注意:容器的名称是唯一的。如果巳经命名了一个叫web的容器,当你要再次使用web这个名称的时候,需要先用docker rm命令删除之前创建的同名容器。
在执行docker  run的时候如果添加--rm标记,则容器在终止后会立刻删除。注意,- -rm 和-d参数不能同时使用。
 
 
2、容器互联
 
使用 docker  run --link参数可以让容器之间安全地进行交互
--link参数的格式为 --link name: alias, 其中name是要链接的容器的名称 ,alias是别名
docker  run  -d  -P  --name  web  --link db:db  training/webapp  python  app.py
Docker 相当于在两个互联的容器之间创建了一个虚机通道, 而且不用映射它们的端口到宿主主机上。
 
随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。
 
   2.1 创建一个新的 Docker 网络。
$ docker network create -d bridge my-net
-d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于  Swarm mode,在本小节中你可以忽略它。
   
    2.2 连接容器。
运行一个容器并连接到新建的 my-net 网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net 网络
$ docker run -it --rm --name busybox2 --network my-net busybox sh
这样,busybox1 容器和 busybox2 容器建立了互联关系。可通过 ping  容器名 来证明 busybox1 容器和 busybox2 容器建立了互联关系。
如果你有多个容器之间需要互相连接,推荐使用  Docker Compose
 

 
DNS配置
 
cat /etc/resolv.conf
配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
如果用户想要手动指定容器的配置,可以在使用 docker run 命令启动容器时加入如下参数:
-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。
--dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 . example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索  host.example.com
注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
 
 
 

转载于:https://www.cnblogs.com/cshaptx4869/p/10947668.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值