安裝部署環境
- Ubuntu 18.04.3 LTS
- Docker 19.03.2
- MySQL latest(8.0.17)
下載鏡像
# docker從倉庫中拉取最新版的mysql鏡像,如果沒加標簽的話,默認獲取最新的版本
Docker pull mysql
掛載數據卷以及配置文件
Docker容器原則上是短暫的,如果容器被刪除或損壞,任何數據或配置都將丟失。因為,我們需要將 Docker 內的 MySQL 數據文件以及配置文件轉移到宿主機的指定路徑。
每個人部署的 MySQL 內,可能文件路徑不一致。我們可以先創建個測試的 MySQL 容器,然后再根據查找出的文件具體路徑位置,重新創建我們符合我們需求的 MySQL 容器,命令如下:
docker run --name mysqltest \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=root \
-d mysql
進入Docker容器內
docker exec -it mysqltest bash
確定Docker內 MySQL 文件相關路徑
根據官網說明:如果要掛載 MySQL 配置文件的話,我們必須在物理機上存在着該配置文件。
# 查找Docker內,MySQL配置文件my.cnf的位置
mysql --help | grep my.cnf
# 顯示如下,意思是路徑按優先排序,會是在以下路徑里:
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
# 配置文件的路徑不一定都一樣,有些博客介紹的位置是在/etc/my.cnf。而本人Ubuntu系統上,實際存在位置是在/etc/mysql/my.cnf
查找數據文件位置
用於在容器上運行docker inspect命令的JSON輸出具有一個 Mount
密鑰,其值提供了有關數據目錄卷的信息:
docker inspect mysqltest
...
"Mounts": [
{
"Type": "volume",
"Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
"Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
輸出顯示源文件夾:/var/lib/docker/volumes,表示已安裝在 /var/lib/mysql
容器內的服務器數據目錄中。
創建本地路徑並掛載Docker內數據
接下來,我們需要在物理機上,創建指定好一個數據和配置文件的掛載路徑。
mkdir -p /home/docker/mysql/conf && mkdir -p /home/docker/mysql/datadir
創建好本地的掛載數據路徑后,我們再將測試容器里 MySQL 的配置文件復制到該路徑。日后需改配置,直接在掛載路徑的配置文件上修改即可。
docker cp mysqltest:/etc/mysql/my.cnf /home/docker/mysql/conf
創建 MySQL 容器並啟動
解決了配置文件的問題,就可以根據需求創建我們的 MySQL 容器並掛載數據了。
docker run --name mysql1 \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
--mount type=bind,src=/home/docker/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
--mount type=bind,src=/home/docker/mysql/datadir,dst=/var/lib/mysql \
--restart=on-failure:3 \
-d mysql
- --name:為容器指定一個名字
- -p:指定端口映射,格式為:主機(宿主)端口:容器端口
- -e:username="xxx",設置環境變量
- --restart=on-failure:3:是指容器在未來出現異常退出(退出碼非0)的情況下循環重啟3次
- -mount:綁定掛載
- -d:后台運行容器,並返回容器 id
網上許多人的博客寫的掛載 MySQL數據卷方法,采用的是
--volume
,但是在最新的MySQL官方Docker搭建MySQL文檔中,建議我們大家使用--mount
,因為研究表明它更易於使用。故我們根據官網推薦的方法,這里也采用--mount
掛載。
查看在運行的容器
docker ps
我們可以看到mysql1
容器正在運行,包括之前我們創建的測試容器。
使用DataGrip連接
使用測試連接,看是否能夠成功連接上
由圖所示,測試連接成功!