Docker 系列教程:輕松在 Docker 容器中運(yùn)行 MySQL 圖文指南
Docker 已成為流行的 DevOps 工具,您可能需要知道如何在 Docker 容器中運(yùn)行 MySQL。
本指南逐步解釋了如何在幾分鐘內(nèi)設(shè)置在 Docker 容器中運(yùn)行新的 MySQL 服務(wù)器。
Docker 的一大優(yōu)點(diǎn)是您可以快速使用它來(lái)試用應(yīng)用程序,而無(wú)需直接在您的機(jī)器上安裝它。您可以使用 Docker 在容器中運(yùn)行數(shù)據(jù)庫(kù),就像它是遠(yuǎn)程服務(wù)器一樣,并測(cè)試您的應(yīng)用程序如何與其交互。
使用 Docker 容器運(yùn)行 MySQL 是一種廣泛使用的機(jī)制。事實(shí)上,MySQL 是與 Docker 容器一起使用的最流行的數(shù)據(jù)庫(kù)之一。
要將 MySQL 創(chuàng)建為 Docker 容器,主機(jī)應(yīng)安裝 Docker。如果你沒(méi)有安裝它,這里有一個(gè)如何在 Ubuntu 上安裝 Docker 的分步指南。(見(jiàn):https://www.linuxmi.com/ubuntu-docker-zhinan.html )
1. 拉取 MySQL Docker 鏡像
要在 Docker 中創(chuàng)建和測(cè)試 MySQL 服務(wù)器,您要做的第一件事是從Docker Hub拉取 MySQL 官方鏡像 。
您可以下載特定版本,例如 8.0、5.7、5.6,或選擇最新版本,如以下命令所示:
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker pull mysql:latest
- [sudo] linuxmi 的密碼:
- latest: Pulling from library/mysql
- 72a69066d2fe: Pull complete
- 93619dbc5b36: Pull complete
- 99da31dd6142: Pull complete
- 626033c43d70: Pull complete
- 37d5d7efb64e: Pull complete
- ac563158d721: Pull complete
- d2ba16033dad: Pull complete
- 688ba7d5c01a: Pull complete
- 00e060b6d11d: Pull complete
- 1c04857f594f: Pull complete
- 4d7cfa90e6ea: Pull complete
- e0431212d27d: Pull complete
- Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
- Status: Downloaded newer image for mysql:latest
- docker.io/library/mysql:latest docker pull mysql:latest
如果您需要特定版本的 MySQL,請(qǐng)?zhí)鎿Q latest 為版本號(hào)。
您可以運(yùn)行該docker images 命令來(lái)查看從 Docker Hub 中提取的 Docker 鏡像列表。
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker images
- 輸出
- REPOSITORY TAG IMAGE ID CREATED SIZE
- mysql latest 3218b38490ce 23 hours ago 516MB
如您所見(jiàn),MySQL 映像現(xiàn)在可用于我們本地安裝的 Docker。
2. 設(shè)置 Docker數(shù)據(jù)卷(Volume)
如您所知,Docker 容器原則上是短暫的,如果容器被刪除,任何數(shù)據(jù)或配置都可能會(huì)丟失。然而,Docker Volume提供了一種機(jī)制來(lái)保存在 Docker 容器內(nèi)創(chuàng)建的數(shù)據(jù)。它們是 Docker 用于存儲(chǔ) Docker 容器持久數(shù)據(jù)的首選機(jī)制。
默認(rèn)情況下,MySQL 將其數(shù)據(jù)文件存儲(chǔ)在該 /var/lib/mysql 目錄中。因此,在部署之前,您需要設(shè)置一個(gè) Docker Volume來(lái)持久化您的數(shù)據(jù)庫(kù)。否則,當(dāng)容器重新啟動(dòng)時(shí),您的數(shù)據(jù)將丟失。
讓我們創(chuàng)建一個(gè)新Volume并將其命名為mysql-data。這將用于存儲(chǔ)您的所有數(shù)據(jù)庫(kù)信息。
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker volume create mysql-data
- mysql-data
您可以通過(guò)發(fā)出以下命令列出 Docker 已知的所有數(shù)據(jù)卷:
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker volume ls
輸出
- DRIVER VOLUME NAME
- local mysql-data
如下圖:
如您所見(jiàn),我們新創(chuàng)建的名為 Docker 的數(shù)據(jù)卷mysql-data在這里并準(zhǔn)備好提供數(shù)據(jù)。然后可以將其附加到新創(chuàng)建的 MySQL 容器。
3. 運(yùn)行一個(gè) MySQL Docker 容器
現(xiàn)在您的機(jī)器上有 MySQL Docker 映像和一個(gè)用于保存數(shù)據(jù)的Volume,您可以部署一個(gè)容器。您還必須使用MYSQL_ROOT_PASSWORD環(huán)境變量為 MySQL root 用戶設(shè)置密碼。
現(xiàn)在,讓我們運(yùn)行容器:
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker run -d --name=mysql-server -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your_password mysql
輸出
- 0ef0b05cce690b44da538291781f4885702074d4b63a7a293fe71dcdd3f69695
OK。這將啟動(dòng)最新版本的 MySQL 實(shí)例,可以使用指定的 root 密碼從任何地方遠(yuǎn)程訪問(wèn)它。
為了讓事情更清楚,讓我們分解這個(gè)語(yǔ)法。以下是該命令中每個(gè)參數(shù)的含義:
- -d 將以分離模式運(yùn)行此容器,以便它在后臺(tái)運(yùn)行。
- --name 將名稱分配mysql-server給您的容器實(shí)例。如果不指定此項(xiàng),Docker 將生成一個(gè)隨機(jī)名稱。
- -p 將 MySQL 容器端口綁定3306到主機(jī)上的相同端口。您將能夠 使用在您的主機(jī)上運(yùn)行的MySQL 客戶端 ( )連接到 127.0.0.1端口。3306mysql
- -v 選項(xiàng)將容器卷 ( /var/lib/mysql)內(nèi)的數(shù)據(jù)文件夾綁定到mysql-data您在上一步中創(chuàng)建的本地 Docker 卷 ( )。
- -e 設(shè)置環(huán)境變量。在這種情況下,MySQL 根密碼。
- mysql 是我們用來(lái)創(chuàng)建容器的映像的名稱。
您可以通過(guò)列出正在運(yùn)行的容器來(lái)檢查容器是否正在運(yùn)行:
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker ps
輸出
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 0ef0b05cce69 mysql "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-server
4. 連接到 MySQL 容器
您可以通過(guò)附加到容器并運(yùn)行mysql命令來(lái)獲得交互式 MySQL shell 。這提供了完整的 MySQL 命令行界面,因此您可以使用所有熟悉的命令和標(biāo)志。
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker exec -it mysql-server mysql -u root -p
mysql 如果您的主機(jī)上預(yù)安裝了它,您還可以使用客戶端連接 MySQL Docker 實(shí)例 。
請(qǐng)注意,默認(rèn)情況下,當(dāng)您告訴 mysql 客戶端連接到 localhost. 所以一定要使用 127.0.0.1 而不是 localhost。
- linuxmi@linuxmi:~/www.linuxmi.com$ mysql -u root -h 127.0.0.1 -p
當(dāng)然,您也可以使用基于 GUI 的客戶端(例如 MySQL Workbench)來(lái)連接數(shù)據(jù)庫(kù)。在 MySQL Workbench 中為“Hostname”指定啟動(dòng) Docker 容器的機(jī)器的 IP 地址。
相關(guān):如何使用 MySQL Workbench 在 MySQL 中創(chuàng)建數(shù)據(jù)庫(kù) (見(jiàn):https://www.linuxmi.com/ubuntu-20-04-mysql-workbench.html )
當(dāng)然,在上面顯示的主機(jī)名示例中,您可以使用 MySQL docker 容器所在機(jī)器的 IP 地址而不是127.0.0.1. 您可以通過(guò)運(yùn)行ifconfig不帶任何參數(shù)的命令來(lái)找到該地址。
使用機(jī)器的 IP 地址可以讓您遠(yuǎn)程訪問(wèn) MySQL 服務(wù)器。
5. 停止、啟動(dòng)和重啟 MySQL 容器
此命令將暫時(shí)停止正在運(yùn)行的 MySQL 容器(并且可以稍后恢復(fù)/重新啟動(dòng)):
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker stop mysql-server
要啟動(dòng)MySQL 容器,請(qǐng)運(yùn)行:
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker start mysql-server
下面的命令用于重啟正在運(yùn)行的 MySQL 容器:
- linuxmi@linuxmi:~/www.linuxmi.com$ sudo docker restart mysql-server
結(jié)論
如您所見(jiàn),在 Docker 中運(yùn)行 MySQL 比在本地安裝 MySQL Server 更快、更容易。如果您打算在 Docker 上使用 MySQL 進(jìn)行測(cè)試以外的任何事情,還有很多事情需要考慮。有關(guān)更多信息,您可以查看Docker Hub 上的 MySQL 頁(yè)面和有關(guān)該主題的官方 MySQL 手冊(cè)。
如果您有任何問(wèn)題或建議,請(qǐng)告訴我。