在实践中,经常需要多个服务组件容器共同协作的情况,这往往需要多个容器之间能够互相访问到对方的服务。Docker除了通过网络访问外,还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主机;另一个是互联机制实现多个容器间通过容器名来快速访问。
1、从外部访问容器应用
在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络进行访问容器内的应用和服务的。当容器中运行一些网络应用,要让外部访问这些应用,可以通过-P或-p参数来指定端口映射。
当使用-P(大写)标记时,Docker会随机映射一个端口至容器内部开放的网络端口。
[[email protected] ~]# docker run -itd -P nginx:1.14.1 /bin/bash ea64b1b5051c897233b48e5fc8435efcdf4bdb9eeca95559687ed1c1e24bb2fd [[email protected] ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea64b1b5051c nginx:1.14.1 "/bin/bash" 22 seconds ago Up 22 seconds 0.0.0.0:32774->80/tcp focused_kilby
使用-p(小写)则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。支持的格式有 IP:HostPort:ContainerPort | IP: : ContainerPort | HostPort: ContainerPort
(1)映射所有接口地址
#使用hostPort:containerPort格式,将本地的5000端口映射到容器的5000端口,可以执行以下命令: docker run -d -p 5000:5000 nginx:1.14.1 /bin/bash #此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口。例如: docker run -d -p 5000:5000 -p 8082:80 nginx:1.14.1 /bin/bash
(2)映射到指定地址的指定端口
#可以使用ip:hostPort:containerPort格式指定映射一个特定的地址,例如localhost的地址127.0.0.1 docker run -d -p 127.0.0.1:5000:5000 nginx:1.14.1 /bin/bash
(3)映射到指定地址的任意端口
#使用ip::containerPort绑定localhost的任意端口到容器的5000端口,本地主机会任意分配一个端口 docker run -d -p 127.0.1.1::5000 nginx:1.14.1 /bin/bash
(4)查看端口映射情况
docker port container_name/container_id
测试:
启动一个nginx容器,将宿主机80端口映射到容器的80端口
[[email protected] ~]# docker run -itd --name web_nginx -p 80:80 nginx:1.14.1 bash 1b0e2e79f8b4cec81fcf4b360288aab83e39ac670d5f81950ddb168169987fb7
进入容器,开启nginx服务,写入一个测试语句到默认的index文件中,并测试访问
[[email protected] ~]# docker exec -it web_nginx bash [email protected]:/# /etc/init.d/nginx start [email protected]:/# echo " test is to docker 80 port " > /usr/share/nginx/html/index.html [[email protected] ~]# curl http://139.159.143.74/ test is to docker 80 port
2、容器的互联
容器的互联是一种让多个容器中的应用进行快速交互的方式,它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
(1)自定义容器名称
连接系统依据容器的名称来执行。因此需要自定义一个好记的容器名。使用–name标记可以为容器自定义命名:
docker run -d --name web_nginx -p 80:80 nginx:1.14.1 bash
(2)容器互联
使用–link 参数可以让容器直接安全的交互
docker run -d --name db training/postgres
创建一个新的web容器,并将它连接到db容器
docker run -itd -P --name web --link db:db centos:7 /bin/bash #查看Link信息 [[email protected] ~]# docker inspect -f "{{ .HostConfig.Links }}" web [/db:/web/db] [[email protected] ~]# docker exec -it web /bin/bash #ping一下看是否能连通: bash-4.2# ping db PING db (172.17.0.3) 56(84) bytes of data. 64 bytes from db (172.17.0.3): icmp_seq=1 ttl=64 time=0.085 ms 64 bytes from db (172.17.0.3): icmp_seq=2 ttl=64 time=0.058 ms 64 bytes from db (172.17.0.3): icmp_seq=3 ttl=64 time=0.057 ms
用户可以连接多个容器到db容器上。