使用 Docker 部署 MySql
前言
雖然不建議將需要持久化的數據保存在容器中,但是自己平時做個小項目玩玩還是沒什么問題的。
拉取鏡像
docker pull mysql
不加 tag 的話默認從 DockerHub 拉取最新版本的
啟動容器
-
運行一下試試
docker run mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql_test mysql這里的
-e參數是必須指定的,作用是設置數據庫的密碼,否則將無法啟動容器。 -
復制容器內的文件到宿主機
現在我們還沒有進入容器,可以在宿主機的命令行中輸入
docker ps查看當前正在運行的容器,如果沒出什么問題的話應該可以看到一個名為mysql_test的容器正在運行。在學習數據庫的時候我們已經知道了MySql的數據庫文件默認位于/var/lib/mysql/中,配置文件在/etc/mysql/conf.d和/etc/my.cnf。我們不對默認的配置做更改,所以就沒必要掛載
conf.d目錄到宿主機了,只需要映射一下容器內的數據庫文件,以防止容器宕掉了導致數據的丟失。docker cp mysql_test:/var/lib/mysql $PWD/這里的
cp命令作用是復制容器內的文件,后面的$PWD為 當前所在的宿主機目錄,例如我現在的目錄是/home/hsk/box_container/mysql/,復制出來的mysql文件夾就會在我當前的路徑下。
啟動一個新的容器
-
將默認的數據庫文件復制出來后,就可以刪除之前測試用的容器了,在刪除之前 我們要先停掉它:
docker stop mysql_test -
刪除舊容器:
docker rm mysql_test -
創建一個新的容器并掛載卷,映射端口:
docker run \ -d \ --name mysql01 \ -p 3309:3306 \ -v /home/hsk/box_container/mysql01/conf.d/:/etc/mysql/conf.d \ -v /home/hsk/box_container/mysql01/mysql/:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql-d表示讓容器在后臺運行
--name為容器起一個名字
-p映射端口,這里把容器內的 3306 端口映射到了宿主機的 3309
-v掛載卷,冒號前是宿主機目錄,冒號后是容器內目錄
-e容器的環境配置
進入容器
-
使用
docker exec -it <容器ID|容器name> /bin/bash指令進入模擬終端:docker exec -it mysql01 /bin/bash -
進入容器后,啟動 MySql 交互命令行:
mysql -hlocalhost -uroot -p123456
-
查看數據庫表:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)外部掛載進來的默認數數據庫表都正常加載了
創建新的數據庫
由于我的數據庫基礎不是很好,而且過了很長時間已經忘了基本所有的 SQL語句,所以這里使用 DBeaver 圖形化數據庫工具來創建數據庫和添加數據,類似于大家上課時用到的 Navicat
-
防火墻放行端口:
在創建容器的時候我們指定了對外映射端口 3309,所以要放行該端口以供外網訪問,如果像我一樣使用云服務商提供的服務器的話具體去官網控制臺放行一下端口就行了,如果是在自己家搭建的服務器在有 公網IP 的條件下去路由器管理界面設置,本機的話就不需要配置了。
-
使用 DBeaver 連接數據庫:
新建連接 ->
mysql
沒有報錯就說明連接成功了

-
創建數據庫:
右鍵「數據庫」,選擇「新建」,我起名為 FruitDatabase

-
新建表:
選擇「數據庫」,點擊「創建」-> 「表」,我起名為 fruit_table

-
新增列,配置主鍵:
直接點擊鼠標操作就行,無需輸入任何 SQL語句,但是要了解數據類型、鍵等基礎知識。我創建的字段如下所示 ↓

-
再隨便添加點數據:

回到容器
插入數據完成后,進入容器中檢查下:
docker exec -it mysql01 /bin/bash
bash-4.4# mysql -hlocalhost -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| FruitDatabase |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use FruitDatabase
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------------+
| Tables_in_FruitDatabase |
+-------------------------+
| fruit |
+-------------------------+
1 row in set (0.00 sec)
mysql> select * from fruit_table;
+------------+----------+-------+-------+-----------------------------------------+
| fruit_name | fruit_id | price | stock | avatar |
+------------+----------+-------+-------+-----------------------------------------+
| ????? | 1 | 24.20 | 70 | http://www.xxx.com/apple.jpg |
| ????? | 2 | 74.20 | 80 | http://www.xxx.com/pears.jpg |
| ???? | 3 | 78.40 | 190 | http://www.xxx.com/jujube.jpg |
| ????? | 4 | 78.00 | 8 | http://www.xxx.com/jackfruit.jpg |
| ????? | 5 | 24.20 | 70 | http://www.xxx.com/litchi.jpg |
+------------+----------+-------+-------+-----------------------------------------+
5 rows in set (0.00 sec)
由于字符集的問題導致顯示中文字符會出問題,這只是在命令行中會發生這種情況 ??

浙公網安備 33010602011771號