如何進(jìn)入啟動(dòng)的mysql docker容器
我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、武隆ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的武隆網(wǎng)站制作公司
如果將來(lái)數(shù)據(jù)庫(kù)服務(wù)也在容器中提供,
建議使用link的方式,代碼中使用環(huán)境變量獲取實(shí)際地址。
如果數(shù)據(jù)庫(kù)服務(wù)不在容器中,
可以以常規(guī)方式配置到配置文件中,
將來(lái)將配置文件以掛卷的方式映射到本機(jī)目錄,便于修改。
雖然 kubernetes 社區(qū)一直在努力使得有狀態(tài)應(yīng)用成為一等公民,也推出了 statefulset 控制器支持 pod 的順序部署,穩(wěn)定的域名訪問(wèn)和存儲(chǔ)訪問(wèn)。但鑒于 MySQL 部署運(yùn)維的多樣性和復(fù)雜性,在 kubernetes 上部署 MySQL 仍然要面臨眾多挑戰(zhàn)。
1、業(yè)務(wù)流量入口的配置方式
傳統(tǒng)虛擬機(jī)環(huán)境下,我們通過(guò)虛IP的方式,讓業(yè)務(wù)應(yīng)用都配置事先定義的一個(gè)虛IP為鏈接數(shù)據(jù)庫(kù)的地址,然后由高可用服務(wù)保證虛IP始終能被路由到master數(shù)據(jù)庫(kù)。在kubernetes中,出現(xiàn)了一層網(wǎng)絡(luò)插件屏蔽了底層網(wǎng)絡(luò)拓?fù)?,高可用服?wù)管理虛IP的方式需要隨之適應(yīng)調(diào)整,比如通過(guò)service結(jié)合標(biāo)簽完成虛IP的漂移,但service本身是kubernetes提供的一項(xiàng)功能,其可靠性和性能都取決于kubernetes服務(wù)的穩(wěn)定。以性能來(lái)說(shuō),service是kubeproxy組件通過(guò)配置iptables實(shí)現(xiàn)的,當(dāng)iptables規(guī)則較多時(shí)不可避免的會(huì)產(chǎn)生時(shí)延,需要我們針對(duì)性的解決。
2、容器隔離帶來(lái)的監(jiān)控視野問(wèn)題
在 kubernetes 中,如果將 MySQL 制作為 container 運(yùn)行在一個(gè) pod 中,container 會(huì)將 MySQL 進(jìn)程和運(yùn)行環(huán)境隔離在一個(gè)單獨(dú)的 namespace 中。監(jiān)控組件在獲取 MySQL 的一些 metirc 時(shí),可能不得不進(jìn)入與 MySQL 同一個(gè) namespace 中,在部署和設(shè)計(jì)監(jiān)控組件時(shí)需要考慮到這些限制。
3、存儲(chǔ)在 kubernetes 中,支持配置各種不同的存儲(chǔ)。
如果使用本地存儲(chǔ) local persistent volume,則需要綁定 MySQL 在一個(gè)固定的節(jié)點(diǎn),這就完全浪費(fèi)了 kubernetes 靈活調(diào)度的天然優(yōu)勢(shì);而如果使用遠(yuǎn)程共享存儲(chǔ),確實(shí)是將 MySQL 進(jìn)程與其存儲(chǔ)完全解耦,使得 MySQL 進(jìn)程可以在任意節(jié)點(diǎn)調(diào)度,然而考慮到高 I/O 吞吐量的情況,就不是那么美好了。設(shè)計(jì)時(shí)需要考量遠(yuǎn)程存儲(chǔ)是否能夠滿足 MySQL 的帶寬要求。
4、高可用/備份恢復(fù)
kubernetes 提供的 statefulset 控制器只能提供最基本的部署,刪除功能,無(wú)法實(shí)現(xiàn)完善的 MySQL 集群高可用/備份恢復(fù)操作。對(duì)于有狀態(tài)應(yīng)用的部署,仍需要定制開(kāi)發(fā),所以多數(shù)公司提供了定制的 operator 來(lái)完成應(yīng)用容器的管理。比如 etcd operator,MySQL operator,后文將為大家詳述我測(cè)試使用 MySQL operator 的一些記錄。
步驟:
1. 首先創(chuàng)建一個(gè)目錄并在目錄下創(chuàng)建一個(gè)Dockerfile,文件內(nèi)容如下
[plain] view plain copy print?
FROM centos:centos6
MAINTAINER Fanbin Kong "kongxx@hotmail.com"
RUN yum install -y mysql-server mysql
RUN /etc/init.d/mysqld start \
mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'letmein';"\
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'letmein';"\
mysql -u root -pletmein -e "show databases;"
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
2. 在Dockerfile所在目錄下運(yùn)行build命令來(lái)生成image文件,這里使用mysql_server作為image文件名
[plain] view plain copy print?
sudo docker build -t mysql_server .
運(yùn)行完build命令后,可以使用“sudo docker images”來(lái)查看。
3. 啟動(dòng)容器
3.1 首先使用下面的命令來(lái)啟動(dòng)容器
[plain] view plain copy print?
sudo docker run --name=mysqlserver -d -P mysql_server
啟動(dòng)完容器后,可以使用“sudo docker ps”來(lái)查看,此時(shí)可以看PORTS列內(nèi)容為“0.0.0.0:49153-3306/tcp”,容器的3306端口會(huì)被映射到宿主機(jī)器的49153端口,這樣我們就可以通過(guò)宿主機(jī)器的49153端口來(lái)連接了,比如:
[plain] view plain copy print?
mysql -h 宿主機(jī)器 -u root -pletmein -P 49153
3.2 另外在運(yùn)行容器的時(shí)候也可以通過(guò)下面的命令
[plain] view plain copy print?
sudo docker run --name=mysqlserver -d -p 3306:3306 mysql_server
此時(shí)容器的3306端口會(huì)被映射到宿主機(jī)器的3306端口,這樣我們就可以通過(guò)宿主機(jī)器的3306端口訪問(wèn)mysql了
[plain] view plain copy print?
mysql -h 宿主機(jī)器 -u root -pletmein
3.3 還有一種情況就是為了安全考慮,我只希望當(dāng)前的宿主機(jī)器可以訪問(wèn)mysql服務(wù),此時(shí)我們可以
[plain] view plain copy print?
sudo docker run --name=mysqlserver -d -p 127.0.0.1:3306:3306 mysql_server
●客戶端訪問(wèn)服務(wù)端
。利用Windows控制臺(tái)訪問(wèn)(MySQL客戶端)
。利用數(shù)據(jù)庫(kù)管理工具(Navicat)
●客戶端需要連接認(rèn)證
。-h: 主機(jī)地址(本機(jī)localhost可以省略)
。-P: 端口號(hào)(默認(rèn)3306可以省略)
。-u: 用戶名
。-p: 用戶密碼