您好,登錄后才能下訂單哦!
本文提要
本文目的不僅僅是創(chuàng)建一個(gè)MySQL的鏡像,而是在其基礎(chǔ)上再實(shí)現(xiàn)啟動(dòng)過程中自動(dòng)導(dǎo)入數(shù)據(jù)及數(shù)據(jù)庫(kù)用戶的權(quán)限設(shè)置,并且在新創(chuàng)建出來(lái)的容器里自動(dòng)啟動(dòng)MySQL服務(wù)接受外部連接,主要是通過Dockerfile和shell腳本實(shí)現(xiàn)這一過程。
搭建步驟
1、首先創(chuàng)建Dckerfile:
FROM mysql:5.7 #設(shè)置免密登錄 ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #將所需文件放到容器中 COPY setup.sh /mysql/setup.sh COPY schema.sql /mysql/schema.sql COPY privileges.sql /mysql/privileges.sql #設(shè)置容器啟動(dòng)時(shí)執(zhí)行的命令 CMD ["sh", "/mysql/setup.sh"]
2、編寫容器啟動(dòng)腳本setup.sh:
#!/bin/bash set -e #查看mysql服務(wù)的狀態(tài),方便調(diào)試,這條語(yǔ)句可以刪除 echo `service mysql status` echo '1.啟動(dòng)mysql....' #啟動(dòng)mysql service mysql start sleep 3 echo `service mysql status` echo '2.開始導(dǎo)入數(shù)據(jù)....' #導(dǎo)入數(shù)據(jù) mysql < /mysql/schema.sql echo '3.導(dǎo)入數(shù)據(jù)完畢....' sleep 3 echo `service mysql status` #重新設(shè)置mysql密碼 echo '4.開始修改密碼....' mysql < /mysql/privileges.sql echo '5.修改密碼完畢....' #sleep 3 echo `service mysql status` echo `mysql容器啟動(dòng)完畢,且數(shù)據(jù)導(dǎo)入成功` tail -f /dev/null
這里是先導(dǎo)入數(shù)據(jù),然后才是設(shè)置用戶和權(quán)限,是因?yàn)閙ysql容器一開始為免密登錄,Dockerfile中有如下設(shè)置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
,此時(shí)執(zhí)行導(dǎo)入數(shù)據(jù)命令不需要登錄驗(yàn)證操作,如果是先執(zhí)行權(quán)限操作,那么導(dǎo)入數(shù)據(jù)則需要登錄驗(yàn)證,整個(gè)過程就麻煩了許多。
3、需要導(dǎo)入數(shù)據(jù)的mysql腳本命令schema.sql:
-- 創(chuàng)建數(shù)據(jù)庫(kù) create database `docker_mysql` default character set utf8 collate utf8_general_ci; use docker_mysql; -- 建表 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `created_at` bigint(40) DEFAULT NULL, `last_modified` bigint(40) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `first_name` varchar(255) DEFAULT NULL, `last_name` varchar(255) DEFAULT NULL, `username` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- 插入數(shù)據(jù) INSERT INTO `user` (`id`, `created_at`, `last_modified`, `email`, `first_name`, `last_name`, `username`) VALUES (0,1490257904,1490257904,'john.doe@example.com','John','Doe','user');
因?yàn)槭菧y(cè)試,所以隨便寫了一個(gè)建表語(yǔ)句,如果是真實(shí)項(xiàng)目肯定不止這一張表,直接將建表語(yǔ)句覆蓋過來(lái)就好。
4、mysql權(quán)限設(shè)置命令privileges.sql:
use mysql; select host, user from user; -- 因?yàn)閙ysql版本是5.7,因此新建用戶為如下命令: create user docker identified by '123456'; -- 將docker_mysql數(shù)據(jù)庫(kù)的權(quán)限授權(quán)給創(chuàng)建的docker用戶,密碼為123456: grant all on docker_mysql.* to docker@'%' identified by '123456' with grant option; -- 這一條命令一定要有: flush privileges;
5、創(chuàng)建鏡像
docker build -t 13/docker-mysql .
docker build 為創(chuàng)建鏡像命令,名稱為13/docker-mysql,'.'表示當(dāng)前目錄,即Dockerfile文件所在的目錄,創(chuàng)建過程如下:
執(zhí)行docker images查看該鏡像是否存在于鏡像列表中:
創(chuàng)建成功。
6、啟動(dòng)容器
docker run -d -p 13306:3306 13/docker-mysql
啟動(dòng)容器,并將端口映射到本地的13306端口,命令行如圖所示:
容器啟動(dòng)成功。
查看容器的日志記錄,啟動(dòng)過程與啟動(dòng)腳本setup.sh中所規(guī)范的步驟一致,數(shù)據(jù)導(dǎo)入和權(quán)限設(shè)置成功:
驗(yàn)證結(jié)果
1、通過進(jìn)入容器在命令行驗(yàn)證
啟動(dòng)時(shí)容器的id為9db491b1d760,因此執(zhí)行exec命令進(jìn)入容器:
docker exec -it 9db491b1d760 /bin/bash
這個(gè)命令不要直接使用,因?yàn)樵谀銠C(jī)器上id可能不同,替換掉id值即可。
前文中創(chuàng)建了docker_mysql數(shù)據(jù)庫(kù),并在此數(shù)據(jù)庫(kù)中創(chuàng)建了user表,同時(shí)將數(shù)據(jù)庫(kù)的連接授權(quán)賦予了新建的docker用戶,因此驗(yàn)證過程為:
整個(gè)過程如下:
通過圖中的結(jié)果對(duì)比,與前文一致,驗(yàn)證成功。
2、通過mysql客戶端管理軟件驗(yàn)證
通過圖中的結(jié)果對(duì)比,與前文一致,驗(yàn)證成功。
結(jié)語(yǔ)
本篇文章是單獨(dú)介紹了一下創(chuàng)建mysql鏡像的步驟,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。