Docker和容器之间的连接

我正在尝试在Docker的容器之间build立连接。 一个容器用php5-fpm,另一个容器用nginx

configuration为php5-fpm默认,只是几个变化:

listen = 9000 listen.allowed_clients = 

和nginx(/ etc / nginx / sites-available / default):

 server { listen 80 default_server; #listen [::]:80 default_server ipv6only=on; root /var/www/testing; index index.php # Make site accessible from http://localhost/ server_name localhost; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini #fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_pass 192.168.1.2:9000; fastcgi_index index.php; include fastcgi_params; } } 

然后我试图创build与https://github.com/jpetazzo/pipework连接,这就是为什么fastcgi_pass 192.168.1.2:9000; 。我尝试从容器直接IP,但没有。

当我试图与l open打开页面我有BadGateway。

我试过后端口MASTER_PORT = $(sudodocker端口$ MASTER_ID 9000),但没有…平安没有问题。 Telnet到nginx的端口9000保持打开几秒钟,然后“连接closures…”

谁能解释我做错了什么? 谢谢!

/ 编辑 /我试图改变fastcgi_pass 172.17.42.1:9000; (主机上的docker0的地址),然后在主机上启动tcpdump:

tcpdump -i docker0端口9000

我有:

 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on docker0, link-type EN10MB (Ethernet), capture size 65535 bytes 10:24:54.529572 IP 172.17.0.20.40932 > 172.17.42.1.9000: Flags [S], seq 141160046, win 14600, options [mss 1460,sackOK,TS val 1235770 ecr 0,nop,wscale 7], length 0 10:24:54.529594 IP 172.17.42.1.9000 > 172.17.0.20.40932: Flags [S.], seq 2944341886, ack 141160047, win 14480, options [mss 1460,sackOK,TS val 1235770 ecr 1235770,nop,wscale 7], length 0 10:24:54.529605 IP 172.17.0.20.40932 > 172.17.42.1.9000: Flags [.], ack 1, win 115, options [nop,nop,TS val 1235770 ecr 1235770], length 0 10:24:54.530324 IP 172.17.0.20.40932 > 172.17.42.1.9000: Flags [P.], seq 1:665, ack 1, win 115, options [nop,nop,TS val 1235771 ecr 1235770], length 664 10:24:54.530387 IP 172.17.42.1.9000 > 172.17.0.20.40932: Flags [.], ack 665, win 124, options [nop,nop,TS val 1235771 ecr 1235771], length 0 10:24:54.530534 IP 172.17.42.1.44233 > 172.17.0.12.9000: Flags [S], seq 1354597292, win 14600, options [mss 1460,sackOK,TS val 1235771 ecr 0,nop,wscale 7], length 0 10:24:54.530549 IP 172.17.0.12.9000 > 172.17.42.1.44233: Flags [R.], seq 0, ack 1354597293, win 0, length 0 10:24:54.531044 IP 172.17.42.1.9000 > 172.17.0.20.40932: Flags [R.], seq 1, ack 665, win 124, options [nop,nop,TS val 1235771 ecr 1235771], length 0 

因此数据包在容器之间…但为什么BadGateway?

从docker 0.6.5开始,你不需要这种场景的管道,你可以使用新的容器链接功能。 基本上,你告诉码头从一个容器提供一个端口到另一个容器。

这也很容易做到。

你想要做的是有一个php5-fpm容器(让我们叫这个容器php5-fpm )配置为监听端口9000,并运行它像这样:

 docker run -d -p 9000 -name php php5-fpm /usr/sbin/php5-fpm -F 

我们使用-F标志运行php5-fpm ,这样它就不会守护进程了。 正如你所看到的,我们使用-name来明确地命名我们的容器。 我们将使用这个名字在我们要用nginx容器创建的链接中引用它。

然后你可以运行你的nginx(叫做nginx )容器:

 docker run -i -t -link php:php nginx /bin/bash 

-link选项告诉docker在别名php下连接php容器。 别名是强制性的。

我们现在在我们的nginx容器中有一个shell,我们可以使用env命令来检索php5-fpm容器的映射IP和端口:

 root@061fe34bd07b:/# env HOSTNAME=061fe34bd07b TERM=xterm PHP_PORT=tcp://172.17.0.44:9000 PHP_PORT_9000_TCP_PROTO=tcp PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/etc/nginx/sites-enabled PHP_PORT_9000_TCP_PORT=9000 SHLVL=1 HOME=/ PHP_PORT_9000_TCP=tcp://172.17.0.44:9000 PHP_NAME=/crimson_squirrel9/php DEBIAN_FRONTEND=noninteractive PHP_PORT_9000_TCP_ADDR=172.17.0.44 container=lxc OLDPWD=/ _=/usr/bin/env 

这里有许多有趣的环境变量。 我们正在寻找的是PHP_PORT ,因为它提供了有关链接容器的最完整的信息:

 PHP_PORT=tcp://172.17.0.44:9000 

你现在可以配置nginx的php5-fpm上传到172.17.0.44:9000,启动它,并检查它的工作原理:

 /etc/init.d/nginx start curl http://127.0.0.1/index.php 

瞧! 我跳过容器的配置和配置,因为你似乎已经得到了这个权利;)

链接到官方链接教程,使用redis: http : //docs.docker.io/en/latest/examples/linking_into_redis/

这个问题是非常古老的,但它在谷歌出现高,让我发表一个答复。

我有同样的问题,虽然我得到一个“文件没有找到”。 在不同的容器中使用PHP-fpm和Nginx是有问题的,因为Nginx发送的是php-fpm所要执行的php文件的位置,而不是文件。 所以文件必须存在于两个容器中。

看到我的问题

使用nginx / php5-fpm设置,当php5-fpm没有运行时,我收到了错误的网关错误。 那么,你确定php-fpm正在你的其他容器中运行吗? 我注意到,php-fpm将会死在一个容器中,除非我用命令行中的-D选项运行它。 所以

  ~$: php5-fpm -D 

我也运行我的nginx服务器的daemon off; 设置,以确保nginx不自我守护进程,否则在nginx进程完成执行后,docker将终止该容器。 然而,既然你已经从nginx获得了一个坏的网关响应,这或者不是你的问题,或者你已经在你的nginx配置中考虑了它。

这可能会解决这个问题:

 listen = [::]:9000 ;listen.allowed_clients = 

这应该允许任何客户端连接到PHP-FPM容器。 关键是我在官方PHP Docker仓库中找到了“[::]:”。

推理

PHP-FPM有一个listen.client_allowed设置,允许你设置一个可以连接的IP列表,或者为任何IP连接留空。 但是,即使留空,问题依然存在。 挖掘官方的PHP-FPM回购协议,我发现你还需要设置listen = [::]:9000 ,然后开始允许任何IP连接。