docker-容器间通过宿主机IP间接通信

容器间通过宿主机IP间接通信

Nginx容器和php-fpm容器通信

问题焦点

容器如何获取宿主机docker0网卡IP?

通过容器/etc/profile(hosts)文件

下面2条命令是等效的

--add-host host:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') \

--add-host host:$(/sbin/ip route|awk '/docker0/ { print $9}') \

通过容器环境变量

下面2条命令是等效的

-e DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') \

-e DOCKER_HOST=$(/sbin/ip route|awk '/docker0/ { print $9}') \

 

准备镜像

docker pull nginx;

docker pull devilbox/php-fpm:5.6-prod

创建容器

建php容器

docker run -d --name php -p 9000:9000 \

-e DOCKER_LOGS=1 \

-e FORWARD_PORTS_TO_LOCALHOST='3306:172.31.0.18:3306' \

-v $PWD/www:/var/www/default/htdocs \

-v $PWD/logs:/var/log/php \

devilbox/php-fpm:5.6-prod

 

建nginx容器

docker run -d --name nginx_80 -p 80:80 \

--add-host host:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') \

-v $PWD/www:/tol/nginx/www \

-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:ro \

-v $PWD/conf/conf.d:/etc/nginx/conf.d:ro \

-v $PWD/logs:/var/log/nginx \

--volumes-from php \

-u root nginx

 

注意:nginx并没有link php容器,但通信前提是:php容器端口要绑定到宿主机9000端口上

编写配置文件

Nginx配置文件(部分

server {

listen 80;

server_name bbs.i5i5.top;

root /var/www/default/htdocs/bbs/ROOT; #此目录是php容器的应用程序目录,通过共享券的方式,nginx容器也可以访问到

index index.html index.jsp index.htm index.php;

location ~ .*\.(gif|jpg|jpeg|png|bmp|ico|swf|js|css)$ {

  expires 1h; #缓存到客户端的浏览器一个小时

}

 

location ~ \.php$ {

fastcgi_pass   host:9000; #容器间通信:nginx会查找容器内/etc/profile文件找的host映射的ip地址

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

include        fastcgi_params;

        }

 

access_log /var/log/nginx/bbs.log access;

}

题外话

fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;  

nginx会把获取的请求参数通过上面的配置转发给php-fpm服务处理,其中$document_root表示的是应用程序路径,取root /var/www/default/htdocs/bbs/ROOT; 的值。

下面2种配置方式是等效的:

root /var/www/default/htdocs/bbs/ROOT;

fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param  SCRIPT_FILENAME /var/www/default/htdocs/bbs/ROOT$fastcgi_script_name;

多学一点儿

获取宿主机docker0 网卡 IP

命令1:

ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+'

 

命令2:

/sbin/ip route|awk '/docker0/ { print $9}'

 

用法

docker run -d --name nginx_80 -p 80:80 \

--add-host host:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') \

--add-host host2:$(/sbin/ip route|awk '/docker0/ { print $9}') \

-e DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') \

-e DOCKER_HOST2=$(/sbin/ip route|awk '/docker0/ { print $9}') \

-v $PWD/www:/tol/nginx/www \

-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:ro \

-v $PWD/conf/conf.d:/etc/nginx/conf.d:ro \

-v $PWD/logs:/var/log/nginx \

--volumes-from php \

-u root nginx

 

容器内部,获取宿主机docker0 IP的方式

1.通过容器host文件

cat /etc/profile

172.17.0.3 host

172.17.0.3 host2

 

2.通过容器环境变量

echo $DOCKER_HOST

打印:172.17.0.3

echo $DOCKER_HOST2

打印:172.17.0.3

 

你可能感兴趣的:(docker)