1. 程式人生 > >MySQL docker官方映象介紹

MySQL docker官方映象介紹

最近在學習docker,在使用mysql映象時看到dockerhub上的mysql映象介紹很詳細,解決了我大部分疑惑,為了加深印象,決定翻譯一下,初次嘗試翻譯英文文件,有誤之處還請多多指教。
原文:mysql官方映象介紹

簡介

mysql是一個應用廣泛的,開源的,關係型資料庫管理系統(RDBMS)

詳細介紹

支援的標籤和docker file連結以及快速幫助連結請看原文

什麼是mysql

mysql是世界上最流行的開源資料庫。憑藉它已被證明的高效能,可靠性和易用性,mysql已經成為網際網路應用的首選資料庫。它的應用範圍覆蓋從個人專案和網站,如電商專案和資訊服務,到大型網站包括Facebook,Twitter,YouTube,Yahoo!和很多其他網站。
要了解更多資訊或下載mysql伺服器或其他mysql產品,請訪問:www.mysql.com。

怎樣使用本映象

啟動一個mysql服務例項

啟動一個mysql例項是很簡單的:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
some-mysql是你給你的容器分配的名字,my-secret-pw是設定給mysql的root使用者的密碼,tag是你想用的特定的mysql的版本號,相關的版本號請看上面的列表。

從其他docker容器的應用中連線mysql

本映象暴露了mysql的標準埠(3306),所以容器連線機制使得其他應用程式容器可以訪問本mysql例項。通過以下方式啟動你的應用程式容器來連線到mysql容器:
$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql

從mysql命令列客戶端連線mysql

下面的命令啟動了另一個mysql容器例項並執行“mysql”命令連線到你之前的那個mysql容器,讓你能向之前的mysql例項傳送sql語句並執行:
$ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
some-mysql是你之前那個mysql容器的名字。
這個映象也可以作為非docker或遠端mysql例項的客戶端:
$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p


更多關於mysql命令列客戶端的資訊可以從mysql官方文件中找到。

通過docker stack deploy 或 docker-compose使用mysql

使用mysql的stack.yml示例:
用 root/example 作為 使用者名稱/密碼
version: ‘3.1’

services:

db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: example

adminer:
image: adminer
restart: always
ports:
- 8080:8080

執行:docker stack deploy –c stack.tml mysql (或docker-compose –f stack.yml up ),等待叢集初始化完成,然後訪問http://swarm-ip:8080, http://localhost:8080, 或 http://host-ip:8080 (替換合適的host-ip).

命令列接入容器和檢視mysql日誌

docker exec命令讓你可以在docker容器內執行命令。下面的命令會給你提供一個mysql容器內部的bash命令列介面:
$ docker exec -it some-mysql bash
mysql伺服器的日誌可以通過docker的容器日誌檢視:
$ docker logs some-mysql

使用自定義的mysql配置檔案

mysql的啟動配置在檔案/etc/mysql/my.cnf中宣告,這個檔案又引入了/etc/mysql/conf.d資料夾下的所有以.cnf結尾的檔案。這個資料夾下的配置檔案中的配置會補充或覆蓋/etc/mysql/my.cnf中的配置。如果你想使用自定義的mysql配置,你可以在宿主機中建立一個資料夾,並在裡面建立配置檔案,然後把這個資料夾掛載到mysql容器的/etc/mysql/conf.d目錄。

假設你自定義的配置檔案是/my/custom/config-file.cnf,你可以用如下方式啟動mysql容器(注意,命令中只指定了配置檔案的目錄):
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
這個命令會啟動一個新的mysql容器,叫做“some-mysql”,這個容器會組合使用/etc/mysql/my.cnf 和 /etc/mysql/conf.d/config-file.cnf中的配置
,並且後一個檔案的配置優先生效(譯者注:後者覆蓋前者)。
注意:宿主機上啟用SELinux的使用者進行本操作時可能出現問題,目前的解決方案是修改你自定義的配置檔案的SELinux策略,使容器能夠掛載它:
$ chcon -Rt svirt_sandbox_file_t /my/custom

不使用cnf檔案來配置

很多配置選項可以作為標誌傳給mysqld。這種方式可以讓你很靈活的配置容器而不需使用cnf檔案。比如,你想修改所有表的預設編碼格式和校驗規則,使用 UTF-8 (utf8mb4) ,可以執行下面的命令:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果你想檢視可用選項的完整列表,執行:
$ docker run -it --rm mysql:tag --verbose --help

環境變數

當你啟動mysql映象時,你可以通過在docker run命令中傳遞一個或多個環境變數來調整mysql例項的配置。注意,如果你使用已經存在的資料庫資料夾來啟動容器,下面的環境變數都不會生效,所有已存在的資料庫會一直原封不動的存在。
關於Mysql自己的環境變數文件可以通過 https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html來檢視(尤其是像MYSQL_HOST這樣的已被證實在本映象中使用時會出問題的環境變數)
MYSQL_ROOT_PASSWORD
這個變數是必須的,它會指定mysql的超級使用者root的登陸密碼,在上面的例子中,密碼被設定為my-secret-pw。
MYSQL_DATABASE
這個變數是可選的,它允許你指定一個在容器啟動時就建立的資料庫的名字。如果user/password這兩個變數也指定了,那麼這個使用者在這個資料庫上將被賦予超級使用者的許可權。(像grant all一樣)
MYSQL_USER, MYSQL_PASSWORD
這兩個變數是可選的,兩者一起使用來建立一個新使用者並指定密碼。這個使用者將被賦予超級使用者的許可權在用MYSQL_DATABASE變數指定的資料庫上。當要建立使用者時這兩個變數都是必須的。
注意:沒必要用這種方式建立root使用者,root使用者是預設建立的,密碼是MYSQL_ROOT_PASSWORD變數指定的值。
MYSQL_ALLOW_EMPTY_PASSWORD
這個變數是可選的,設定成yes來允許用空密碼登陸mysql。注意:我們不推薦把這個變數設定成yes,除非你真的清楚你在做什麼,因為這樣做會讓你的mysql例項處於完全無保護的狀態下,允許任何人獲得完全的超級使用者許可權。
MYSQL_RANDOM_ROOT_PASSWORD
這是個可選變數。設定成yes來給root使用者生成一個隨機的初始密碼(使用pwgen)。生成的root密碼會列印到標準輸出中(GENERATED ROOT PASSWORD: …..)。
MYSQL_ONETIME_PASSWORD
設定root使用者(不是MYSQL_USER中指定的使用者!)在初始化完成後立即過期,強制在第一次登陸時修改密碼。注意:這個特性只在mysql5.6+的版本上支援,在mysql5.5版本上使用這個選項會在初始化時丟擲一個合適的異常。

Docker安全

作為通過環境變數傳遞敏感資料的代替方案,可以在上面列出的環境變數名後加上_FILE,因為給變數賦值的指令碼來自容器內的檔案。特別的,這個方法可以被用來從docker安全儲存/run/secrets/中載入密碼,比如:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag
目前這個方法只支援如下變數:MYSQL_ROOT_PASSWORD, MYSQL_ROOT_HOST, MYSQL_DATABASE, MYSQL_USER, and MYSQL_PASSWORD

初始化一個全新的例項

當容器第一次啟動時,將會根據提供的配置變數建立並初始化一個新的,指定名字的資料庫。另外,還會執行/docker-entrypoint-initdb.d資料夾下的以.sh, .sql 和 .sql.gz結尾的檔案。檔案以字典序依次執行。你可以通過把一個sql備份掛載到這個資料夾來很方便地復原你的mysql服務並用你自己的資料製作新的映象。Sql檔案會自動匯入到通過MYSQL_DATABASE指定的資料庫中。

資料存放到哪裡

重要提示:有很多種存放docker容器中的應用使用的資料的方式,我們推薦mysql映象的使用者結合自己的實際情況在以下可選方式中作出選擇,包括:

  • 讓docker管理你的資料庫資料,通過使用docker內建的資料卷管理系統把資料庫檔案寫到宿主機的硬碟上。這是預設的,易用的,並且很顯然的一種方式。缺點是直接執行在宿主機上的工具和應用(比如其他的容器)很難定位這些資料庫檔案。
  • 在宿主機上(容器之外)建立資料目錄並掛載到容器內可見的目錄。資料庫檔案在宿主機的一個已知的路徑下,因此宿主機上的工具和應用可以很容易的訪問這些檔案。缺點是使用者需要保證目錄存在,並且保證宿主機上諸如目錄許可權和其他安全配置設定正確。

Docker官方文件是理解不同儲存方式和他們的差異的好助手,還有很多部落格和論壇給予了這方面的討論和建議。在這裡我們只簡單介紹下上面提到的第二種方式的基礎步驟:
1. 在你的宿主機上建立合適的資料目錄,如/my/own/datadir
2. 用如下方式啟動mysql容器:
$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-v /my/own/datadir:/var/lib/mysql 這部分命令把宿主機上的/my/own/datadir目錄掛載到容器內的/var/lib/mysql目錄,這是mysql預設存放資料檔案的地方。
注意:宿主機上啟動SELinux的使用者可能會出現問題。目前到解決方案是修改資料目錄的SELinux策略,使容器能夠掛載它:
$ chcon -Rt svirt_sandbox_file_t /my/own/datadir

mysql初始化完成前不要連線

如果容器啟動後沒有資料庫初始化,將會建立一個預設的資料庫。由於這是個意料之中的行為,這意味著這個初始化完成之前它都不會接受連線。這可能導致使用自動化工具時出現問題。比如使用docker-compose,同時啟動多個容器。
如果你的嘗試連線mysql的應用沒有處理mysql宕機或等待mysql平滑啟動的過程,那麼在服務啟動前加一個連線重試的迴圈可能很有必要。在官方映象中這麼做的例子可以參考 WordPress 或 Bonita.

結合已存在的資料庫檔案

如果你用已經包含資料庫的資料夾(特別的,包含一個mysql子資料夾)來啟動mysql容器,那麼MYSQL_ROOT_PASSWORD環境變數就不應該包含在啟動命令中,它絕對會被忽略掉,而且已存在的資料庫絕不會改變。

生成資料庫副本

大多數的傳統場景下的工具都可以工作,雖然在某些場景下為了讓他們能連上mysqld服務需要很複雜的使用方式。確保他們能連上mysqld服務的一個簡單的方法是用 docker exec在同一個容器內執行工具,如下所示:
$ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql

許可證(License)請參考原文