Docker:使用套接字在两个容器之间进行通信

13

我有两个 Docker 容器:App 和 Web。

App 是一个简单的容器,包含 PHP 应用程序代码。它仅用于存储并将代码传输到远程Docker主机。

App 镜像的 Dockerfile:

FROM debian:jessie
COPY . /var/www/app/
VOLUME ["/var/www/app"]
CMD ["true"]

Web是一个Web服务容器,由PHP-FPM + Nginx组成。

Web镜像的Dockerfile:

FROM nginx

# Remove default nginx configs.
RUN rm -f /etc/nginx/conf.d/*

# Install packages
RUN apt-get update && apt-get install -my \
  supervisor \
  curl \
  wget \
  php5-cli \
  php5-curl \
  php5-fpm \
  php5-gd \
  php5-memcached \
  php5-mysql \
  php5-mcrypt \
  php5-sqlite \
  php5-xdebug \
  php-apc

# Ensure that PHP5 FPM is run as root.
RUN sed -i "s/user = www-data/user = root/" /etc/php5/fpm/pool.d/www.conf
RUN sed -i "s/group = www-data/group = root/" /etc/php5/fpm/pool.d/www.conf

# Pass all docker environment
RUN sed -i '/^;clear_env = no/s/^;//' /etc/php5/fpm/pool.d/www.conf

# Add configuration files
COPY config/nginx.conf          /etc/nginx/
COPY config/default.vhost        /etc/nginx/conf.d
COPY config/supervisord.conf    /etc/supervisor/conf.d/
COPY config/php.ini             /etc/php5/fpm/conf.d/40-custom.ini

VOLUME ["/var/www", "/var/log"]

EXPOSE 80 443 9000

ENTRYPOINT ["/usr/bin/supervisord"]

我的问题是:是否可以通过套接字将Web容器和应用程序容器连接起来?

主要原因是使用应用程序容器将更新的代码部署到远程Docker主机。使用卷/命名卷共享容器之间的代码并不是一个好主意,但是套接字可以帮助解决这个问题。

非常感谢您的帮助和支持!


2
我相信你可以将套接字放置在卷内进行共享。你甚至可以将其作为主机上的单个文件并将该文件共享为卷。 - BMitch
非常感谢您的回答! - Alex Fatyeev
1个回答

21

如果两个Docker容器在同一主机上运行,它们可以共享套接字,因为套接字是普通文件。

您可以创建本地Docker卷并将该卷挂载到两个容器上。然后配置您的程序以使用该路径。

docker volume create --name=phpfpm
docker run phpfpm:/var/phpfpm web
docker run phpfpm:/var/phpfpm app

如果可以在主机上生成套接字,则可以将文件挂载到两个容器中。这是用于使Docker容器控制主机Docker的方法。

docker run -v /var/container/some.sock:/var/run/some.sock web
docker run -v /var/container/some.sock:/var/run/some.sock app

1
Matt,非常感谢您的回答! 我做到了。 但是我并不完全理解Web容器如何通过位于公共卷中的socket访问App容器中的文件。 从Web容器中的FPM如何知道文件位于App容器的指定文件夹中?对于我的愚蠢问题,我感到很抱歉,因为我是新手,不太熟悉通过socket进行数据交换。我真的很想理解这个问题。 - Alex Fatyeev
共享套接字只允许两者之间的通信。因此,fpm侦听套接字,nginx通过套接字向fpm发送请求。网站的任何文件都需要在Web容器中,PHP应用程序的任何文件都需要在应用程序容器中。你想要做什么? - Matt
谢谢你的帮助! 我正在尝试在一个单独的容器应用程序中编写一个网站代码,并将其与nginx + fpm容器web链接起来,而不使用卷。即, Web - 只有nginx + php-fpm的容器。没有任何网站代码。只有web服务器和解释器。 App - 只有网站数据的容器:php,html,css,js。仅用于交付和存储代码。 我需要它来进行进一步的部署过程:
  • 重新构建只包含网站代码(App)的镜像和容器
  • 将其交付给Docker主机,并将旧的App更改为新的App。
- Alex Fatyeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接