php docker 容器配置与端口映射关系

服务器迁移

昨天下午开始做服务器迁移。迁移一个门户网站,包括前端以及一个数据库和php后端,标准的网站架构,要迁移到一台比较干净的服务器。

新服务器除了另外一个人部署的docker、nginx以外,就没有我们需要的东西了,拉好MySQL镜像,迁移好数据库,把前后端代码打包发送到服务器,配置好nginx,准备工作告一段落。

前端部分可以独立于后端,单独运行,先后顺序也就没那么重要,三两下配置结束。

此时,域名已经可以访问,证书一切正常,接下来就是后端部署了,大坑就在眼前。

服务器信息

环境配置:linux CentOS7、docker、mysql5.7、php 7.3.5-fpm、nginx

配置php容器

前面说到数据库已经迁移完毕,通过隧道测试,本地连接正常。接下来直接拉取php镜像

docker pull php:7.3.5-fpm

然后生成容器

docker run -itd -p 19000:9000 -v /home/yomi-customer/im-chat:/var/www/html -v /home/yomi-customer/im-chat/vagrant/im-php:/usr/local/etc/php -d 1b1a57654cda

因为9000端口被占用,所以我映射到19000端口,而此时,php服务已经启动,我事先已经配好nginx,所以可以直接访问接口:
 

 location ~ \.php$ {
                fastcgi_pass 127.0.0.1:19000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /var/www/html/im-portal/public$fastcgi_script_name;
                include fastcgi_params;
        }

然后,接口报错了.....

"file_put_contents(/var/www/html/im-portal/storage/framework/cache/data/11/ff/11ffe826569e3b6f1e296da7924f228bc0c3b482): failed to open stream: No such file or d

但是不慌,意料之中,众所周知laravel有一个目录总需要开启权限,根据提示信息来,哪个没权限开哪个:

sudo chmod -R 777 im-portal/storage/

# 进入容器

sudo docker exec -it im-portal-php /bin/bash

# 进入项目文件夹,在docker内开启权限

chmod -R 777 storage

 接下来再试,果然没有刚才的报错了,但是新的问题出现了....

could not find driver (SQL: select * from `packageLinks` where `id` = 1 limit 1)"

不慌,依旧在意料之中,进入php容器,查看php扩展安装情况

# 进入容器 

sudo docker exec -it im-portal-php /bin/bash

# 查看扩展

php -m

 结果如下:

ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

熟悉的同学一眼就能看出来,我门缺了连接mysql的关键扩展pdo_mysql,缺啥装啥:

docker-php-ext-install pdo_mysql

docker-php-ext-install pdo_pgsql

docker-php-ext-install pdo_sqlite

如果安装成功,php -m 就能看到新增的扩展名称了,这时候记得重启容器,如果没成功.....

可以看看我的报错:

Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20180731/ /usr/local/bin/docker-php-ext-enable: 108: /usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent

这边的意思是:PHP 扩展安装脚本无法创建目标目录,这可能是由于目录不存在 。

那么直接在相应的目录下手动创建目录

mkdir -p /usr/local/etc/php/conf.d

之后顺利安装,重启容器,出来一看,emmm,漂亮!还是不行......

php扩展已经没问题了,接下来的问题只能是代码配置的问题了,这是我的部分配置文件:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=13306
DB_DATABASE=*****
DB_USERNAME=root
DB_PASSWORD=********

之前提过,通过隧道连接测试数据库正常,因此再度排除数据库问题,那么就是两个容器间的通讯问题了。

确定了方向后,我尝试直接用容器ip连接——不行,容器名称连接——不行。

到这里,我觉得可能是我没有配置docker网络的原因。因此,我把这两个容器删除重装(幸好数据、配置文件都有映射出来)

docker stop im-portal-php im-portal-mysql

docker rm im-portal-php im-portal-mysql

# 创建自定义网络

docker network create mynetwork

# 重新生成容器

docker run -d --name im-portal-php --network mynetwork -p 19000:9000 im-portal-php

docker run -d --name im-portal-mysql --network mynetwork -p 13306:3306 -e MYSQL_ROOT_PASSWORD=******* mysql:5.7

然后,新的容器,新的报错

SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `packageLinks` where `id` = 1 limit 1)

因为我本地通过隧道能够正常访问,所以再次排除数据库的问题,经检查,php必要的扩展也已经就绪,所以.....一时半会我真不知道问题在哪,愣了好久,中间又写了测试脚本测试连接,结果脚本也不行。

过了好久,才反应过来,laravel中,项目访问数据库是通过php去访问的,所以这两个容器之间的连接首先指向必须明确。

比如这个项目,nginx在宿主机,php和mysql在容器内,它们分别映射端口到宿主机,使得宿主机能够通过映射的端口访问对应的服务,因此,一开始的配置设置端口为宿主机的13306端口,是正确的。

但是,该后端项目中需要通过php访问数据库,相当于从php容器内部访问外部的13306端口,而在php容器的创建中我并没有指定php容器的13306端口映射,因此,无法访问。

到这里,问题已经初现端倪,那么修改起来也很简单,php容器增加13306端口映射即可,或者像我一样,直接使用3306端口连接,因为linux系统中类似80、443、9000、3306这些端口默认都是开放的,所以尽管我们没有指定端口映射,但是依旧能够使用3306端口访问,前提是没被占用。

这是修改后的配置:

DB_CONNECTION=mysql
DB_HOST=im-portal-mysql
DB_PORT=3306
DB_DATABASE=*****
DB_USERNAME=root
DB_PASSWORD=********

接口测试一切正常,大功告成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker是一个容器化平台,可以让你轻松地创建、部署和运行应用程序。在Docker中,每个应用程序都被打包成一个容器,这个容器包含了应用程序所依赖的所有文件和配置,从而保证了应用程序的可移植性和可靠性。 如果你想在Docker中运行一个PHP网站,你需要创建一个Docker镜像,这个镜像包含了PHP解释器、Web服务器、PHP扩展以及你的网站代码和配置文件。你可以使用Dockerfile来定义这个镜像的构建过程,然后使用Docker build命令构建镜像。一旦镜像构建完成,你可以使用Docker run命令启动容器并运行你的PHP网站。 以下是一个简单的Dockerfile示例,用于构建一个基于Apache和PHP的镜像: ``` FROM php:7.4-apache # 安装PHP扩展 RUN docker-php-ext-install mysqli pdo_mysql # 将网站代码复制到容器中 COPY ./src/ /var/www/html/ ``` 在上面的Dockerfile中,我们首先从官方的PHP 7.4 Apache镜像中构建我们的镜像。然后安装了mysqli和pdo_mysql扩展。最后将我们的网站代码复制到容器中的/var/www/html/目录下。 构建镜像的命令: ``` docker build -t my-php-website . ``` 在上面的命令中,我们指定使用当前目录下的Dockerfile来构建镜像,镜像的名称为my-php-website。 启动容器的命令: ``` docker run -p 80:80 my-php-website ``` 在上面的命令中,我们指定将容器中的80端口映射到主机的80端口,并使用my-php-website镜像启动容器。 这样,你就可以访问localhost或者主机的IP地址来访问你的PHP网站了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值