Skip to main content

Docker部署PHP开发环境

安装步骤记录

拉取镜像

# 查看当前镜像
docker images
# 删除镜像
docker rmi d1165f221234
# 拉取需要的镜像
docker pull php:7.2-fpm
docker pull mysql:5.7
docker pull nginx
docker pull redis

运行镜像容器

创建网络

# 查看网络相关命令
docker network
# 查看当前添加的网络
docker network ls
# 查看网络详细信息
docker network inspect 20df25ce54d8
# 创建一个网络
docker network create php-network
# 删除一个网络
docker network rm [NETWORK ID]

运行php-fpm

docker run -d --name php7.2 --net=php-network --restart=always --privileged -p 9000:9000 -v d:/wwwroot:/var/www/html -v d:/docker/php7.2/php.ini:/usr/local/etc/php/php.ini:ro -v d:/docker/php7.2/fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw php:7.2-fpm

运行php-fpm7.4

docker run -d --name php7.4 --net=php-network --restart=always --privileged -p 9001:9000 -v d:/wwwroot:/var/www/html -v d:/docker/php7.4/php.ini:/usr/local/etc/php/php.ini:ro -v d:/docker/php7.4/fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw php:7.4-fpm

运行Nginx

docker run -d --name nginx --restart=always --privileged --network php-network --link php7.2:php7.2 -p 80:80 -v d:/docker/nginx/conf.d:/etc/nginx/conf.d -v d:/wwwroot:/usr/share/nginx/html -v d:/wwwlogs:/var/log/nginx nginx

运行Redis

docker run -itd --network php-network --restart=always --network-alias redis --name redis -p 16379:6379 redis

运行mysql

# 查看数据卷
docker volume ls

# 创建数据卷
docker volume create --name mysql-volume

# 运行Mysql
docker run -d -p 13301:3306 --net=php-network -v mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7

容器操作

# 查看容器列表
docker ps -a

# 启动/停止/重启容器
docker [start|stop|restart] [CONTAINER ID]

# 删除容器
docker rm [CONTAINER ID]

安装php扩展

构建带扩展的镜像 Dockerfile

######
# See: https://hub.docker.com/_/php/
######

FROM php:7.2-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& docker-php-ext-install exif \
&& docker-php-ext-enable exif \
&& docker-php-ext-install pcntl \
&& docker-php-ext-enable pcntl \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-enable pdo_mysql

构建新的镜像

# 在Dockerfile 所在的目录
docker build -f Dockerfile -t php7.2-ext:0.1 .

单独安装扩展的教程

#进入容器
docker exec -it php7.2 /bin/bash
cd /user/local/bin/

# 查看能安装的扩展,如果没有的话可以先运行下面的命令
ls -l /usr/src/php/ext
docker-php-source extract

# 安装pdo_mysql 扩展
docker-php-ext-install pdo_mysql

# 安装mysqli扩展
docker-php-ext-install mysqli

# 安装 zip 扩展
apt update
apt install libzip-dev
docker-php-ext-install zip

# 安装mbstring扩展
docker-php-ext-install mbstring

# 安装 reids 扩展
pecl install redis

Nginx配置文件

配置文件内容

user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
fastcgi_intercept_errors on;

include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

# upstream php_server{
# server php7.2:9000 weight=50;
# server php7.2:9000 down;
# server php7.2_1:9002 backup; # 备用服务器,当出现其他服务器繁忙或宕机时,才会请求该服务器进行工作。
# #server 192.168.6.63 weight=100 fail_timeout=30s max_fails=2; # max_fails 请求失败的次数,当达到该值时,认为该服务器不用使用。
# ip_hash; #使用hash算法为每个客户端计算一个对应处理的服务器,能保持客户端与服务端的 session 会话(该session一般保存在服务器上,.net中该session可以放入一些用户的信息等)。
# }

include /etc/nginx/conf.d/*.conf;
}

Yii框架项目配置文件

server{
listen 80;
server_name www.lmkwxwork.com;
root /usr/share/nginx/html/lmk/wechat_work/web;
index index.php index.html index.htm;
autoindex on;

if (!-e $request_filename) {
rewrite ^/index.php(.*)$ /index.php?s=$1 last;
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}

error_page 500 502 503 504 = /500.html;

#location ~ [^/]\.php(/|$){
# # comment try_files $uri =404; to enable pathinfo
# try_files $uri =404;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# include fastcgi_params;
# #include pathinfo.conf;
# }

location ~ \.php$ {
#location ~ [^/]\.php(/|$){
root /var/www/html/lmk/wechat_work/web;
fastcgi_pass php7.2:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)?$
{
expires 12h;
}

access_log /var/log/nginx/www.lmkwxwork.com.access.log main;
error_log /var/log/nginx/www.lmkwxwork.com.error.log warn;
}

TP5程序配置文件

server {
listen 80;
server_name z012.website.com;
root /usr/share/nginx/html/z012.website.com/public; #静态资源访问这个路径
index index.php index.html;
#autoindex on;

location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}


location ~ [^/]\.php(/|$)
{
root /var/www/html/z012.website.com/public; # PHP脚本访问这个路径



#try_files $uri =404;


fastcgi_pass php7.2:9000;
fastcgi_index index.php;

set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;


#fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
include fastcgi_params;
}


location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
error_log off;
access_log /dev/null;
}

location ~ .*\.(js|css)$ {
expires 12h;
error_log off;
access_log /dev/null;
}

access_log /var/log/nginx/z012.website.com.access.log main;
error_log /var/log/nginx/z012.website.com.error.log warn;
}

开放指定端口

# 查看某容器的ip
docker inspect php7.2
# 开放端口
# 安装 iptables
apt-get install iptables

#/sbin/iptables -I INPUT -p tcp --dport 23 -j ACCEPT
#/etc/rc.d/init.d/iptables save
#/etc/init.d/iptables restart
#/etc/init.d/iptables status

安装MongoDB

# 拉取镜像
docker pull mongo:4.4

# 运行容器
docker run -itd --name mongo --restart=always -p 27017:27017 mongo:4.4 --auth

# 进入数据库
docker exec -it mongo mongo admin

# 创建账号
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

db.createUser({user:'lmkscrm', pwd:'lmkscrm', roles:[{role:'dbOwner', db:'lmkscrm'}]})

最新创建容器记录

# 构建自己的镜像
docker build -f Dockerfile -t php7.2-ext:0.1 .

# 运行redis容器
docker run -itd --net=custom-network --restart=always --network-alias redis --name redis -p 16379:6379 redis

# 运行php7.2容器
docker run -d --name php7.2 --net=custom-network --restart=always --privileged -p 9000:9000 -v d:/www/wwwroot:/var/www/html -v d:/www/docker/php7.2/php.ini:/usr/local/etc/php/php.ini:ro -v d:/www/docker/php7.2/fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw php7.2-ext:0.1

# 运行nginx容器
docker run -d --name nginx --restart=always --privileged --net=custom-network --link php7.2:php7.2 -p 80:80 -p 8080:8080 -v d:/www/docker/nginx/conf.d:/etc/nginx/conf.d -v d:/www/wwwroot:/usr/share/nginx/html -v d:/www/wwwlogs:/var/log/nginx nginx

# 运行mysql容器
docker run -d -p 13301:3306 --restart=always --net=custom-network -v mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7

# 运行mongo容器
docker run -itd --name mongo --restart=always --net=custom-network -p 27017:27017 mongo:4.4 --auth

# php安装mongodb扩展
apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev
pecl install mongodb

自定义php镜像配置文件

######
# See: https://hub.docker.com/_/php/
######

FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2/ \
&& docker-php-ext-install -j$(nproc) gd \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& docker-php-ext-install bcmath \
&& docker-php-ext-enable bcmath \
&& docker-php-ext-install exif \
&& docker-php-ext-enable exif \
&& docker-php-ext-install pcntl \
&& docker-php-ext-enable pcntl \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-enable pdo_mysql
# 运行php容器
docker run -d --name php7.4 --net=custom-network --restart=always --privileged -p 9001:9000 -v d:/www/wwwroot:/var/www/html -v d:/www/docker/php7.4/php.ini:/usr/local/etc/php/php.ini:ro -v d:/www/docker/php7.4/fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw php7.4-ext:0.1

改错文件容器无法启动

问题原因:

登录到mysql容器的bash中,使用vi编辑器修改mysql的配置。 由于配置文件修改错误导致mysql容器无法启动。 mysql容器无法启动,所以没办法修复配置文件。

解决办法:

将配置文件拷贝到主机,修改后再拷贝回容器

# 拷贝文件出容器
docker cp /etc/my.cnf .

# 拷贝文件进容器
docker cp my.cnf /etc/my.cnf

Docker无法启动

# 运行命令,之前Docker所有的镜像和容器都会清空
NoLsp.exe C:\Windows\System32\wsl.exe

设置容器自动启动

# 启动时加 --restart=always

# 如果已经启动的项目,则使用update更新
docker update --restart=always mysql
docker update --restart=always redis