在docker中運行mysql服務

前言:當希望在本地上配置容器中的mysql時,發(fā)現一個問題,本地需要完整的配置文件目錄,如果本地是空目錄,那么容器中的配置目錄也是空的所以不能運行鏡像,這里解決這個問題,思路是任意運行一個容器,把里面的配置目錄復制到本地,然后刪除這個容器,再創(chuàng)建新的容器,并把復制出來的配置目錄和容器中的配置目錄同步,這里記錄下這個過程。

  • 創(chuàng)建任意一個鏡像并映射配置目錄
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

ps:暫時把本地配置目錄和容器中的app文件夾關聯(不能直接關聯容器配置目錄,由于文件同步原因這會導致容器配置目錄為空無法啟動容器),后續(xù)會把容器的配置文件復制到app,達到復制容器文件的目的。

-v 表示掛載數據卷,格式是-v localPath:containerPath 本地目錄:容器目錄

$PWD 表示當前目錄的路徑,具體自己控制臺輸入echo $PWD 嘗試。

-e 參數必須有 否則容器無法啟動

  • 輸入docker ps -a 查看status是Up的就算啟動成功

  • 復制配置目錄到本地

docker exec -it mysql /bin/bash
  • 進入容器命令行,
    通過指令:cp -r /etc/mysql /app 指令把etc目錄下的mysql文件夾,復制到app目錄下,由于之前做了本地同步,所以能看到本地文件夾內有mysql文件夾

  • 刪除容器并創(chuàng)建新容器再同步配置目錄

通過docker stop msyql停止容器,通過docker rm mysql刪除容器,然后本地進入mysql文件夾和容器中的mysql文件夾做同步。

docker run -d -p 3306:3306 -v $PWD:/etc/mysql --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql 

我們在上面啟動的時候順便指定了創(chuàng)建密碼為123456,我們現在登陸一下mysql創(chuàng)建一些數據,看看會不會被保存下來

shell>mysql -u admin -p some-data-base -h 127.0.0.1
mysql>create database test;

-p后面的some-data-base是指定database,可省略,-h 127.0.0.1亦可省略
退出mysql,重啟Container,發(fā)現我們做的操作將會被保留下來.我們之后每一次啟動這個mysql都可以使用下面的命令

docker run -d --name mysql -p 3306:3306 -v /c/data/docker/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  mysql

另一種做法是先運行一個沒有掛在volume卷的容器,然后拷貝到本地,在重新運行

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

將容器中的目錄文件復制到宿主機中,分別包括:

  • mysql 配置文件;
  • 數據存儲目錄,以便掛載(PS: 若不掛載到宿主機,每次啟動容器數據都會丟失)
# 將容器中的 mysql 配置文件復制到宿主機中指定路徑下,路徑你可以根據需要,自行修改
docker cp /etc/mysql/mysql.conf.d/mysqld.cnf /c/data/docker/mysql/config
# 將容器中的 mysql 存儲目錄復制到宿主機中
docker cp /var/lib/mysql/ /c/data/docker/mysql/data
docker run -d --name mysql -p 3306:3306 -v /c/data/docker/mysql/config/:/etc/mysql/config/ -v /c/data/docker/mysql/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

值得注意的事:
和Data Volume不同的是,bind Mounting只能通過 docker run -v 方式啟動,無法使用dockerfile文件的方式。
運行容器的時候指定本地的一個文件目錄和容器中的一個文件目錄的映射,通過這個可以做文件數據同步,雙方無論哪一方有修改,另一方都會同步內容

docker run -d --name mysql -p 3306:3306 -v /c/data/docker/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  mysql

這個時候 -v :前面的參數是本機文件路徑, :后面是docker文件目錄(容器),
此時的-v mysqlmysql是volume卷名稱
使用bind Mounting方式做數據卷的映射時,首次 docker run -v運行,如果本機的文件夾是沒有內容的,docker容器中的文件夾是有內容的,則本機的會覆蓋dokcer容器中的,也就是容器中原本有內容的也會沒有內容。

dockers Data Volume 結構圖

//進入容器修改mysql root密碼
解決方案:

進入容器:
docker exec -it 62349aa31687 /bin/bash
進入mysql:
mysql -u root -p
授權:
mysql> GRANT ALL ON . TO 'root'@'%';
刷新權限:
mysql> flush privileges;
更新加密規(guī)則:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
更新root用戶密碼:
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
刷新權限:

mysql> flush privileges;

參考:
http://m.itdecent.cn/p/530d00f97cbf
[docker 官網: ]https://docs.docker.com/storage/
[docker hub官網: ]https://hub.docker.com/_/mysql
[mysql 官網: ]https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容