前言

docker 部署的优点不言而喻,一旦出现问题,可以删除的干干净净,完全不影响宿主机环境。而且只要宿主机资源足够,想起几个起几个,可以搭建主从节点。

这篇文章主要记录一下部署的步骤,部署过程中遇到的问题,以及如何解决。

docker-compose file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: "3.9"
services:
mariadb:
image: mariadb:latest
container_name: mariadb
command:
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
- "--max_allowed_packet=32505856"
- "--transaction-isolation=READ-COMMITTED"
- "--binlog-format=ROW"
restart: on-failure
ports:
- "3306:3306"
volumes:
- ./data/mariadb:/var/lib/mysql
- /var/run/mysqld/:/var/run/mysqld/
environment:
MYSQL_ROOT_PASSWORD: mariadb
MYSQL_DATABASE: mariadb
MYSQL_USER: phpcoin
MYSQL_PASSWORD: mariadb
logging:
options:
max-size: 1m

访问 mariadb

如果我们试图连接到 localhost 上的 MariaDB 服务器,客户端将绕过网络,尝试使用本地文件系统中的套接字文件连接到服务器。然而,当 MariaDB 在容器中运行时,这并不可行,因为服务器的文件系统与主机是隔离的。客户端无法访问容器中的套接字文件,所以它无法连接。

因此,默认情况下与 MariaDB 服务器的连接必须使用TCP,即使客户端与服务器容器运行在同一台机器上。

1
2
3
sudo apt install mysql-client -y
export mariadb_host=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb)
mysql -u root -p -h $mariadb_host --protocol=tcp

那么如果想要和正常安装的 Mariadb 一样访问有没有什么办法呢?
当然是可以的,可以将 Mariadb 的 socket 映射到宿主机上了,注意这里映射到 socket 的目录即可

1
2
3
volumes:
- ./data/mariadb:/var/lib/mysql
- /var/run/mysqld/:/var/run/mysqld/

相关参考