1. 程式人生 > 其它 >docker-配置mysql+外接資料+連線另一個容器(ip法和network法)

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

[email protected]:/# 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容器的名字。

至此,我的專案正常訪問,不再貼圖。