http://www.itdecent.cn/p/530d00f97cbf
https://blog.csdn.net/qq_32616177/article/details/80452456
http://www.itdecent.cn/p/6a1b06ab8734
http://www.itdecent.cn/p/33f7a3333118
1、加上-v參數(shù)
$ docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql
還可以指定配置文件
docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql
這樣,即可修改配置文件,還能把數(shù)據(jù)存在本地目錄,一舉兩得,-v 參數(shù)可以多次使用,每次映射一個目錄,通過這種方式,很容易進行配置。。
docker run -d -p 3306:3306 -v /home/walter/softwares/tutum-docker-mysql/data:/var/lib/mysql -e MYSQL_PASS="mypass" -t 53cb780844a3
Docker MySQL 把數(shù)據(jù)存儲在本地目錄,很簡單,只需要映射本地目錄到容器即可
1、加上-v參數(shù)
$ docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql
還可以指定配置文件
docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql
這樣,即可修改配置文件,還能把數(shù)據(jù)存在本地目錄,一舉兩得,-v 參數(shù)可以多次使用,每次映射一個目錄,通過這種方式,很容易進行配置。。
docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql --lower_case_table_names=1
解釋如下:
-d 容器在后臺運行
-e MYSQL_ROOT_PASSWORD=admin 配置mysql root的密碼
-v 對mysql 的配置文件和數(shù)據(jù)存儲路徑進行映射到宿主機,對數(shù)據(jù)持久化
-p 端口映射
--name 定義容器的名稱
--lower_case_table_names=1 定義數(shù)據(jù)庫不區(qū)分表名大小寫
通過上一節(jié)的學(xué)習(xí),我們知道了如何部署一個不帶數(shù)據(jù)庫的靜態(tài)nginx頁面;但一般的web應(yīng)用中,還需要部署mysql數(shù)據(jù)庫,本節(jié)我們將學(xué)習(xí)如何使用容器部署mysql數(shù)據(jù)庫。
01
mysql獨立部署
我們可以將mysql與web應(yīng)用部署在同一個容器內(nèi),但更一般的用法是將mysql獨立部署一個容器。
獲取mysql5.6.36官方鏡像
(mysql5.7變動較大,推薦使用5.6)
docker pull mysql:5.6.36
我們可以進入mysql:5.6.36容器進行mysql遠程登錄的相關(guān)設(shè)置。
運行mysql:5.6.36容器,-p映射為宿主機3306端口
docker run -it -p 3306:3306 mysql:5.6.36 /bin/bash
開啟mysql進程
root@0950cf64b8e6:/# service mysql start
進入mysql
root@0950cf64b8e6:/# mysql
修改root用戶密碼為123456
mysql> update user set password=password("123456") where user='root';
允許遠程用戶訪問(一般應(yīng)當設(shè)置為白名單IP,此處為所有IP)
mysql> GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
驗證是否設(shè)置成功,host中含有%
mysql> select host, user from user;
保存退出
mysql> flush privileges;
mysql> exit;
停止容器后,保存當前鏡像為webmysql
root@0950cf64b8e6:/# docker stop 0950cf64b8e6
root@0950cf64b8e6:/# docker commit 0950 webmysql
以上設(shè)置完成后,我們在宿主機上安裝mysql客戶端,就可以通過宿主機的IP進行mysql數(shù)據(jù)庫的使用了。
02
mysql數(shù)據(jù)持久化
對于容器數(shù)據(jù)庫來說,一旦容器停止,容器中的數(shù)據(jù)就會消失,不利于數(shù)據(jù)存儲,雖然我們可以通過定時commit的方法來保存容器中的數(shù)據(jù),但我們有更好的實現(xiàn)方法。
使用-v共享存儲
mysql默認的數(shù)據(jù)存儲目錄為/var/lib/mysql,我們可以通過宿主機共享容器/var/lib/mysql目錄的方式來實現(xiàn)數(shù)據(jù)的持久化。
帶-v參數(shù)啟動webmysql
docker run -it -v /var/mysql/data:/var/lib/mysql -p 3306:3306 mysql:5.6.36 /bin/bash
鏡像啟動后,我們啟動mysql服務(wù),發(fā)現(xiàn)mysql無法啟動。查找官方文檔,因SElinux服務(wù)開啟,需要在宿主機執(zhí)行如下命令:
chcon -Rt svirt_sandbox_file_t /var/mysql/data
或者關(guān)閉SElinux也可以。
臨時關(guān)閉
setenforce 0
修改配置文件,需要重啟
vim /etc/selinux/config
SELINUX=disabled
上述配置完成后,仍然無法啟動mysql,結(jié)合mysql日志查看可能是文件權(quán)限的問題,在宿主機上給予共享文件夾對應(yīng)的權(quán)限:
賦予本地存儲對應(yīng)的權(quán)限,單讀寫權(quán)限不行
chmod 777 -R /var/mysql/data/
設(shè)置完成后,容器可以啟動mysql服務(wù)。
在宿主機查看/var/mysql/data/文件夾下,發(fā)現(xiàn)已經(jīng)將/var/lib/mysql/文件夾內(nèi)容同步,使用stop關(guān)閉容器后,文件夾數(shù)據(jù)不會消失。再次啟動容器mysql后,數(shù)據(jù)庫內(nèi)容仍然存在。數(shù)據(jù)持久化設(shè)置完成。
03
連接mysql容器
3.1 mycentos容器使用link連接
啟動mysql容器
docker run --name=mysql_server -it -v /var/mysql/data:/var/lib/mysql -p 3306:3306 webmysql /bin/bash
--name=mysql_server指定了容器運行的name
啟動mycentos容器
docker run --link=mysql_server:db -it -p 80:80 mycentos /bin/bash
--link=mysql_server:db,指定了能夠與mysql數(shù)據(jù)庫容器繼續(xù)連接,db指定了一個連接的別名
在mycentos上安裝mysql客戶端后就可以使用命令行登錄mysql:
mysql -h db -uroot -p123456
MySQL [(none)]>
在web應(yīng)用的配置文件中,更改數(shù)據(jù)庫的配置即可:
host: db
username: root
password: 123456
3.2 宿主機使用IP連接
部分情況下,我們可能需要使用宿主機連接登錄mysql容器,這樣顯然不能使用link的方法。
容器與宿主機之間是通過bridge進行的網(wǎng)絡(luò)連接,我們可以通過使用內(nèi)網(wǎng)IP地址連接容器mysql。
查看webmysql容器的IP地址,e79dd0dc4f1f為其docker ps顯示的ID
docker inspect --format '{ { .NetworkSettings.IPAddress } }' e79dd0dc4f1f
172.17.0.a
其地址為172.17.0.a,我們可以使用該IP地址登錄容器mysql
mysql -h 172.17.0.a -uroot -p123456
MySQL [(none)]>
值得注意的是,這種使用IP的方法也適用于容器與容器之間的mysql的連接,容器連接宿主機mysql。
04
更多主題探討
通過這幾節(jié)的學(xué)習(xí),我們能夠使用容器部署網(wǎng)站與數(shù)據(jù)庫,然而對于docker技術(shù)而言,這只是其中最基礎(chǔ)的使用。以下是與web部署強相關(guān)的主題:
1、通過commit,我們能夠保存對容器的更改存儲在宿主機,但當宿主機出現(xiàn)問題時,就需要進行使用鏡像恢復(fù)。這涉及到如何備份與恢復(fù)images鏡像。
2、我們創(chuàng)建容器mycentos與webmysql,都是通過手動的方式,而docker更一般的用法是使用Dockerfile,我們可以嘗試這種更簡便的使用方法。
05
參考資料
1、MySQL 官方 Docker 鏡像的使用,https://www.cnblogs.com/cfrost/p/6241892.html
2、自己學(xué)Docker:8.容器的持久化,http://blog.csdn.net/mungo/article/details/51472130
3、mysql,https://hub.docker.com/_/mysql/
4、查看 SELinux狀態(tài)及關(guān)閉SELinux,http://blog.51cto.com/bguncle/957315
5、docker容器鏈接宿主機mysql,https://segmentfault.com/a/1190000008701796
6、Docker中容器的備份、恢復(fù)和遷移,http://www.linuxidc.com/Linux/2015-08/121184.htm
7、Docker使用link建立容器之間的連接,http://www.itdecent.cn/p/13752117ff97