由于公司在办公网络设置了隔离所以导致无法使用ip+port访问本地容器,使用容器
--link
能够容器之间互相访问。
遇到的问题
如下所示,创建了两个容器nginx容器中的服务需要服务mysql容器中的服务,但是由于办公网络隔离原因导致无法使用ip+port访问本地容器。
xiaocaideMacBook-Pro:data_mysql xiaocai$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c8d3a6896a1 nginx1.10_php5.6.22 "/run.sh /bin/bash" 34 minutes ago Up 34 minutes 8080/tcp, 9000/tcp, 0.0.0.0:8081->80/tcp ecstatic_mahavira
fd9bbccbe367 mysql5.5.38-server "/bin/bash" About an hour ago Up About an hour 0.0.0.0:8306->3306/tcp mysql_default
[root@fd9bbccbe367 work]# mysql -h localhost:8306 -uroot -p
Enter password:
ERROR 2005 (HY000): Unknown MySQL server host 'localhost:8306' (0)
解决方法
创建容器的时候添加link参数,如下将
mysql_default
容器关联并命名为localhost_db,这样在nginx
容器中能够通过localhost_db进行访问。
docker run --name=nginx_tool --link=mysql_default:localhost_db -i -t -p 8082:80 -v /work/work_wwwroot/tool/:/home/wwwroot/ nginx1.10_php5.6.22
/usr/bin/mysql -h localhost_db -u root -p
指定多个link,示例:
docker run --name=qingting -i -t --link mysql_default:localhost_db --link redis_default:localhost_redis -p 8081:80 -v /work/work_wwwroot/baidu/qingting/:/home/wwwroot nginx1.10_php5.6.22
说明
Docker通过下述两种方法吧子container里的信息暴露给父container:
- 环境变量
- 更新 /etc/host 文件
我们先看下docker设定的环境变量。 在 web containre里, 让我们运行 env 命令 列出所有的环境变量。
root@aed84ee21bde:/opt/webapp# env
HOSTNAME=aed84ee21bde
. . .
LOCALHOST_DB_PORT_3306_TCP_ADDR=172.17.0.2
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
LOCALHOST_DB_PORT=tcp://172.17.0.2:3306
LOCALHOST_DB_PORT_3306_TCP=tcp://172.17.0.2:3306
LOCALHOST_DB_PORT_3306_TCP_PORT=3306
. . .
[root@0e209db9fd6c /]# 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 localhost_db fd9bbccbe367 mysql_default
172.17.0.4 0e209db9fd6c