docker run方式lnmp+wordpress+phpmyadmin

创建docker bridge自定义网络

参考链接:https://developer.aliyun.com/article/1314180

docker network create –subnet 172.18.0.0/24 –gateway 172.18.0.254 –driver bridge wangjiale-network
指定网段–subnet 172.18.0.0/24
指定网关–gateway 172.18.0.254
网络类型:–driver bridge
网络名字 wangjiale-network

docker持久化存储volume(存储卷)和bind mount(绑定挂载)

存储卷:
存储卷是Docker管理的,独立于容器生命周期的。
存储卷数据可以被多个容器共享。
存储卷数据默认存储在宿主机的 /var/lib/docker/volumes/ 目录下。
通常提供更好的性能,尤其是在Docker Desktop上相比于Mac和Windows宿主机上的Bind Mount。
需要额外docker volume create my_volume

绑定挂载:
绑定挂载将宿主机上的文件或目录直接挂载到容器内部。
绑定挂载的路径与宿主机上的文件系统结构紧密相关。
绑定挂载可以是只读的,也可以是可读写的。
Bind Mount的性能通常非常好,但它们依赖于宿主机的文件系统具有特定的目录结构。
使用Bind Mount时,如果宿主机上的路径不存在,Docker不会自动创建它,而是会报错。
docker run时 指定-v参数 -v 宿主机目录(需要已经存在):容器内目录

Bind mounts和Volumes行为上的差异
如果你将一个空Volume挂载到一个非空容器目录上,那么这个容器目录中的文件会被复制到Volume中,即容器目录原有文件不会被Volume覆盖。
如果你使用Bind mounts将一个宿主机目录挂载到容器目录上,此容器目录中原有的文件会被隐藏,从而只能读取到宿主机目录下的文件

docker 端口映射

-P 容器端口随机映射到宿主机端口
-p 指定宿主机端口映射容器端口
宿主机端口:容器端口 443:443 (TCP)
-p 5000:5000/udp 宿主机UDP5000映射到容器内UDP5000

docker 部署lnmp+wordpress+phpmyadmin

/wordpress下放的是wordpress网站文件
phpmyadmin 在/wordpress/phpmyadmin

以下使用bind mount(绑定挂载)方式 -p 端口映射方式
-i 和 -t 使得容器拥有一个交互式终端 d 使得容器以分离模式在后台运行
-name 指定容器名字
–net wangjiale-network 指定容器使用的网络名字
–ip 172.18.0.1 指定容器IP地址
-h nginx 指定主机名
-v Bind mounts 持久化存储将宿主机目录挂载到容器内目录
-e 指定环境变量 设置容器时区
-p 端口映射 宿主机TCP 443 80 映射到容器内TCP 443 80
–privileged=true 允许容器内的进程获得宿主机上的超级用户权限,这意味着容器可以访问宿主机的所有硬件设备和系统资源,包括挂载文件系统、访问网络设备等。这种权限设置使得容器能够执行一些需要高权限的操作,例如加载内核模块、绕过SELinux策略等‌
–restart=always
Docker的重启策略包括以下几种:
‌no‌:容器退出时不重启容器
‌on-failure‌:只有在容器非正常退出时(退出状态非0)才重启容器
‌on-failure‌:在容器非正常退出时重启容器,最多重启N次
‌always‌:无论退出状态如何,都重启容器
nginx:1.20.1 镜像名字
nginx -g “daemon off;” https://blog.csdn.net/lgxzzz/article/details/123123110

nginx

-v /wordpress:/wordpress 指定php容器中WordPress网站存放路径 nginx处理静态页面以及图片若不指定会出现静态页面以及图片404错误
宿主机关于log日志的权限我这里都给了777否容器运行失败
以下宿主机目录或者文件需要是已存在的否则容器 run 失败 可以通过docker logs 容器ID或者容器名字查看到大概原因
docker run -itd –name nginx –net wangjiale-network –ip 172.18.0.1 -h nginx \
-v /nginx:/etc/nginx -v /wordpress:/wordpress -v /var/log/nginx/access.log:/var/log/nginx/access.log -v /var/log/nginx/error.log:/var/log/nginx/error.log \
-e TZ=Asia/Shanghai \
-p 443:443 -p 80:80 –privileged=true –restart=always nginx:1.20.1 nginx -g “daemon off;”

mysql

我这里mysql迁移数据是直接把mysql数据目录拷贝到宿主机/mysql下的运行使用没问题
宿主机关于log日志的权限都给777否则容器运行失败
docker run -itd –name mysql –net wangjiale-network –ip 172.18.0.2 -h mysql \
-v /mysql:/var/lib/mysql -v /my.cnf:/etc/my.cnf -v /var/log/mysql/mysqld.log:/var/log/mysqld.log -v /etc/localtime:/etc/localtime:ro \
-p 3306:3306 –privileged=true –restart=always -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=xxxxx密码 mysql:5.7.44

php

-v /wordpress:/wordpress 指定php容器中WordPress网站存放路径 php处理php动态页面
docker run -itd –name php –net wangjiale-network –ip 172.18.0.3 -h php \
-v /php.ini:/usr/local/etc/php/php.ini -v /wordpress:/wordpress \
-p 9000:9000 -e TZ=Asia/Shanghai –privileged=true –restart=always php:7.4.33-fpm

注意事项

1

nginx配置文件注意事项:
访问报错404 File not found或者502 Bad Gateway是如下问题
假如写宿主机IP地址 错误的写php容器网站存放路径会导致404 File not found
假如写php容器IP地址 错误的写php容器网站存放路径会导致502 Bad Gateway

        location ~ \.php$ {
                root /wordpress;              ###意思是指定php容器中网站存放路径/wordpress
                fastcgi_pass 172.18.0.3:9000; ###经验证写宿主机或php容器的IP地址都可以 只不过是访问走的路不一样宿主机是172.18.0.254 -  24/Nov/2024:21:24:02 +0800 "GET /index.php" 500 php容器是172.18.0.1 -  24/Nov/2024:21:13:07 +0800 "GET /index.php" 500
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

2

访问wordpress报错500
172.18.0.254 – 24/Nov/2024:21:24:08 +0800 “GET /index.php” 500
Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
Please check that the mysqli PHP extension is installed and enabled.
If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the WordPress support forums.
需要安装PHP的mysql扩展进入到php容器下执行
docker-php-ext-install mysqli 安装扩展
php -m 查看是否成功
重启php容器生效

3

访问phpMyAdmin – 错误
缺少 mysqli 扩展。请检查 PHP 配置。 详情请查看我们的文档
进入到php容器下执行
docker-php-ext-install mysqli 安装扩展
php -m 查看是否成功
重启php容器生效
我这里的原因是因为php.ini文件内多写了个此参数pdo_mysql.default_socket但是pdo_mysql扩展没安装找不到所以提示缺少扩展

4

登录phpmyadmin报错mysqli::real_connect(): (HY000/2002): No such file or directory
网上说原因是php.ini中配置的mysqli没有与实际的mysql.sock对应正确
但是咱们不是本地sock方式连接的数据库 咱们是容器之间连接也就是TCP/IP方式 如果是单机部署的lnmp可以试一试这个解决方法
如果不配置php.ini里面的mysqli.default_socket那么默认值是/tmp/mysql.sock
my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
php.ini
mysqli.default_socket =/var/lib/mysql/mysql.sock
mysql.sock文件的作用有:
提供本地套接字通信:当客户端程序通过本地套接字连接到mysql.sock文件时,可以直接与MySQL服务器进行通信,而不需要通过网络连接。
优化通信性能:与通过TCP/IP进行网络连接相比,通过本地套接字连接的通信性能更高。因此,使用mysql.sock文件可以提高MySQL服务器与客户端程序之间的通信性能。
管理连接:mysql.sock文件还用于管理客户端程序与MySQL服务器之间的连接。服务器会维护mysql.sock文件中的连接信息,包括客户端的身份验证、会话状态等。
总而言之,mysql.sock文件在MySQL服务器和客户端程序之间提供了一个本地套接字通信通道,用于高效地进行数据交互和连接管理。

如上方法解决不了 /wordpress/phpmyadmin/libraries/config.default.php配置文件内如下 没问题的
$cfg[‘PmaAbsoluteUri’] = ‘https://域名/重命名的名字/index.php’; ###这里验证出只是记录phpmyadmin的访问网址 并无它用
$cfg[‘Servers’][$i][‘host’] = ”; ###MySQL的IP地址
$cfg[‘Servers’][$i][‘port’] = ”; ###MySQL数据库端口号 不写默认3306
$cfg[‘Servers’][$i][‘user’] = ”; ###MySQL的用户
$cfg[‘Servers’][$i][‘password’] = ”; ###MySQL的密码
$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’; ###在此有四种模式可供选择,cookie,http,http,config config方式即输入phpmyadmin的访问网址即可直接进入,无需输入用户名和密码,是不安全的,不推荐
使用。
$cfg[‘blowfish_secret’] = ”; ###如果认证方法设置为cookie,就需要设置短语密码,置于设置为什么密码,随意 ,但是不能留空,否则会在登录phpmyadmin时提示错误
wordpress网站正常写入 phpmyadmin连接不上那就不是数据库的问题了 就是phpmyadmin的问题了后来百度发现配置文件应是phpmyadmin目录下的config.inc.php而不是phpmyadmin/libraries目录下config.default.php奇了怪了非docker部署phpmyadmin配置文件是config.default.php生效的
那就将phpmyadmin目录下config.sample.inc.php复制一份重命名为config.inc.php
修改下面参数 经验证/wordpress/phpmyadmin/libraries/config.default.php和phpmyadmin/
config.inc.php这两个文件都需要存在生效
$cfg[‘blowfish_secret’] 与config.default.php中的配置一致
$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;
$cfg[‘Servers’][$i][‘host’] = ”;