本文提要
本文目的不僅僅是創(chuàng)建一個MySQL的鏡像,而是在其基礎(chǔ)上再實現(xiàn)啟動過程中自動導(dǎo)入數(shù)據(jù)及數(shù)據(jù)庫用戶的權(quán)限設(shè)置,并且在新創(chuàng)建出來的容器里自動啟動MySQL服務(wù)接受外部連接,主要是通過Dockerfile和shell腳本實現(xiàn)這一過程。
至于這么做的原因可以看一下這篇文章《將數(shù)據(jù)的初始化放到docker中的整個工作過程(問題記錄)》,為了實現(xiàn)和docker-compose整合,試了很多種方法都沒法實現(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è)置容器啟動時執(zhí)行的命令
CMD ["sh", "/mysql/setup.sh"]
2、編寫容器啟動腳本setup.sh:
#!/bin/bash
set -e
#查看mysql服務(wù)的狀態(tài),方便調(diào)試,這條語句可以刪除
echo `service mysql status`
echo '1.啟動mysql....'
#啟動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容器啟動完畢,且數(shù)據(jù)導(dǎo)入成功`
tail -f /dev/null
這里是先導(dǎo)入數(shù)據(jù),然后才是設(shè)置用戶和權(quán)限,是因為mysql容器一開始為免密登錄,Dockerfile中有如下設(shè)置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes,此時執(zhí)行導(dǎo)入數(shù)據(jù)命令不需要登錄驗證操作,如果是先執(zhí)行權(quán)限操作,那么導(dǎo)入數(shù)據(jù)則需要登錄驗證,整個過程就麻煩了許多。
3、需要導(dǎo)入數(shù)據(jù)的mysql腳本命令schema.sql:
-- 創(chuàng)建數(shù)據(jù)庫
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');
因為是測試,所以隨便寫了一個建表語句,如果是真實項目肯定不止這一張表,直接將建表語句覆蓋過來就好。
4、mysql權(quán)限設(shè)置命令privileges.sql:
use mysql;
select host, user from user;
-- 因為mysql版本是5.7,因此新建用戶為如下命令:
create user docker identified by '123456';
-- 將docker_mysql數(shù)據(jù)庫的權(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、啟動容器
docker run -d -p 13306:3306 13/docker-mysql
啟動容器,并將端口映射到本地的13306端口,命令行如圖所示:

容器啟動成功。
查看容器的日志記錄,啟動過程與啟動腳本setup.sh中所規(guī)范的步驟一致,數(shù)據(jù)導(dǎo)入和權(quán)限設(shè)置成功:

驗證結(jié)果
1、通過進入容器在命令行驗證
啟動時容器的id為9db491b1d760,因此執(zhí)行exec命令進入容器:
docker exec -it 9db491b1d760 /bin/bash
這個命令不要直接使用,因為在你機器上id可能不同,替換掉id值即可。
前文中創(chuàng)建了docker_mysql數(shù)據(jù)庫,并在此數(shù)據(jù)庫中創(chuàng)建了user表,同時將數(shù)據(jù)庫的連接授權(quán)賦予了新建的docker用戶,因此驗證過程為:
使用docker用戶登錄數(shù)據(jù)庫:
mysql -u docker -p輸入密碼123456通過登錄驗證
切換至docker_mysql數(shù)據(jù)庫:
use docker_mysql;查看數(shù)據(jù)庫中的表:
show tables;查看表中的數(shù)據(jù):
select * from user;
整個過程如下:

通過圖中的結(jié)果對比,與前文一致,驗證成功。
2、通過mysql客戶端管理軟件驗證

通過圖中的結(jié)果對比,與前文一致,驗證成功。
結(jié)語
本篇文章是單獨介紹了一下創(chuàng)建mysql鏡像的步驟,與項目結(jié)合的demo可以看我的另一篇博客《Docker+SpringBoot+Mybatis+thymeleaf的Java博客系統(tǒng)開源啦》。