docker-配置mysql+外置数据+连接另一个容器(ip法和network法)

拉取镜像

docker pull mysql:latest
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=数据库密码 mysql

进入mysql的bash:

docker exec -it mysql bash

然后mysql -u root -p即可进入

中文自动变空格或其他字符的解决办法

首先检查数据库的编码:
在这里插入图片描述
utf8mb4是用4个字节表示完整utf8字符的编码方式,所以常见中文是肯定可以覆盖的。但是我如果在insert语句中放置中文字符串,中文部分就会消失,导致插入报错。另外,我的服务器也是支持中文的。那么,到底是Mysql不能显示中文,还是docker不能显示中文呢?答案是后者。
参考:https://cloud.tencent.com/developer/article/1500399

root@0c1ccec770ff:/# locale -a
C
C.UTF-8
POSIX

Docker使用的是POSIX字符集,POSIX字符集是不支持中文的,而C.UTF-8是支持中文的。因此,只要把系统中的环境 LANG 改为"C.UTF-8"格式即可解决问题。那么可以在进入容器时临时指定字符集:

docker exec -it mysql env LANG=C.UTF-8 bash

外置数据

假设打算在Path下放置Mysql相关数据,那么在Path下创建conf.d,data和log三个文件夹,再放一个文件,名为my.cnf,内容(自由发挥吧)为:

[mysqld]
user=mysql
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

然后输入下面的命令。其中-d表示用的是哪个镜像,-v是挂载的文件夹。如果秒退,则可能是容器内某个路径缺失,比如我缺的是/var/log/mysql,那么新建一个,再保存就好了(所以我从mysql:latest另存为mysql:v1了)

docker run \
--restart=always \
--privileged=true \
-p 3306:3306 --name mysql \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/my.cnf:/etc/mysql/my.cnf \
-v /home/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=数据库密码 \
-d mysql:v1

如果这段语句有报错,记得检查 ** 前是否缺少空格!

与其他容器连接

方法1:ip法

docker inspect mysql

在这里插入图片描述
当前我搞了一个python3的容器C,所以在启动mysql后,在C里面访问mysql时应该用红圈的ip。
下面是用来测试的代码。

>>> import pymysql
>>> conn = pymysql.connect(host="172.17.0.3",user="root",password="root密码",database="mysql")

# 如果报错:RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
# pip3 install cryptography

>>> cursor=conn.cursor()
>>> cursor.execute("select host,user from user")
5
>>> data = cursor.fetchall()
>>> for i in data:
...     print(i)
... 
('%', 'root')
('localhost', 'mysql.infoschema')
('localhost', 'mysql.session')
('localhost', 'mysql.sys')
('localhost', 'root')
# 这说明连接成功了

方法2:加入network法

我有一个springboot2项目已打成war包,放在一个装了tomcat的容器A中。虽然我按方法1中的ip配置了数据库,在A中也可以ping通那个ip,但始终报错:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

因此我采用方法2,将mysql容器和A容器加入到一个网络中去。

docker network create -d bridge sgrna-net

docker run \
--network sgrna-net \
--restart=always \
···mysql的运行命令

docker run -itd --network sgrna-net ···容器A的运行命令

此时在容器A中ping mysql应该是通的。

最后,修改springboot项目的配置文件,例如application.yml
在这里插入图片描述
其中黑笔处是需要增加的,红笔处写的是mysql容器的名字。

至此,我的项目正常访问,不再贴图。

猜你喜欢

转载自blog.csdn.net/pxy7896/article/details/116268571