玩转dnmp之port篇

文章简介

在上面一篇文章中,分享过如何搭建和使用dnmp,今天分享如何修改dnmp中PHP容器的端口映射功能。

问题归纳

在PHP容器中,安装了一个swoole扩展,启动了一个server,端口是9501。在安装dnmp中,docker配置中将9501给暴露出来了,按理来说,启动服务之后宿主机就可以正常访问了,但是提示如下信息。

然后尝试去telnet端口号,却发现是测试不通。

 ✘ ert@192  ~  telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

问题排查

第一步,检测PHP容器内的9501端口是否正常启动。发现端口是正常启动的,接下来,看看是不是映射问题。

/www # netstat -anp | grep 9501
tcp        0      0 0.0.0.0:9501            0.0.0.0:*               LISTEN      69511/tools.Master

第二步,查看docker的PHP容器端口映射有哪些。

 ✘ ert@192  ~  docker ps                 
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
68a39b4d38ff        dnmp_php             "docker-php-entrypoi…"   23 hours ago        Up 23 hours         0.0.0.0:9000->9000/tcp, 9501/tcp   php
 ert@192  ~  

发现端口暴露有9000和9501,但是发现9501和9000的却不一样。猜想可能是9501没有给映射出来。接下来,查看docker-compose.yml的端口设置情况,查看到如下代码:

  php:
    build:
      context: ./services/php
      args:
        PHP_VERSION: php:${PHP_VERSION}-fpm-alpine
        CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
        PHP_EXTENSIONS: ${PHP_EXTENSIONS}
        TZ: "$TZ"
    container_name: php
    expose:
      - 9501
    extra_hosts:
      - "www.site1.com:172.17.0.1"
    volumes:
      - ${SOURCE_DIR}:/www/:rw
      - ${PHP_PHP_CONF_FILE}:/usr/local/etc/php/php.ini:ro
      - ${PHP_FPM_CONF_FILE}:/usr/local/etc/php-fpm.d/www.conf:rw
      - ${PHP_LOG_DIR}:/var/log/php
      - ${DATA_DIR}/composer:/tmp/composer
    restart: always
    cap_add:
      - SYS_PTRACE
    networks:
      - default

发现expose设置了9501。于是便查看了一下docker的expose配置项说明。文档如下:

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,

a.一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;

b.另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

总结: docker配置文件中的expose并不是真正的将宿主机的端口和PHP容器的端口做映射。

问题解决

通过上面的分析,发现是实际没做映射,接下来,我们直接修改一下配置文件,重新安装docker容器即可。

第一步:修改如下两个配置文件,一个是.env文件,一个是docker-compose.yml文件。

// .env
# 这里就是需要做映射的端口,多配置即可避免后期需要使用。
PHP_HOST_PORT=9000
PHP_HYPERF1_PORT=9501
PHP_HYPERF2_PORT=9502
PHP_HYPERF3_PORT=9503
// docker-compose.yml
  php:
    build:
      context: ./services/php
      args:
        PHP_VERSION: php:${PHP_VERSION}-fpm-alpine
        CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
        PHP_EXTENSIONS: ${PHP_EXTENSIONS}
        TZ: "$TZ"
    container_name: php
    ports:
# 这里的${xxx}和.env文件一一对应。
      - "${PHP_HOST_PORT}:9000"
      - "${PHP_HYPERF1_PORT}:9501"
      - "${PHP_HYPERF2_PORT}:9502"
      - "${PHP_HYPERF3_PORT}:9503"
    extra_hosts:
      - "www.site1.com:172.17.0.1"
    volumes:
      - ${SOURCE_DIR}:/www/:rw
      - ${PHP_PHP_CONF_FILE}:/usr/local/etc/php/php.ini:ro
      - ${PHP_FPM_CONF_FILE}:/usr/local/etc/php-fpm.d/www.conf:rw
      - ${PHP_LOG_DIR}:/var/log/php
      - ${DATA_DIR}/composer:/tmp/composer
    restart: always
    cap_add:
      - SYS_PTRACE
    networks:
      - default

第二步:删除之前的PHP重启端口

docker stop 68a39b4d38ff && docker rm 68a39b4d38ff

第三步:重新启动PHP容器。

docker-compose up php

此时,就重新启动了一个PHP容器了,并且容器的端口也做好映射了。

 ert@192  ~  docker ps                           
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
68a39b4d38ff        dnmp_php             "docker-php-entrypoi…"   23 hours ago        Up 23 hours         0.0.0.0:9000->9000/tcp, 0.0.0.0:9501-9503->9501-9503/tcp   php

测试效果

此时,我们启动PHP容器对应的9501端口服务。访问,结果如下:

这说明我们的端口映射成功了。接下来,我们进入NGINX容器配置一个反向代理,直接通过域名访问对应的端口。

upstream travelApi {
	# 这里的php直接写PHP容器的名称即可。
	发现协程127.0.0.1是不行的,因为访问的是容器内部的端口,
	如果不通过容器访问,则直接宿主机的IP,但是IP可能会变动,则写容器名比较合适。
	server php:9501;
}
server {
	listen 80;
	server_name travel_api.com;
	location / {
        	proxy_set_header Host $http_host;
        	proxy_set_header X-Real-IP $remote_addr;
        	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       		proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";
        	proxy_pass http://travelApi;
    }
}

将对应的域名写入到宿主机的host文件,进行访问,效果如下:

说明我们的反向代理也配置成功了。

问题总结

1.docker中的expose不是做端口映射,而仅仅是声明端口。

2.容器之间监听端口,建议使用容器名称,如NGINX中的反向代理配置。

本文分享自微信公众号 - 卡二条的技术圈(qq1005349393),作者:浪子编程走四方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • docker搭建环境如何配置端口

    在上面一篇文章中,分享过如何搭建和使用dnmp,今天分享如何修改dnmp中PHP容器的端口映射功能。

    A梦多啦A
  • 如何使用docker搭建PHP环境

    在前面几篇文章中,我们使用dnmp搭建了一个完整的docker开发环境。这篇文章接着分享如何在dnmp的基础上搭建一个自定义的PHP容器,实现多版本的PHP容器...

    A梦多啦A
  • 玩转dnmp之自定义容器

    在前面几篇文章中,我们使用dnmp搭建了一个完整的docker开发环境。这篇文章接着分享如何在dnmp的基础上搭建一个自定义的PHP容器,实现多版本的PHP容器...

    A梦多啦A
  • docker搭建环境如何配置端口

    在上面一篇文章中,分享过如何搭建和使用dnmp,今天分享如何修改dnmp中PHP容器的端口映射功能。

    A梦多啦A
  • 【请您听我说】PHP语法特点的一些看法

    一、基本认识   PHP是干什么的?百度百科上提到说:PHP就是一门脚本语言,开发用的,相信这个你们只要去搜一下,就会有一大堆关于PHP概念的解释。   相信我...

    Angel_Kitty
  • 24h限免!37G PHP教程大全,从网页开发到项目实战到面经大放送!

    很多技术人喜欢这么调侃,包括真的喜欢PHP的、不用PHP的甚至是一些不喜欢PHP的。

    养码场
  • PHP技能树—大神的进阶之路

    沈唁
  • 【问底】徐汉彬:PHP7和HHVM的性能之争

    【导读】徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设。最近,PHP7...

    CSDN技术头条
  • PHP 7终于发布:开发者会选择PHP 7吗?

    大家可以通过阅读本文,学习关于PHP7.0的五个方面的内容:PHP7.0简介、主要新特性、过去几周关于程序员是否采用php7.0的意愿调查结果、以上调查结果的分...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券