1. 程式人生 > 資料庫 >解決Docker之mysql容器資料庫更改不生效的問題

解決Docker之mysql容器資料庫更改不生效的問題

用官方的mysql 映象需要修改一些內容,比如配置檔案的修改,DB資料檔案的目錄等,更改之後如果重新執行容器,改過的檔案就無效了,新生成的容器不會有之前改變的內容

第一種是修改官方下載的映象,修改之後 提交一個新的映象檔案 docker commit -m 等新生成的映象資訊,

第二種MYSQL的DB資料,容器關閉後 如果用 docker restart 重啟同一容器,那麼資料是正常的,如果重新docker run 容器那麼資料就不會顯示,因為每個容器都有一個檔案地址

這就需要把資料檔案掛載出來,供其它容器讀取,

在docker中啟動mysql容器,在mysql容器中對資料庫的更改(如建立資料庫,更改資料等),在commit後再次進入容器發現之前的更改全部沒有儲存

1.後臺執行mysql容器,設定容器名稱為mysql:

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql

f80791a0daf194fdba94f16a9d89ebec8ba8fbd8af28d3ea8b599b9d705f85ba

2.進入容器bash和mysql,建立一個數據庫TEST_DB,並驗證TEST_DB建立成功:

[root@localhost ~]# docker exec -it mysql bash root@f80791a0daf1:/# mysql -uroot -p 
show databases; 
create database TEST_DB;

3.退出容器,並commit更改到映象: 這個資料其實是在宿主機上修改,不是mysql映象的東西。所以不生效

mysql> exit
Bye
root@f80791a0daf1:/# exit
exit
[root@localhost ~]# docker commit mysql owenchen1992/mysql

4.重新啟動容器並進入bash和mysql,發現之前建立的TEST_DB不見了,說明之前的更改無效:

[root@localhost ~]# docker container stop mysql
mysql
[root@localhost ~]# docker container rm mysql 
mysql
[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql
a1a1b4174caaadda0ec4b01b9fe5f92d6b3464d85284042274f71aebde0915dd
[root@localhost ~]# docker exec -it mysql bash
root@a1a1b4174caa:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20 MySQL Community Server (GPL)
 
mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mysql    |
| performance_schema |
| sys    |
+--------------------+
4 rows in set (0.00 sec)

問題原因:

在mysql的Dockerfile中有這樣一行:

VOLUME /var/lib/mysql

這意味在容器中的目錄/var/lib/mysql的所有修改會對應到宿主機的某個位置,可以通過命令檢視具體對應的宿主機目錄:docker inspect containerID/name. 當執行docker commit時,容器中的/var/lib/mysql目錄的更改並不會提交到映象中,但這些更改是隨時與宿主機對應的目錄同步的。

當重新啟動commit後的映象時,container會重新在宿主機中建立一個目錄來儲存其資料更新,因此並不是原先的宿主機目錄,所以新開啟的容器看不到之前的資料更改。

解決方法:

我們已經知道了問題發生的原因,就不難解決這個問題了,步驟如下:

可以直接去這個目錄下檢視為每個容器生成的資料目錄

1.找到mysql容器對應的宿主機目錄"/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data":

[root@localhost ~]# docker inspect mysql
[
......
    "Source": "/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data","Destination": "/var/lib/mysql",......
]

把之前的建立容器執行的步驟再執行一步,執行新的容器,然後建一張TEST表,先關閉容器後刪除容器服務

4.後臺執行容器新的容器,並將宿主機對應的目錄掛載到容器的/var/lib/mysql目錄下並開啟讀寫許可權(關鍵步驟):

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -v /var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data:/var/lib/mysql:rw -d owenchen1992/mysql

5.此時進入新開啟的容器,並檢視資料庫:發現剛才建立的資料庫TEST_DB沒有因為重新執行容器而消失,問題解決

步驟是,1 新建一張表,2 關掉建表的容器,3重新執行容器,並且掛載資料目錄到/var/lib/mysql下,問題就解決了!

補充知識:docker環境下使用mysql出現編碼格式問題修改編碼格式的方法

方法一(適用於單機器修改)

首先確定mysql服務處於開始狀態

鍵入docker exec -it +服務名 /bin/bash 進入控制檯

鍵入apt-get update 命令

鍵入apt-get install vim (上述兩條命令用於下載vim編輯器),

輸入vim /etc/mysql/mysql.conf.d/mysqld.cnf 命令 進入mysqld.cnf檔案

4.使用i開啟編輯模式,在文字的最後輸入以下內容:

注意:下面的內容一定不能輸錯,否則會造成配置檔案失效

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8

ESC退出,shift+冒號wq儲存 退出。

5.進入mysql控制檯

6.輸入show variables like ‘char%'; 即可檢視到修改後的相應資訊

解決Docker之mysql容器資料庫更改不生效的問題

修改完畢重啟資料庫後:輸入show variables like"char%"即可

解決Docker之mysql容器資料庫更改不生效的問題

出現上述結果說明已經修改成功

方法二(適用於叢集搭建)

將配置檔案拷貝出原目錄,使用外部檔案修改,此方法用於傳送檔案到多臺伺服器進行資料庫預設編碼修改

docker exec -it +服務名 /bin/bash 進入控制檯

輸入cd /etc/mysql/conf.d/ 進入配置檔案目錄

輸入pwd獲取檔案絕對路徑

輸入cd回退到控制檯,exit退出

輸入docker cp 服務名:/etc/mysql/conf.d/mysql.cnf /usr/soft ( 將docker中的mysql.cnf檔案拷貝到linux下的soft資料夾中)

開啟外部編輯器(如notepad++)進行配置檔案書寫 如下:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci'
init_connect=‘SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

解決Docker之mysql容器資料庫更改不生效的問題

PS:注意配置檔案的內容要有間隔,這一點很重要

儲存好

7.docker cp /usr/soft/mysql.cnf 服務名:/etc/mysql/conf.d/ 將修改後的檔案拷貝到原來的目錄下覆蓋

8.重啟docker中的mysql服務,然後

9.輸入 show variables like ‘char%';命令即可檢視已經修改好的字元編碼格式

以上這篇解決Docker之mysql容器資料庫更改不生效的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。