1. 程式人生 > 其它 >四、Docker映象講解

四、Docker映象講解

一、docker-compose.yml配置

 

 

version: '3' # 指定docker-compose語法版本

 

 

services: # 從以下定義服務配置列表

 

 

mysql:

 

 

image: bingozhou/mysql5.7 # 指定使用的映象名及標籤

 

 

container_name: mysql # 例項化後的容器名

 

 

privileged: true #使用該引數,container內的root擁有真正的root許可權,否則,container內的root只是外部的一個普通使用者許可權,設定為true,不然資料卷可能掛載不了,啟動不起

 

 

restart: always #設定無論遇到什麼錯,重啟容器

 

 

ports:

 

 

# 使用宿主機的3306埠對映到容器的3306埠

 

 

# 宿主機:容器

 

 

- "3306:3306"

 

 

environment:

 

 

MYSQL_ROOT_PASSWORD: newpassword

 

 

MYSQL_DATABASE: mproject #資料庫名

 

 

#自定義資料庫的使用者

 

 

MYSQL_USER: newuser

 

 

#自定義資料庫的使用者

 

 

MYSQL_PASSWORD: pwdnewuser

 

 

TZ: Asia/Shanghai

 

 

command: #使用 command 可以覆蓋容器啟動後預設執行的命令

 

 

--max_connections=1000 #最大連線數

 

 

--wait_timeout=28800 #非互動式連線超時時間

 

 

--interactive_timeout=28800 #互動式連線超時時間

 

 

--default-authentication-plugin=mysql_native_password #認證方式

 

 

--character-set-server=utf8mb4 #字符集

 

 

--collation-server=utf8mb4_general_ci #排序規則

 

 

volumes:

 

 

#對映mysql的資料目錄到宿主機,儲存資料【對映使用相對路徑】

 

 

- "./data:/var/lib/mysql"

 

 

#根據宿主機下的配置檔案建立容器【對映使用相對路徑】

 

 

- "./my.cnf:/etc/mysql/my.cnf"

 

 

- ./init:/docker-entrypoint-initdb.d/

 

 

- /etc/timezone:/etc/timezone - /etc/localtime:/etc/localtime

 

 

重點講解幾個引數:

 

 

wait_timeout:伺服器關閉非互動連線之前等待活動的秒數,單位是s,預設是28800s,也就是8小時。非互動式連線如jdbc連線資料庫等。

 

 

interactive_timeout:伺服器關閉互動式連線前等待活動的秒數,單位是s,預設是28800s,也就是8小時。互動式連線如navicate連線資料庫等。

 

 

通俗易懂的說,就是通過mysql客戶端連線資料庫是互動式連線,通過jdbc連線資料庫是非互動式連線。 當一個客戶端連線到MySQL資料庫後,如果客戶端不自己斷開,也不做任何操作,MySQL資料庫會將這個連線保留wait_timeout 或者 interactive_timeout【哪個引數生效取決於是哪種連線方式】設定的時間,超過這個時間之後,MySQL資料庫為了節省資源,就會在資料庫端斷開這個連線;當然,在此過程中,如果客戶端在這個連線上有任意的操作,MySQL資料庫都會重新開始計算這個時間。

 

 

character-set-server和collation-server:設定資料庫字符集和排序規則。小編試過如果不設定的,後續在mysql裡面進行設定始終都不生效。

 

 

二、my.cnf配置

 

 

[client]

 

 

# 客戶端來源資料的預設字符集

 

 

default-character-set=utf8mb4

 

 

[mysqld]

 

 

# 服務端預設字符集

 

 

character-set-server=utf8mb4

 

 

# 連線層預設字符集

 

 

collation-server=utf8mb4_unicode_ci

 

 

[mysql]

 

 

# 資料庫預設字符集

 

 

default-character-set=utf8mb4

 

 

三、data檔案是volumes對映的宿主機的資料庫檔案目錄

 

 

配置完上述檔案之後,有幾個問題值得我們考慮一下:

 

 

問題1:資料庫密碼設定

 

 

第一個問題就是,為了資料庫的安全,往往我們需要設定稍微複雜一點的資料庫連線密碼,而不是直接使用root。那麼是不是直接把MYSQL_ROOT_PASSWORD後面配置成我們需要設定的密碼就行了呢,答案是不行的。【示例我設定的資料庫連線密碼newpassword】

 

 

我們可以驗證一下,通過命令進入容器,再輸入密碼連線會提示報錯。

 

 

[root@i ~]# docker exec -it mysql /bin/bash

 

 

[root@i ~]# mysql -u root -pnewpassword

 

 

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

 

 

遇到這種問題該怎麼處理呢:

 

 

(1)、修改my.cnf 檔案,在[mysqld]下新增

 

 

skip-grant-tables

 

 

(2)、進入容器內部登入mysql

 

 

[root@i ~]# docker exec -it mysql /bin/bash

 

 

[root@i ~]# mysql

 

 

mysql>

 

 

(3)、修改root使用者密碼

 

 

mysql>update mysql.user set authentication_string=password('newpassword') where user='root';

 

 

注意事項:mysql 4.6版本以上的mysql伺服器password改為authentication_string;我使用的mysql映象版本是5.7,所以用update mysql.user set password=password(‘newpassword’) where user='root',否則無法修改使用者密碼。

 

 

(4)、重啟mysql

 

 

docker restart mysql

 

 

問題2:新增使用者

 

 

有時候為了方便管理不同的許可權,除了root使用者之外,會再新增其他的使用者,可以有三種方式來實現這種需求。

 

 

(1)第一種就是進入mysql容器,新增使用者並授權

 

 

[root@i ~]# docker exec -it mysql /bin/bash

 

 

[root@i ~]# mysql -u root -pnewpassword

 

 

mysql>CREATE USER 'newuser'@'%' IDENTIFIED BY 'pwdnewuser';

 

 

mysql>GRANT All privileges ON *.* TO 'newuser'@'%';

 

 

(2)第二種在docker-compose.yml檔案command下設定
#資料庫名

 

 

MYSQL_DATABASE: mproject

 

 

#自定義資料庫的使用者

 

 

MYSQL_USER: newuser

 

 

#自定義資料庫的使用者

 

 

MYSQL_PASSWORD: pwdnewuser

 

 

docker-compose.yml完整配置檔案如下:

 

 

 

注意這種方式建立的使用者還需要先使用root使用者登入以後給它賦予相關的許可權才可以使用它進行資料庫的連線:

 

 

grant all privileges on dbname.tablename to 'username'@'ip';

 

 

# 比如想給使用者newuser賦予資料庫mproject所有的表的許可權並且不限制root使用者的連線地址,程式碼如下

 

 

grant all privileges on mproject.* to 'newuser'@'%';

 

 

flush privileges; # 重新整理許可權

 

 

(3)第三種就是編寫使用者許可權的sql檔案,並把檔案在docker-compose.yml進行對映。

 

 

在mysql/init資料夾下建立init.sql檔案:

 

 

CREATE USER 'newuser'@'%' IDENTIFIED BY 'pwdnewuser';

 

 

GRANT All privileges ON *.* TO 'newuser'@'%';

 

 

docker-compose.yml完整配置檔案如下:

 

 

 

配置說明:

 

 

/docker-entrypoint-initdb.d/

 

 

這個目錄是資料庫官方提供的初始目錄,以.sql .sh .bat結尾的檔案放到這個目錄下面,在資料庫啟動的時候會自動執行。

 

 

問題3:docker-compose logs -f 日誌時間與系統時間不一致

 

 

通過date命令檢視時間 分別檢視主機時間和容器時間,兩者時間不一致,相差八個小時

 

 

UTC表示世界協調時間(Coordinated Universal Time) CST表示中國標準時間(China Standard Time) 所以,這2個時間相差8個小時。(所以沒有設定過的容器, 一般跟宿主機時間相差8h,這是由於我們在安裝系統的時選擇的時區是上海,而CentOS預設bios時間是utc時間,所以時間相差了8小時。)

 

 

如何解決?

 

 

(1)執行命令建立檔案【沒有/etc/timezone檔案或者是一個空資料夾,記得刪除

 

 

echo "Asia/shanghai" > /etc/timezone

(2)在docker-compose.yml檔案中

volumes: - /etc/timezone:/etc/timezone - /etc/localtime:/etc/localtime

(3)docker-compose restart 重啟即可