docker 搭建php环境(踩坑经验!!)
阅读原文时间:2023年08月23日阅读:1

本次安装的推荐配置:

  • nginx 1.24.0
  • mysql 5.7.43
  • php 7.4.3-fpm
  • redis 7.2.0

一、安装虚拟机

vm虚拟机需要4g内存,网络使用nat模式设置静态ip、50G硬盘、1cpu、2核(踩坑经验:太低配置重启后会开不了机)

二、安装centos7

uname -r 查看版本要在3.10以上

更新系统组件 yum -y update

三、安装docker

删除旧docker

yum remove docker docker-common docker-selinux docker-engine

安装工具

yum install -y yum-utils device-mapper-persistent-data Ivm2

配置docker的yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker

sudo yum install -y docker-ce

启动docker

systemctl start docker

设置开机启动

systemctl enable docker

设置镜像国内加速(踩坑经验:设置多个源头,不然会很慢)

sudo mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": [

"https://mirror.ccs.tencentyun.com",

"https://docker.mirrors.ustc.edu.cn/",

"https://hub-mirror.c.163.com/",

"https://reg-mirror.qiniu.com/"

]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

设置容器局域网,容器间相互访问 (心得:容器互相访问,不用通过宿主机,更快)

docker network create my_network

查看局域网是否创建成功

docker network ls

四、安装php

下载php镜像

docker pull php:7.4.3-fpm (踩坑经验:后面要带fpm)

使用镜像生成临时容器 ,名为:test_php7.4.3,用来拷贝配置文件(踩坑经验:空文件夹做共享,会将容器的配置文件清空)

docker run -it --name test_php7.4.3-fpm -d php:7.4.3-fpm 

使用 docker ps 命令查看是否创建成功

创建需要被共享的文件夹

mkdir -p /data/php7.4.3 && cd /data/php7.4.3

将镜像内文件拷贝出来

(左边是容器,会连同文件夹一起复制过去,右边是放进哪个文件夹里)

docker cp [临时容器id]:/usr/local/etc /data/php7.4.3

启动正式容器

docker run  \

--network my_network  \

--name prod_7.4.3-fpm  \

--restart=always  \

-v /data/php7.4.3/etc:/usr/local/etc \

-v /data/nginx1.24.0/html:/var/www/html \

-d php:7.4.3-fpm

备注:--restart=always 重启自动启动容器

没问题后,停止临时镜像,并删除临时镜像

docker stop [临时容器id]

docker rm [临时容器id]

php开通 mysql pdo 扩展,php连接mysql会用到

进入php容器后

查看php扩展模块

php -m

安装扩展

docker-php-ext-install pdo pdo_mysql 

五、安装nginx

下载镜像

docker pull nginx:1.24.0

镜像生成临时容器(用来拷贝配置文件)

docker run -it --name test_nginx1.24.0 -d nginx:1.24.0

使用docker ps  查询是否启动成功

创建需要被共享的文件夹

mkdir -p /data/nginx1.24.0/conf/cert

mkdir -p /data/nginx1.24.0/conf/conf.d

mkdir -p /data/nginx1.24.0/html

mkdir -p /data/nginx1.24.0/log

mkdir -p /data/nginx1.24.0/ssl

将镜像内文件拷贝出来

(左边是容器,会连同文件夹一起复制过去,右边是放进哪个文件夹里)

docker cp [临时容器id]:/etc/nginx/conf.d  /data/nginx1.24.0/conf

docker cp [临时容器id]:/etc/nginx/nginx.conf /data/nginx1.24.0/conf/nginx.conf

docker cp [临时容器id]:/usr/share/nginx/html /data/nginx1.24.0

启动正式容器

docker run  \

--network my_network  \

-p 80:80  \

-p443:443  \

--name prod_nginx1.24.0  \

--restart=always  \

-v /data/nginx1.24.0/conf/nginx.conf:/etc/nginx/nginx.conf \

-v /data/nginx1.24.0/conf/cert:/etc/nginx/cert \

-v /data/nginx1.24.0/ssl:/etc/nginx/ssl/  \

-v /data/nginx1.24.0/conf/conf.d:/etc/nginx/conf.d \

-v /data/nginx1.24.0/log:/var/log/nginx \

-v /data/nginx1.24.0/html:/usr/share/nginx/html \

-d nginx:1.24.0

备注:--restart=always 重启自动启动容器

没问题后,停止临时镜像,并删除临时镜像

docker stop [临时容器id]

docker rm [临时容器id]

六、安装mysql

下载镜像 

docker pull mysql:5.7.43

开启临时镜像(用来拷贝配置文件)

docker run -it --name test_mysql5.7.43 -e MYSQL_ROOT_PASSWORD=root -v /etc/localtime:/etc/localtime:ro -d mysql:5.7.43

创建需要被共享的文件夹

mkdir -p /data/mysql5.7.43  

将镜像内文件拷贝出来

(左边是容器,会连同文件夹一起复制过去,右边是放进哪个文件夹里)

docker cp [临时容器id]:/var/log /data/mysql5.7.43

docker cp [临时容器id]:/var/lib /data/mysql5.7.43

docker cp [临时容器id]:/etc/mysql/conf.d /data/mysql5.7.43

docker cp [临时容器id]:/etc/mysql/mysql.conf.d /data/mysql5.7.43

启动正式容器

docker run  \

--network my_network  \

--name prod_mysql5.7.43  \

--restart=always  \

-p 3306:3306  \

-v /data/mysql5.7.43/log:/var/log \

-v /data/mysql5.7.43/lib:/var/lib \

-v /data/mysql5.7.43/conf.d:/etc/mysql/conf.d \

-v /data/mysql5.7.43/mysql.conf.d:/etc/mysql/mysql.conf.d \

-v /etc/localtime:/etc/localtime:ro \

-e MYSQL_ROOT_PASSWORD=root123456 \

-d mysql:5.7.43

备注:--restart=always 重启自动启动容器

没问题后,停止临时镜像,并删除临时镜像

docker stop [临时容器id]

docker rm [临时容器id]

# 进入容器

docker exec -it [容器id] bash

# 创建用户并开启远程登录

CREATE USER 'user_tp'@'%' IDENTIFIED BY 'user_tp_123456';

# 创建数据库并设置字符集

CREATE DATABASE `tp_test` CHARACTER SET 'utf8mb4';

# 给账号授权数据库

GRANT ALL PRIVILEGES ON `tp_test`.* TO 'user_tp'@'%';

# 刷新权限

FLUSH PRIVILEGES;

使用远程工具连接mysql,并建立一个user用户表,后面用来测试

七、运行php项目

将php项目通过ftp上传到  /data/nginx1.24.0/html (上面配置了这个地址会共享到容器内对应的文件夹)

新增一个网站配置

hosts新增一行 (你的windows电脑)

重启docker

systemctl restart docker

在php项目中,新增一个访问数据库的代码

项目连接mysql

打开浏览器测试

都是踩坑经验,无私分享,有问题欢迎留言,共同进步!