Docker官方鏡像-mysql


MySQL是一種廣泛使用的開源關係數據庫管理系統(RDBMS)

什麼是MySQL?

MySQL是世界上最流行的開源數據庫。憑藉其久經考驗的性能,可靠性和易用性,MySQL已成爲基於Web的應用程序的首選數據庫選擇,涵蓋從個人項目和網站,電子商務和信息服務,一直到高調的整個範圍。網站屬性包括Facebook,Twitter,YouTube,Yahoo!還有很多。

有關MySQL Server和其他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版本的標記。請參閱上面的列表以獲取相關標籤。

從MySQL命令行客戶端連接到MySQL

以下命令啓動另一個mysql容器實例並針對原始mysql容器運行mysql命令行客戶端,允許您對數據庫實例執行SQL語句:

$ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p

some-mysql是原始mysql容器的名稱(連接到some-networkDockerDocker網絡)。

此鏡像還可以用作非Docker或遠程實例的客戶端:

$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p

有關MySQL命令行客戶端的更多信息可以在MySQL文檔中找到

通過docker stack deploy或docker-compose

實施例stack.yml爲mysql:

# Use root/example as user/password credentials
version: '3.1'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

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

在這裏插入圖片描述

運行docker stack deploy -c stack.yml mysql(或docker-compose -f stack.yml up),等待它完全初始化,並參觀http://swarm-ip:8080http://localhost:8080http://host-ip:8080(如適用)。

容器shell訪問和查看MySQL日誌

docker exec命令允許您在Docker容器內運行命令。以下命令行將爲您提供mysql容器內的bash shell :

$ docker exec -it some-mysql bash

該日誌可通過Docker的容器日誌獲得:

$ docker logs some-mysql

使用自定義MySQL配置文件

可以在/etc/mysql/my.cnf中找到MySQL的默認配置,這可能是!includedir其他目錄,如/etc/mysql/conf.d/etc/mysql/mysql.conf.d。請檢查mysql鏡像本身內的相關文件和目錄以獲取更多詳細信息。

如果/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

這將啓動一個新容器some-mysql,其中MySQL實例使用來自/etc/mysql/my.cnf/etc/mysql/conf.d/config-file.cnf的組合啓動設置,後者的設置優先。

沒有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實例的配置。請注意,如果使用已包含數據庫的數據目錄啓動容器,則以下任何變量都不會產生任何影響:任何預先存在的數據庫在容器啓動時始終保持不變。

另請參閱https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html以獲取MySQL本身所遵循的環境變量的文檔(尤其是變量,例如MYSQL_HOST,與此圖像一起使用時會出現問題)。

  • MYSQL_ROOT_PASSWORD
    此變量是必需的,並指定將爲MySQL root超級用戶帳戶設置的密碼。在上面的例子中,它被設置爲my-secret-pw

  • MYSQL_DATABASE
    此變量是可選的,允許您指定要在映像啓動時創建的數據庫的名稱。如果提供了用戶/密碼(見下文),則該用戶將被授予對該數據庫的超級用戶訪問權限(對應於GRANT ALL)。

  • MYSQL_USER, MYSQL_PASSWORD
    這些變量是可選的,可以結合使用來創建新用戶並設置該用戶的密碼。此用戶將被授予MYSQL_DATABASE變量指定的數據庫的超級用戶權限(參見上文)。這兩個變量都是創建用戶所必需的。
    請注意,不需要使用此機制來創建根超級用戶,默認情況下會使用MYSQL_ROOT_PASSWORD變量指定的密碼創建該用戶。

  • MYSQL_ALLOW_EMPTY_PASSWORD
    這是一個可選變量。設置爲yes允許以root用戶的空密碼啓動容器。注意:建議不要將此變量設置爲yes,除非您確實知道自己在做什麼,因爲這會使您的MySQL實例完全不受保護,從而允許任何人獲得完整的超級用戶訪問權限。

  • MYSQL_RANDOM_ROOT_PASSWORD
    這是一個可選變量。設置爲yes爲root用戶生成隨機初始密碼(使用pwgen)。生成的root密碼將打印到stdout(GENERATED ROOT PASSWORD: …)。

  • MYSQL_ONETIME_PASSWORD
    初始化完成後,將root(不是MYSQL_USER!中指定的用戶)設置爲已過期,在首次登錄時強制更改密碼。注意:僅在MySQL 5.6+上支持此功能。在MySQL 5.5上使用此選項將在初始化期間拋出適當的錯誤。

Docker的祕密

作爲通過環境變量傳遞敏感信息的替代方法,_FILE可以將其附加到先前列出的環境變量,從而使初始化腳本從容器中存在的文件加載這些變量的值。特別是,這可以用於從存儲在/run/secrets/<secret_name>文件中的Docker機密加載密碼。例如:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

目前,這僅支持MYSQL_ROOT_PASSWORDMYSQL_ROOT_HOSTMYSQL_DATABASEMYSQL_USER,和MYSQL_PASSWORD

初始化一個新實例

首次啓動容器時,將創建具有指定名稱的新數據庫,並使用提供的配置變量進行初始化。此外,它將執行具有擴展名的文件.sh.sql並且.sql.gz可以在其中找到/docker-entrypoint-initdb.d。文件將按字母順序執行。您可以通過將SQL轉儲裝入該目錄並使用提供的數據提供自定義映像來輕鬆填充mysql服務。默認情況下,SQL文件將導入到MYSQL_DATABASE變量指定的數據庫中。

注意事項

存儲數據的位置

重要說明:有幾種方法可以存儲在Docker容器中運行的應用程序使用的數據。我們鼓勵mysql鏡像用戶熟悉可用選項,包括:

  • 讓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將寫入其數據文件。

在MySQL init完成之前沒有連接

如果在容器啓動時沒有初始化數據庫,則將創建默認數據庫。雖然這是預期的行爲,但這意味着在初始化完成之前它不會接受傳入的連接。使用自動化工具時可能會出現問題,例如docker-compose,同時啓動多個容器。

如果您嘗試連接到MySQL的應用程序無法處理MySQL停機或等待MySQL正常啓動,則可能需要在服務啓動之前進行連接重試循環。有關官方圖像中此類實現的示例,請參閱WordPress或Bonita。

針對現有數據庫的用法

如果mysql使用已包含數據庫(特別是mysql子目錄)的數據目錄啓動容器實例,$MYSQL_ROOT_PASSWORD則應從運行命令行中省略該變量; 在任何情況下都會被忽略,並且不會以任何方式更改預先存在的數據庫。

作爲任意用戶運行

如果您知道目錄的權限已經正確設置(例如針對現有數據庫運行,如上所述),或者您需要mysqld使用特定的UID / GID 運行,則可以通過--user設置爲任何值來調用此圖像(除了root/ 0)以實現所需的訪問/配置:

$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

創建數據庫轉儲

大多數常規工具都可以使用,但在某些情況下它們的使用可能有點複雜,以確保它們可以訪問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

從轉儲文件恢復數據

用於恢復數據。您可以使用docker exec帶有-iflag的命令,類似於以下內容:

$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql

License

查看此映像中包含的軟件的許可證信息。

與所有Docker映像一樣,這些映像可能還包含其他許可證(例如來自基本分發版的Bash等,以及所包含的主要軟件的任何直接或間接依賴關係)。

這是能夠自動檢測一些額外的許可信息可能中找到的repo-info版本庫的mysql/目錄。

對於任何預先構建的圖像使用,圖像用戶有責任確保對此圖像的任何使用都符合其中包含的所有軟件的任何相關許可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章