使用Docker安裝mysql 5 和 mysql 8

環(huán)境: Windows 10 + Docker for windows Version 18.03.1-ce-win65 (17513)
Docker的學(xué)習(xí)推薦:Docker —— 從入門到實(shí)踐
Docker for windows的安裝參考:Install Docker for Windows

安裝 mysql 5.5

該鏡像在Docker Hub上的地址為:library/mysql 柳畔,打開該連接惫搏,默認(rèn)展示 Repo info 標(biāo)簽頁(該標(biāo)簽頁中包含了一些操作該容器的方法)中的內(nèi)容吸重,如果想查看該image大小和各標(biāo)簽霞篡,可切換到 "Tags"標(biāo)簽頁查看。

拉取鏡像:

docker pull mysql:5.5.60

運(yùn)行容器:

這里只是個(gè)簡單示例萧锉,先用于理解各個(gè)參數(shù)的含義珊随,完整的命令見后文:

docker run   --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=fan123 -d mysql:5.5.60
  • --name:指定容器名 ,這里是mysql
  • -p 3306:3306:將容器的 3306 端口映射到主機(jī)的 3306 端口柿隙。
  • -e MYSQL_ROOT_PASSWORD=123456:設(shè)置環(huán)境變量 叶洞,這里是初始化 root 用戶的密碼。
  • -d: 后臺(tái)運(yùn)行容器禀崖,并返回容器ID
  • mysql:5.5.60:表示你之前下載的鏡像衩辟。它表示使用 mysql:5.5.60該鏡像為基礎(chǔ)來啟動(dòng)容器。

mysql:5.5.60對應(yīng)的格式為 mysql:tag 波附,使用該格式表示某鏡像艺晴,即:容器名: 版本

示例

# 運(yùn)行容器
$ docker run  --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5.60
a936fdfe89b527e1ea9bdca45014112e502572d10d35638cba257175b092a2f8
# 查看該容器
$ docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
a936fdfe89b5        mysql:5.5.60         "docker-entrypoint.s…"   10 seconds ago      Up 5 seconds        0.0.0.0:3306->3306/tcp   mysql

進(jìn)入mysql容器:

在使用-d參數(shù)時(shí)叶雹,容器啟動(dòng)后會(huì)進(jìn)入后臺(tái)财饥。如果此時(shí)需要進(jìn)入容器進(jìn)行操作换吧,可以使用docker exec命令.

# 先查看運(yùn)行中的容器
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a936fdfe89b5        mysql:5.5.60        "docker-entrypoint.s…"   39 minutes ago      Up 39 minutes       0.0.0.0:3306->3306/tcp   mysql
# 可以看到mysql容器的短id值折晦,這里我們?nèi)∏?位即可辨識(shí)
# 使用docker exec進(jìn)入容器, -it 表示交互式終端  bash 表示使用熟悉的Linux命令提示符形式
$ docker exec -it a936 bash
root@a936fdfe89b5:/#
# 然后運(yùn)行如下命令連接mysql
root@a936fdfe89b5:/# mysql -uroot -p12345
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.60 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

終止mysql容器:

# 之前已經(jīng)知道了 mysql 容器的 id值沾瓦,使用 a936即可標(biāo)識(shí)該容器

# 那么可以使用下面的命令關(guān)閉容器
docker container stop a936

# 當(dāng)然使用 mysql來標(biāo)識(shí)該容器也是可以的
docker container stop mysql

# 使用ps檢查該容器
docker ps -a
# 或 
docker container ls -a

# 處于終止的容器還可使用下面的命令重新啟動(dòng)
docker container start mysql

刪除一個(gè)處于終止?fàn)顟B(tài)的容器:
運(yùn)行上面的容器僅僅是為了演示满着,所以我們將其刪除谦炒,將在下文講解如何真正運(yùn)行該數(shù)據(jù)庫容器。

docker container rm a936

存在的三個(gè)問題:

  • 數(shù)據(jù)保存的路徑在哪风喇?
  • 如何編輯mysql的配置文件宁改?比如需要修改字符集為utf8
  • 如何查看日志文件

當(dāng)實(shí)際使用時(shí)還需要考慮,在該容器中mysql的各種文件存放的位置在哪里魂莫,只有知道了相關(guān)目錄那么我們就可以通過使用 -v掛載主機(jī)中的目錄來替換容器中的目錄:

相關(guān)文件的路徑可以通過查看mysql映像本身內(nèi)的相關(guān)文件(比如看看Dockerfile中)和目錄以獲取更多詳細(xì)信息还蹲。

查看該鏡像的Dockerfile文件或library/mysql中的說明可知:

  • 數(shù)據(jù)目錄位于 /var/lib/mysql;所以我們可以在docker run 命令中添加下面的選項(xiàng)來覆蓋該目錄:

    -v G:/Docker/mysql/mysql5.5.60/date:/var/lib/mysql
    

    意為耙考,將本機(jī)G盤下的 G:/Docker/mysql/mysql5.5.60/date 目錄掛載到容器的/var/lib/mysql目錄上 (掛載效果與Linux中的掛載一樣)

  • 默認(rèn)配置文件目錄位于 /etc/mysql/my.cnf對于該配置文件我們可以直接覆蓋谜喊,如果在Dockerfile中還看到!includedir /etc/mysql/conf.d/,那么說明mysql會(huì)先加載 my.cnf 中的配置,再加載 conf.d 文件夾中配置文件的的配置倦始,利用這一點(diǎn)我們可以保留 my.cnf 中的配置斗遏,而將自定義的配置文件放在 conf.d 目錄下。

    所以我們可以在docker run 命令中添加下面的選項(xiàng)來覆蓋該目錄:

    -v G:/Docker/mysql/mysql5.5.60/custom:/etc/mysql/conf.d
    

    那么我們可以在本機(jī)G盤的 G:/Docker/mysql/mysql5.5.60/custom 目錄下創(chuàng)建一個(gè)名為config-file.cnf配置文件鞋邑,mysql容器就會(huì)加載該配置文件诵次。

config-file.cnf文件內(nèi)容:(為了設(shè)置服務(wù)端編碼)

[mysqld]
  character_set_server=utf8

脫離配置文件,直接在命令中配置:

參考文檔library/mysql的 “Configuration without a cnf file” 部分

參考: library/mysql - Docker Hub 下的 Using a custom MySQL configuration file

mysql 鏡像 的Dockerfile 文件也可以在上面鏈接中找到枚碗。

實(shí)際的操作步驟:

  1. 在主機(jī)上先創(chuàng)建要用于掛載的目錄逾一。比如G:/Docker/mysql/mysql5.5.60/date
  2. Docker Setting > Shared Drives 中選中 G 盤(之后會(huì)需要輸入你的系統(tǒng)的管理員密碼),這使得Docker能夠使用你G盤肮雨。
  3. 最后執(zhí)行下面的命令(自行做一些相應(yīng)的更改)

啟動(dòng)一個(gè) mysql 容器的最終命令:

$ docker run --name mysql5.5 -v G:/Docker/mysql/mysql5.5.60/custom:/etc/mysql/conf.d -v G:/Docker/mysql/mysql5.5.60/date:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密碼 -d mysql:5.5.60

安裝mysql 8

先 pull 鏡像:

docker pull mysql

運(yùn)行容器:

創(chuàng)建保存數(shù)據(jù)和配置文件的目錄嬉荆,下面的命令中需要使用

docker run --name mysql-latest -v G:/Docker/mysql/mysql-latest/custom:/etc/mysql/conf.d -v G:/Docker/mysql/mysql-latest/data:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=密碼 -d mysql:latest

注意:先不要在你的配置文件G:/Docker/mysql/mysql-latest/customconfig-file中添加任何內(nèi)容,測試容器能否正常運(yùn)行酷含。如果可以鄙早,再往配置文件中添加配置,這樣可以方便排除錯(cuò)誤椅亚;因?yàn)榕f版的mysql配置不一定適用于新版的mysql限番。下面的錯(cuò)誤的源頭就是配置文件的問題(我也一直沒有想到是它的問題)。

出現(xiàn)錯(cuò)誤的配置文件內(nèi)容:

[mysqld]
    character_set_server=utf8
    lower_case_table_names=1

其中就是: lower_case_table_names=1 導(dǎo)致了錯(cuò)誤呀舔,容器無法運(yùn)行弥虐。

還有就是用于保存mysql數(shù)據(jù)的目錄需為空目錄。

可參考: docker安裝mysql遇到的問題 - CSDN博客

這里說了mysql 8 的各種問題的原由MySQL 8.0.11的更新之路 - 為程序員服務(wù)

錯(cuò)誤1:無法遠(yuǎn)程連接數(shù)據(jù)庫

當(dāng)時(shí)我自己是可以進(jìn)行遠(yuǎn)程連接媚赖,所以這里只作記錄霜瘪;奇怪的現(xiàn)象是居然提示 mysql.user 表不存在:

mysql> select host,user,plugin,authentication_string from mysql.user;
ERROR 1146 (42S02): Table 'mysql.user' doesn't exist

如果 mysql 服務(wù)器版本大于 8.0.4,那么默認(rèn)使用 caching_sha2_password 授權(quán)插件惧磺,而不是 5.6 / 5.7 使用的 mysql_native_password 進(jìn)行身份驗(yàn)證颖对。

使用下面的方法更改root賬戶的遠(yuǎn)程登錄驗(yàn)證插件為 mysql_native_password:

alter user 'root'@'%' identified with mysql_native_password by 'youPassword';

flush privileges;

下面三篇文章中都牽涉到驗(yàn)證插件相關(guān)命令

Docker安裝MySQL8

Docker安裝mysql8 - CSDN博客

docker mysql 8.0

錯(cuò)誤2:No data dictionary version number found

最開始只關(guān)注到了與其一同出現(xiàn)的警告而忽略了警告下面的這個(gè)錯(cuò)誤,當(dāng)時(shí)的log是:

警告1:Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default.

λ .\docker-run-mysql-latest.bat;

docker run --name mysql-latest -v G:\Docker\mysql\mysql-latest\custom:/etc/mysql/conf.d -v G:/Docker/mysql/mysql-latest/date:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=fan123  mysql:latest

2018-06-30T08:12:14.289452Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.

[翻譯]使用--skip-symbolic-links(或等效)禁用符號(hào)鏈接是默認(rèn)設(shè)置磨隘$偷祝考慮不使用此選項(xiàng)顾患,因?yàn)樗驯粭売茫⒃谖磥戆姹局袆h除个唧。

2018-06-30T08:12:14.289643Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.11) starting as process 1 
mbind: Operation not permitted
mbind:不允許操作
mbind: Operation not permitted

# 搞錯(cuò)了目標(biāo)江解,上面只是 Warning ;而下面才是ERROR徙歼,導(dǎo)致退出的真正原因
2018-06-30T08:12:15.310586Z 1 [ERROR] [MY-011096] [Server] No data dictionary version number found.
2018-06-30T08:12:15.311077Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2018-06-30T08:12:15.311107Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-06-30T08:12:16.560222Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.11)  MySQL Community Server - GPL.

真正的問題是 錯(cuò)誤1:No data dictionary version number found

一切錯(cuò)誤的原因 是我直接復(fù)制了 mysql 5.5的配置文件犁河,導(dǎo)致一系列問題,也就是前文我說的配置文件相關(guān)的問題魄梯。

解決辦法見上文呼股。

錯(cuò)誤原因見: MySQL 8.0.11 報(bào)錯(cuò) Different lower_case_table_names settings for server ('1') - CSDN博客

背景知識(shí):

MySQL8.0 新增了data dictionary的概念,數(shù)據(jù)初始化的時(shí)候在linux下默認(rèn)使用lower-case-table-names=0的參數(shù)画恰,數(shù)據(jù)庫啟動(dòng)的時(shí)候讀取的 my.cnf 文件中的值彭谁。若二者值不一致則在mysql的錯(cuò)誤日志中記錄報(bào)錯(cuò)信息。

在MySQL 5.7之前則允許數(shù)據(jù)庫初始化和啟動(dòng)的值不一致且以啟動(dòng)值為準(zhǔn)允扇。
在MySQL 官方提供的RPM包中默認(rèn)是使用 lower-case-table-names=0缠局,不太適合生產(chǎn)環(huán)境部署。在生產(chǎn)環(huán)境建議使用官方的二進(jìn)制包考润。

官方解釋:

After initialization, is is not allowed to change this setting.So "lower_case_table_names" needs to be set together with --initialize .

解決辦法:

在mysql數(shù)據(jù)庫初始化的時(shí)候指定不區(qū)分大小寫狭园,在數(shù)據(jù)庫實(shí)例啟動(dòng)的時(shí)候也要指定不區(qū)分大小寫。即數(shù)據(jù)庫初始化時(shí)lower_case_table_names的值和數(shù)據(jù)庫啟動(dòng)時(shí)的值需要一樣糊治。

在實(shí)際開發(fā)生產(chǎn)的應(yīng)用中多是不區(qū)分大小寫的即lower-case-table-names=1唱矛。

操作步驟:

 /usr/local/mysql/bin/mysqld --user=mysql --lower-case-table-names=1 --initialize-insecure --basedir=/usr/local/mysql --datadir=/data/mysql/node1

my.cnf

 [mysqld]
 lower_case_table_names = 1

若初始化和啟動(dòng)值不一樣則會(huì)在錯(cuò)誤日志中有如下提示:

 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').

參考資料 https://bugs.mysql.com/bug.php?id=90695

2018.06,為什么mysql image 都提示有 " This image has vulnerabilities(漏洞) "井辜?
標(biāo)記為這類的鏡像以為著有漏洞绎谦。這些漏洞通常來自他們所基于的系統(tǒng)或者上層鏡像所帶有的軟件以及依賴庫,當(dāng)然也有可能就是軟件本身的問題粥脚。 這個(gè)提示只是表示鏡像所基于的環(huán)境是存在漏洞的窃肠,并不代表漏洞一定會(huì)被攻擊。 你可以選擇使用其Dockerflie重新構(gòu)建鏡像刷允,對有漏洞的軟件進(jìn)行更新冤留,也可以針對漏洞在防火墻層面進(jìn)行防護(hù)。

不知道怎么解決树灶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纤怒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子天通,更是在濱河造成了極大的恐慌泊窘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異州既,居然都是意外死亡谜洽,警方通過查閱死者的電腦和手機(jī)萝映,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門吴叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人序臂,你說我怎么就攤上這事蚌卤。” “怎么了奥秆?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵逊彭,是天一觀的道長。 經(jīng)常有香客問我构订,道長侮叮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任悼瘾,我火速辦了婚禮囊榜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亥宿。我一直安慰自己卸勺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布烫扼。 她就那樣靜靜地躺著曙求,像睡著了一般。 火紅的嫁衣襯著肌膚如雪映企。 梳的紋絲不亂的頭發(fā)上悟狱,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音堰氓,去河邊找鬼芽淡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豆赏,可吹牛的內(nèi)容都是我干的挣菲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼掷邦,長吁一口氣:“原來是場噩夢啊……” “哼白胀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抚岗,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤或杠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宣蔚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向抢,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡认境,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挟鸠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉信。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艘希,靈堂內(nèi)的尸體忽然破棺而出硼身,到底是詐尸還是另有隱情,我是刑警寧澤覆享,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布佳遂,位于F島的核電站,受9級(jí)特大地震影響撒顿,放射性物質(zhì)發(fā)生泄漏丑罪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一凤壁、第九天 我趴在偏房一處隱蔽的房頂上張望吩屹。 院中可真熱鬧,春花似錦客扎、人聲如沸祟峦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宅楞。三九已至,卻和暖如春袱吆,著一層夾襖步出監(jiān)牢的瞬間厌衙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工绞绒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婶希,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓蓬衡,卻偏偏與公主長得像喻杈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子狰晚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容