使用Docker配置LNMP环境

本文详细介绍了如何将一个运行在WindowsServer2008上的项目迁移到CentOS8Stream的Docker环境中,包括创建用户、设置目录权限、拉取Nginx、PHP和MySQL服务镜像、创建容器间通信网络、配置并启动Nginx和PHP-FPM容器,以及导入MySQL数据的过程。强调了在迁移过程中对用户权限和配置文件的处理,以及使用Docker简化部署的步骤。
摘要由CSDN通过智能技术生成

前言

需要把一个老的项目从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现成的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值