環(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í)際的操作步驟:
- 在主機(jī)上先創(chuàng)建要用于掛載的目錄逾一。比如
G:/Docker/mysql/mysql5.5.60/date
- 在
Docker Setting > Shared Drives
中選中 G 盤(之后會(huì)需要輸入你的系統(tǒng)的管理員密碼),這使得Docker能夠使用你G盤肮雨。 - 最后執(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)命令
錯(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').
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ù)。不知道怎么解決树灶。