MySQL和Docker ...不是新概念,人們已經使用Docker已有一段時間了。 對於剛開始為此發展的人來說,可能會有一些障礙。 
儘管MySQL在本地運行良好,但如果要在不同版本的MySQL上測試代碼,則很容易擁有多個版本是很好的。
多年來,一種選擇當然是Giuseppe Maxia的https://mysqlsandbox.net/ 。 這是一個非常有效的解決方案,能夠啟動多個實例並測試複製等。
在跨不同版本的MySQL進行測試時,Docker現在也是另一個經常使用的場景。 下面僅介紹一些步驟,以輕鬆安裝多個版本。 我使用OSX,因此這些示例適用於OSX。
您需要Docker才能啟動,當然,Docker Desktop是一個方便的工具,使您能夠輕鬆獲得訪問權限。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
現在,您可以看到所有設備均已啟動並且可用,並且服務器ID與我們為每個cnf文件的eariler設置的設置匹配。
 
儘管MySQL在本地運行良好,但如果要在不同版本的MySQL上測試代碼,則很容易擁有多個版本是很好的。
多年來,一種選擇當然是Giuseppe Maxia的https://mysqlsandbox.net/ 。 這是一個非常有效的解決方案,能夠啟動多個實例並測試複製等。
在跨不同版本的MySQL進行測試時,Docker現在也是另一個經常使用的場景。 下面僅介紹一些步驟,以輕鬆安裝多個版本。 我使用OSX,因此這些示例適用於OSX。
您需要Docker才能啟動,當然,Docker Desktop是一個方便的工具,使您能夠輕鬆獲得訪問權限。
 設置好Docker之後,就可以為MySQL準備好環境了。 
 在這裡,我創建了一個Docker文件夾,其中包含MySQL數據目錄,配置文件以及mysql-files目錄(如果需要)。 
 
mkdir ~/Docker ; 
mkdir ~/Docker/mysql_data; 
mkdir ~/Docker/mysql-files; mkdir ~/Docker/cnf; 
 現在在mysql_data 
 
cd  ~/Docker/mysql_data; mkdir 8.0; mkdir 5.7; mkdir 5.6; mkdir 5.5; 
 現在,我為該示例設置簡單的cnf文件。 要注意的主要事情是綁定地址。 這樣做是為了確保它對我們開放,使其可以在docker之外訪問MySQL。 您還可以注意到,對於每個MySQL docker實例,這些文件都可以用來設置其他配置信息。 
 
cd  ~/Docker/cnf; 
cat my.8.0.cnf [mysqld] pid-file        = /var/run/mysqld/mysqld.pid socket          = /var/run/mysqld/mysqld.sock datadir         = /var/lib/mysql secure-file-priv= /var/lib/mysql-files # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 bind-address = 0.0.0.0 port=3306 server-id=80 
# Custom config should go here !includedir /etc/mysql/conf.d/ 
cat my.5.7.cnf [mysqld] bind-address = 0.0.0.0 server-id=57 max_allowed_packet=32M 
$ cat my.5.6.cnf [mysqld] bind-address = 0.0.0.0 server-id=56 
$ cat my.5.5.cnf [mysqld] bind-address = 0.0.0.0 server-id=55 
 好的,現在我們已經設置了配置文件,我們需要構建docker。 生成命令要注意的幾件事。 
  --name我們為docker設置了一個命名引用。 
 在這裡,我們將配置文件,數據目錄和mysql-files目錄映射到docker。 這使我們可以輕鬆調整my.cnf文件等。 
  -v〜/ Docker / cnf / my.8.0.cnf:/etc/mysql/my.cnf 
  -v〜/ Docker / mysql_data / 8.0:/ var / lib / mysql 
  -v〜/ Docker / mysql文件:/ var / lib / mysql文件 
 我們希望能夠在docker之外訪問這些MySQL實例,因此我們需要相應地發布和映射端口。 
  -p 3306:3306這意味著3306在docker內部的3306本地 
  -p 3307:3306這意味著3307在docker內部3306本地 
  -p 3308:3306這意味著3308在docker內部3306本地 
  -p 3309:3306這意味著3309在docker內部3306本地 
 然後,我們還要傳遞幾個環境變量。 
  -e MYSQL_ROOT_HOST =%-e MYSQL_ROOT_PASSWORD = <在此處設置密碼> 
 所以放在一起... 
 
docker run --restart always --name 
mysql8.0   -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v 
~/Docker/mysql_data/8.0:/var/lib/mysql -v 
~/Docker/mysql-files:/var/lib/mysql-files -p  3306:3306 -d -e 
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> 
mysql:8.0 
docker
 run --restart always --name mysql5.7   -v 
~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v 
~/Docker/mysql_data/5.7:/var/lib/mysql -v 
~/Docker/mysql-files:/var/lib/mysql-files -p  3307:3306 -d -e 
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> 
mysql:5.7 
docker
 run --restart always --name mysql5.6   -v 
~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v 
~/Docker/mysql_data/5.6:/var/lib/mysql -v 
~/Docker/mysql-files:/var/lib/mysql-files -p  3308:3306 -d -e 
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> 
mysql:5.6 
docker
 run --restart always --name mysql5.5   -v 
~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v 
~/Docker/mysql_data/5.5:/var/lib/mysql -v 
~/Docker/mysql-files:/var/lib/mysql-files -p  3309:3306 -d -e 
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> 
mysql:5.5 
 每次執行以上命令後,您都應該返回一個ID。 
 示例:3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 
 您可以通過Docker桌面輕鬆啟動/重新啟動和訪問每個Docker終端,或者只需記下相關ID即可通過終端執行。 
  Docker桌面還會顯示您傳遞的所有變量,以便您進行驗證。 
 當然,您也可以在此處訪問CLI,輕鬆停止或啟動或銷毀它。 
 
$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit # mysql -p 
 如果Docker容器已經在運行,您現在可以通過localhost終端訪問MySQL。 
 
$ mysql --host=localhost  --protocol=tcp --port=3306 -p -u root 
 現在,如果您遇到任何訪問問題,請記住確保MySQL帳戶正確並且您的端口和映射正確。 
- 在“讀取初始通信數據包”時失去與MySQL服務器的連接
- 錯誤1045(28000):用戶'root'@'192.168.0.5'的訪問被拒絕(使用密碼:是)
現在,您可以看到所有設備均已啟動並且可用,並且服務器ID與我們為每個cnf文件的eariler設置的設置匹配。
$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id " 
 +--------------+-----------+-------------+ 
 | @@hostname | @@version | @@server_id | 
 +--------------+-----------+-------------+ 
 | 58e9663afe8d | 8.0.19 | 80 | 
 +--------------+-----------+-------------+ 
 $ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id " 
 +--------------+-----------+-------------+ 
 | @@hostname | @@version | @@server_id | 
 +--------------+-----------+-------------+ 
 | b240917f051a | 5.7.29 | 57 | 
 +--------------+-----------+-------------+ 
 $ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id " 
 +--------------+-----------+-------------+ 
 | @@hostname | @@version | @@server_id | 
 +--------------+-----------+-------------+ 
 | b4653850cfe9 | 5.6.47 | 56 | 
 +--------------+-----------+-------------+ 
 $ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id " 
 +--------------+-----------+-------------+ 
 | @@hostname | @@version | @@server_id | 
 +--------------+-----------+-------------+ 
 | 22e169004583 | 5.5.62 | 55 | 
 +--------------+-----------+-------------+  

