由于数据api需要使用php,之前是借用easyimage容器,本文用docker建立镜像,并生成一个简单的php环境容器。

Dockerfile

不会写,从github上fork了cnrtv/phpserver
Dockerfile内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM php:7.3-fpm-alpine3.11
ADD repositories /etc/apk/repositories
ADD default.conf /
ADD index.php /
ADD run.sh /
ADD php.ini /usr/local/etc/php/
RUN apk update && apk add nginx && \
apk add m4 autoconf make gcc g++ linux-headers && \
docker-php-ext-install pdo_mysql opcache mysqli && \
pecl install -o -f redis \
&& rm -rf /tmp/pear \
&& docker-php-ext-enable redis && \
mkdir /run/nginx && \
mv /default.conf /etc/nginx/conf.d && \
mv /index.php /var/www/html && \
touch /run/nginx/nginx.pid && \
chmod 755 /run.sh && \
apk del m4 autoconf make gcc g++ linux-headers

EXPOSE 80
EXPOSE 9000

ENTRYPOINT ["/run.sh"]

有alpine仓库设置文件repositories,php设置文件php.ini,nginx设置文件default.conf,shell脚本run.sh。还有一个index.php是一个简单文件上传程序。

建立镜像

克隆仓库到本地后,运行:
docker build -t user/phpserver:v1 .
user是用户名,phpserver是镜像名,v1是tag,注意最后有一个”.”。
完成后用docker images查看,已得到一个名为user/phpserver,tag为v1的镜像。

运行容器

docker run -d --name php -p 80:80 user/phpserver:v1
得到一个开放端口为80的php运行环境,可从ip:80访问。
有要测试的php文件,可用docker cp命令复制到容器的/var/www/html/路径下使用。

本身自带的index.php可以上传文件,只是上传完了看不见文件名列表,不方便,不如docker cp和docker exec -it简单粗暴。


容器建立后会出现权限问题,需要进入容器执行以下命令:

1
2
3
4
5
# 正确权限设置示例
chown -R www-data:www-data /var/www/html # Ubuntu/Debian
chown -R nginx:nginx /var/www/html # CentOS/RHEL
chmod -R 755 /var/www/html
chmod 644 /var/www/html/*.php

权限正确的dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
FROM php:7.3-fpm-alpine3.11

# 添加文件
ADD repositories /etc/apk/repositories
ADD default.conf /
ADD index.php /
ADD run.sh /
ADD php.ini /usr/local/etc/php/

RUN apk update && apk add nginx && \
apk add m4 autoconf make gcc g++ linux-headers && \
docker-php-ext-install pdo_mysql opcache mysqli && \
pecl install -o -f redis \
&& rm -rf /tmp/pear \
&& docker-php-ext-enable redis && \
mkdir -p /run/nginx && \
mv /default.conf /etc/nginx/conf.d && \
mv /index.php /var/www/html && \
touch /run/nginx/nginx.pid && \
chmod 755 /run.sh && \
# 设置正确的权限
chown -R www-data:www-data /var/www/html && \
chmod -R 755 /var/www/html && \
find /var/www/html -type f -exec chmod 644 {} \; && \
# 设置nginx运行用户(重要)
sed -i 's/user nginx;/user www-data;/g' /etc/nginx/nginx.conf && \
# 确保/run/nginx目录权限
chown -R www-data:www-data /run/nginx && \
# 清理
apk del m4 autoconf make gcc g++ linux-headers

EXPOSE 80
EXPOSE 9000

ENTRYPOINT ["/run.sh"]

ds的答案,未经测试。