默认情况下,宿主机是无法访问容器内部网络的,但是可以使用端口映射来解决这个问题,在之前文章中已经提到过 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