- 因为自己的一些奇怪的需求,希望在php中能够调用python3文件,而官方并没有含有python3环境的php镜像
- 一开始是直接进入已经启动了的php容器中通过apt-get安装,但是这么做如果有一天remove了这个容器,那么就得重头再来一遍
- 长痛不如短痛,那就直接构建好镜像吧
准备
1.一台服务器
2.已安装好docker,可参考这里:centos7安装docker及相关配置 进行安装
3.我原来采用的是nginx+php-fpm来运行php,要先确保自己的nginx已进行了相关配置
创建Dockerfile
随便找个地方用于放Dockerfile
# 创建文件夹
sudo mkdir -p /data/dockerfiles/php7-python3
# 创建Dockerfile,我习惯用nano =。=
sudo nano /data/dockerfiles/php7-python3/Dockerfile
编写php + python Dockerfile
我将要构建的镜像希望同时有php和python3环境,所以基于php:7.2-fpm进行构建,在安装python的pip时踩了一些坑,下面注释掉的就是用传统方式安装,但是会报错No module named 'distutils.util'
,最后找到apt-get install -y python3-pip
可以安装,后续又踩了一些坑,多次尝试后,终于构建成功了
现在把下面的内容复制到Dockerfile中就可以了,如果有需要安装其他模块,可以在后面追加pip3 install -U xxxxxx
FROM php:7.2-fpm
MAINTAINER ying
RUN apt-get update \
&& echo "\033[34m apt-get update finished \033[0m" \
# Install python3
&& apt-get install -y python3 \
&& echo "\033[34m install python3 finished \033[0m" \
# Install pip
#&& apt-get install -y wget \
#&& wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py \
#&& python3 /tmp/get-pip.py \
&& apt-get install -y python3-pip \
&& echo "\033[34m install python3-pip finished \033[0m" \
&& pip3 install --upgrade pip \
&& echo "\033[34m upgrade pip finished \033[0m" \
# Install other libs
&& pip3 install -U -i https://pypi.tuna.tsinghua.edu.cn/simple/ requests \
&& echo "\033[34m pip3 install requests finished \033[0m" \
&& pip3 install -U -i https://pypi.tuna.tsinghua.edu.cn/simple/ numpy \
&& echo "\033[34m pip3 install numpy finished\033[0m" \
安装镜像
注意要先cd到Dockerfile所在目录,然后再执行docker build,别忘了后面有个点
sudo cd /data/dockerfiles/php7-python3
sudo docker build -t php7/python3 .
有时候可能会因为网络原因超时而失败,可以多试几次或者看控制台输出来判断失败原因,我在Dockerfile中每一步完成也都有echo
启动
成功构建后就可以通过下面的命令启动了~
docker run -itd --name myphp -v /data/php:/www --restart=always -m 110m -p 9000:9000 php7/python3
附上相关参数说明
# 后台运行
-itd
# 本地文件夹映射到容器内文件夹
-v /data/php:/www
# 限制内存使用110m
-m 110m
# 外部暴露端口映射到容器内端口
-p 9000:9000
# 命名
--name myphp
# 万一容器挂了自动重启
--restart=always
测试
尝试下php调用python文件
python代码testPython. py:
print("hello!This is testPython.py")
php代码testPHP.php:
<?php
// system()和exec()均可执行外部程序
// 区别在于system()会直接打印被调用文件执行的打印的内容
// exec()会在执行完毕后将结果返回保存到$output
//$output = system('python3 testPython.py');
$output = exec('python3 testPython.py');
echo $output.'<br/>';
echo 'success'
?>
浏览器访问xxx/xxx/testPHP.php
成功~