docker port mapping - yaokun123/php-wiki GitHub Wiki

端口映射和容器间互访问

一、端口映射

默认情况下,宿主机是无法访问容器内部网络的,但是可以使用端口映射来解决这个问题,在之前文章中已经提到过Docker的端口映射。主要通过docker run 跟 -P(大写) 或 -p(小写)参数来实现。docker run -P 会把容器中监听的端口随机绑定到宿主机的可用端口上:

docker run -p HostPort:ContainerPort  可以让我们指定需要映射的容器和宿主机端口:

在做端口映射时,也可以指定容器的网络传输协议,默认是tcp协议,如果是udp协议,则可以显示指定:

[root@localhost ~]# docker run -d -p 127.0.0.1:8080:80/udp nginx:latest

二、容器互联

如果说端口映射解决了宿主机和容器之间的互访问问题,那另一个问题就是容器和容器之间如何互访问。
docker run 的 --link 参数可以指定连接到一个容器,从而使得容器之间可以通过容器名来访问。
下面以搭建 nginx + php-fpm 为例演示容器间互访问。\

我这里分别有一个 php-fpm 和 nginx 镜像。

1、先启动php-fpm 容器, 并使用 --name 参数指定容器名
[root@localhost ~]# docker run -d --name php-fpm php:5.6.32-fpm
3e4b04174da9a91f77d9560113d3021f90a9638165968ccff44fede6c7961871

每一个运行中的Docker容器都有一块虚拟网卡和一个内网ip,我们可以进到上面的容器来查看:
先安装ifconfig命令,然后使用ifconfig查看ip地址信息
[root@localhost ~]# docker exec -it php-fpm /bin/bash
root@3e4b04174da9:/var/www/html# apt-get update
root@3e4b04174da9:/var/www/html# apt-get install net-tools
root@3e4b04174da9:/var/www/html# ifconfig
可以看到php-fpm容器有一块 eth0 网卡, 其ip地址为 172.17.0.54,还可以查看hosts信息
root@3e4b04174da9:/var/www/html# cat /etc/hosts
容器ID解析到了该容器局域网IP

2、再启动nginx容器,同样指定一个名字,并使用 --link 连接到之前的php-fpm容器。
[root@localhost ~]# docker run -d -p 8080:80 --name nginx --link php-fpm nginx:latest
03fe0d3fbd43b5db157992703f70dd6eff4555c4e49c3620e7a212c81824778f

此时 nginx 容器就连接到 php-fpm 容器上了,可以进入nginx容器查看相关环境变量和hosts信息
[root@localhost ~]# docker exec -it nginx /bin/bash
root@03fe0d3fbd43:/# env
能够看到 nginx 容器中有很多 PHP_FPM相关的环境变量,而hosts中除了有本身容器ID与自身IP地址的解析关系外,
还包含了php-fpm 容器的解析,我们可以使用 ping 或 telnet 命令查看两个容器之间的网络是否畅通。

先安装 ping 和 telnet :
root@03fe0d3fbd43:/# apt-get install iputils-ping
...........
root@03fe0d3fbd43:/# apt-get install telnet
...........

root@03fe0d3fbd43:/# ping php-fpm
看到连接了容器之后可以直接用容器名来访问,非常方便

现在我们可以配置 nginx 的 fastcgi, 转发php请求到 php-fpm 容器
先安装VI:
root@03fe0d3fbd43:/# apt-get install vim-tiny
然后修改 /etc/nginx/conf.d/default.nginx
记得修改好后 reload 一下nginx
root@03fe0d3fbd43:/# /etc/init.d/nginx reload

在php-fpm容器的 /php 目录下创建一个 test.php,并添加相应的权限
[root@localhost ~]# docker exec -it php-fpm /bin/bash
root@0805ea04f2c8:/var/www/html# mkdir /php
root@0805ea04f2c8:/var/www/html# echo '<?php echo time() . "\n";' > /php/test.php
root@0805ea04f2c8:/var/www/html# chmod 777 /php/test.php

然后在宿主机下访问该php文件:
[root@localhost ~]# curl '127.0.0.1:8080/test.php'
1509695115
[root@localhost ~]# curl '127.0.0.1:8080/test.php'
1509695138