前言
需要把一个老的项目从Windows Server 2008迁移到CentOS8 Stream中,为了快速迁移过去,就使用Docker来部署。
吐槽:当然使用宝塔更快,但是要求是不能用。
准备工作
迁移项目
我把原项目放在/srv/www/xxx目录中。
mkdir -p /srv/www/xxx
# 设置目录权限
# 因为我已经部署过了,所以知道:
# php:7.2.4-fpm服务使用的是用户是www-data,uid为33,用户组是www-data,gid为33
# 而nginx也有www-data用户,uid也为33,也有用户组www-data,gid也为33,但它默认不是用的www-data,需要在配置中修改下。
# 而宿主机中,没有www-data用户,uid为33的也没有被占用,但是gid为33已经被占用了。
# 所以需要先创建相应用户
# 宿主机中默认的gid为33的用户组是tape,家目录可以直接设为“/”,我是为了后续可能使用sftp
useradd -u 33 -g tape -s /sbin/nologin -d /var/empty/www-data www-data
# 再修改项目目录权限
chown -R www-data:tape /srv/www
拉取需要的服务
docker pull nginx
docker pull php:7.2.4-fpm
docker pull mysql:5.5.57
创建容器间通信网络
docker network create web
创建nginx容器
可以把nginx的配置文件、日志文件和证书提前放在宿主机中,然后挂载到容器上。
# 创建挂载目录
mkdir -p /var/docker/nginx
# 复制证书
mv cert /var/docker/nginx
# 创建nginx.conf
vi /var/docker/nginx/nginx.conf
# 创建nginx容器
docker run -p 80:80 --name nginx -v /etc/localtime:/etc/localtime:ro -v /srv/www:/srv/www:ro -v /var/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /var/docker/nginx/logs:/etc/nginx/logs -v /var/docker/nginx/cert:/etc/nginx/cert --network web --network-alias nginx -d nginx
nginx.conf示例文件
user www-data; # 需要确认容器中存在此用户
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# another virtual host using mix of IP-, name-, and port-based configuration
#
server {
listen 80;
server_name www.xxx.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
# HTTPS server
#
server {
listen 443 ssl;
server_name www.xxx.com;
# nginx容器中项目的根目录
root /srv/www/xxx/public;
# 证书
ssl_certificate /etc/nginx/cert/www.xxx.com.crt;
ssl_certificate_key /etc/nginx/cert/www.xxx.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
access_log logs/xxx.access.log;
error_log logs/xxx.error.log;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
error_page 404 /index.php;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
# 这里用的是php-fpm容器在网络地址的别名,也可以直接写ip地址,使用docker network inspect web查看
fastcgi_pass php-fpm:9000;
# /var/www/html/public/ 是php-fpm容器中index.php的路径
fastcgi_param SCRIPT_FILENAME /var/www/html/xxx/public/$fastcgi_script_name;
include fastcgi_params;
}
}
}
创建php-fpm容器
因为此容器默认就是使用的www-data所以不用去修改它的配置。
docker run --name php-fpm -v /etc/localtime:/etc/localtime:ro -v /srv/www:/var/www/html --network web --network-alias php-fpm -d php:7.2.4-fpm
进入容器添加php扩展
docker exec -it php-fpm /bin/bash
# 从容器中提供的tar源码包,把php源码解压出来
docker-php-source extract
# 安装想要的扩展
docker-php-ext-install pdo_mysql
# 确认安装成功后,删除解压的源码包
docker-php-source delete
说明: 我安装的时候并没有解压源码,但是也安装成功了,难道是常用扩展在容器中已经提供了源码?反正它Docker Hub中是这样要求的。
修改Laravel框架的数据库连接配置
vi /srv/www/xxx/.env
# DB_CONNECTION=mysql
# DB_HOST=mysql # 这是mysql设置的网络别名
# DB_PORT=3306
# DB_DATABASE=xxx
创建MySQL容器
# 创建挂载文件
mkdir -p /var/docker/mysql
# 创建容器
docker run --name mysql -v /etc/localtime:/etc/localtime:ro -v /var/docker/mysql/logs:/logs -v /var/docker/mysql/data:/var/lib/mysql --network web --network-alias mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
迁移xxx.sql数据
docker exec -it mysql /bin/bash
# 创建相关数据库xxx
# 导入xxx.sql数据
mysql -u root -p xxx < xxx.sql
结语
至此手动搭建Docker的LNMP环境就算完成了,若连接不上可以考虑下是否是防火墙或云主机的安全组拦截。
Docker还可以使用Compose来一键部署,不过没去用过,以后可以用用Laravel现成的。