我用命令运行docker wordpress图像
docker run --name test-wordpress -p 8081:80 -d wordpress
MySQL 8 位于 Windows 10 上的本地主机上。数据库凭据有效。
在wordpress设置中,我使用此配置
- 数据库名称:wordpress(尚不存在)
- 用户名:根
- 密码:***
- 数据库主机:本地主机||127.0.0.1||host.docker.internal
我收到错误
建立数据库连接时出错
什么是正确的数据库主机?
默认情况下,docker 会将新容器附加到桥接网络。这意味着诸如:localhost
和127.0.0.1
之类的地址仅指容器本身。不是主机。
解决这个问题的简单方法是将MySQL数据库包装在自己的容器中。这样,您的容器就可以毫无问题地相互寻址。
连接到主机上的 MySQL 数据库
如果确实要将容器中的服务与主机上的服务连接,则需要将容器连接到相应的网络。
首先,您需要创建一个网络。假设您的本地计算机具有固定 IP192.168.0.1
,您应该能够使用以下方法执行此操作:
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet
然后,您可以:
docker run --name test-wordpress --net=dockernet -p 8081:80 -d wordpress
然后,您应该能够通过 IP 从容器内部引用主机:192.168.0.1
。
使用 wordpress 和 MySQL 创建堆栈
不过,这里更好的选择是使用 docker-compose 创建一个应用程序堆栈定义,其中包括数据库和 wordpress 应用程序。
您可以像这样创建一个docker-compose.yml
文件:
docker-compose.yml
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
并以这个开始堆栈:
docker-compose up
然后访问: http://localhost:8000
请注意,数据库数据将存储在名为db_data
的 docker 托管卷中。
有关安装 docker-compose 的详细信息,请参阅:https://docs.docker.com/compose/install/
只需docker run
即可启动两个容器
只需docker run
就可以实现相同的效果,如下所示:
docker volume create db_data
docker network create mysqlnet
docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=somewordpress -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -v db_data:/var/lib/mysql --net=mysqlnet -d mysql:5.7
docker run --name test-wordpress -e WORDPRESS_DB_HOST=test-mysql:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress --net=mysqlnet -p 8081:80 -d wordpress:latest
您可以更改 mysql 数据文件到本地目录的映射,只需省略docker volume create
语句即可。
接受的答案不完整且不准确。 通过在docker run
期间提供--network=host
选项,您可以非常轻松地连接到在主机中运行的MySQL,并在容器内运行wordpress。
Wordpress的问题:
唯一需要注意的是wordpress
无法与默认设置的MySQL
连接。 在运行MySQL 5.7(及更高版本)的Ubuntu系统中,默认情况下,任何MySQL用户都设置为使用auth_socket plugin
进行身份验证,而不是使用password
进行身份验证。在许多情况下,这允许更高的安全性和可用性,但是当您需要允许外部不兼容的程序(如wordpress
)访问用户时,它也会使事情复杂化。
为了使用password
以用户身份连接到MySQL,您需要将其身份验证方法从auth_socket
切换到mysql_native_password
。
解决方案:
在传统mysql_native_password
模式下为WordPress数据库创建一个专用的mysql用户。
$> sudo mysql
mysql> CREATE USER 'wpuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'wp_password';
mysql> CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> GRANT ALL ON wordpress_db.* TO 'wpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
运行 Wordpress 容器:docker run --rm --name my_wordpress --network=host -e WORDPRESS_DB_USER=wpuser -e WORDPRESS_DB_PASSWORD=wp_password -e WORDPRESS_DB_NAME=wordpress_db -e WORDPRESS_DB_HOST=127.0.0.1 wordpress
找到一篇很棒的文章,解释如何使用 Docker 设置 Wordpress。
问题是 MySQL 容器无法从 wordpress 容器访问,因此要解决此问题,我们必须创建 docker 网络并连接两个容器。
让我们创建一个码头工人网络 -
> docker network create --attachable wordpress-network
现在使用以下命令连接两个容器 -
> docker network connect wordpress-network mysql-container
> docker network connect wordpress-network wordpress-container
现在在浏览器中打开wordpress并将mysql容器设置为数据库主机