Docker实现mysql容器启动后自动建库
概述
通过Dockerfile创建一个mysql镜像,该镜像具有如下功能:
mysql容器启动时,会自动执行指定的sql文件;
每次启动该容器,数据都进行初始化,删除所有的修改。
执行步骤
创建Dockerfile
$ vim Dockerfile
# 指定基础镜像,选用docker官方最新mysql镜像
FROM docker.io/mysql:latest
# 环境变量设置,设置mysql登陆时不需密码
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
# 复制文件到容器中,要复制的文件有:启动脚本和sql文件
COPY setup.sh /mysql/setup.sh
COPY data.sql /mysql/data.sql
COPY privileges.sql /mysql/privileges.sql
# 容器启动命令启动脚本
CMD ["sh", "/mysql/setup.sh"]
创建privileges.sql用于修改mysql权限
$vim privileges.sql
use mysql;
select host, user from user;
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
-- 如果用户docker不存在,则创建用户docker
grant all on docker_database.* to docker@'%' identified by '123456' with grant option;
-- mysql新设置用户或权限后需要刷新系统权限否则可能会出现拒绝访问:
flush privileges;
创建data.sql导入数据
$ vim data.sql
-- 创建数据库
DROP database IF EXISTS `docker_database`;
create database `docker_database` default character set utf8 collate utf8_general_ci;
-- 切换到test_data数据库
use docker_database;
-- 建表
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- 插入数据
INSERT INTO `user` (`id`,`name`,`age` )
VALUES
(0,'Tom',18);
创建容器启动脚本setup.sh
$ vim setup.sh
# !/bin/bash
set -e
# 查看mysql服务的状态,方便调试
echo `service mysql status`
echo '1.启动mysql'
# 启动mysql
service mysql start
# 使进程休眠
sleep 3
echo `service mysql status`
echo '2.开始导入数据'
#导入sql文件
mysql < /mysql/data.sql
echo '3.导入数据完毕....'
sleep 3
echo `service mysql status`
# 由于最开始设置mysql为免密登陆,为了安全,在此设置mysql密码
echo '4.开始修改密码....'
# 导入修改mysql权限设置的文件
mysql < /mysql/privileges.sql
echo '5.修改密码完毕....'
#sleep 3
echo `service mysql status`
echo 'mysql容器启动完毕,且数据导入成功'
创建镜像
创建镜像并命名为mysql:9.29
$ docker build -t mysql:9.29 .
验证
启动mysql:9.29镜像,生成容器
$ docker run --name sql -d -p 23306:3306 mysql:9.29
6da21b87a0a53b247f0d249366433d04a632ede5521bd36650164180448a5e41
查看容器日志
$ docker log sql
1.启动mysql....
2017-09-29T01:04:33.521418Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-09-29T01:04:36.647637Z 0 [Warning] InnoDB: New log files created, LSN=45790
2017-09-29T01:04:37.431760Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2017-09-29T01:04:37.818755Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 2a41ede9-a4b2-11e7-a72e-0242ac115903.
2017-09-29T01:04:37.823362Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-09-29T01:04:37.824245Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2017-09-29T01:04:40.977642Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977679Z 1 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977689Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977710Z 1 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977715Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977726Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977764Z 1 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
2017-09-29T01:04:40.977774Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
..
MySQL Community Server 5.7.19 is started.
MySQL Community Server 5.7.19 is running.
2.开始导入数据....
3.导入数据完毕....
MySQL Community Server 5.7.19 is running.
4.开始修改密码....
host user
localhost mysql.session
localhost mysql.sys
localhost root
5.修改密码完毕....
MySQL Community Server 5.7.19 is running.
mysql容器启动完毕,且数据导入成功
容器启动过程与setup.sh中编写的步骤完全一致。
进入容器进行验证
$ docker exec -it sql /bin/bash
root@6da21b87a0a5:/# mysql -u docker -p
Enter password:
mysql> use docker_database;
mysql> show tables;
+---------------------------+
| Tables_in_docker_database |
+---------------------------+
| person |
+---------------------------+
1 row in set (0.00 sec)
mysql> select * from person;
+----+------+------+
| id | name | age |
+----+------+------+
| 0 | Tom | 18 |
+----+------+------+
1 row in set (0.00 sec)
验证重启mysql容器,数据库初始化
插入数据
mysql> insert into person(id ,name ,age)values(1,'Jane',17);
Query OK, 1 row affected (0.06 sec)
mysql> select * from person;
+----+------+------+
| id | name | age |
+----+------+------+
| 0 | Tom | 18 |
| 1 | Jane | 17 |
+----+------+------+
2 rows in set (0.00 sec)
重新启动容器
$ docker stop sql
$ docker start sql
$ docker exec -it sql /bin/bash
root@6da21b87a0a5:/# mysql -u docker -p
Enter password:
mysql> use docker_database;
mysql> show tables;
+---------------------------+
| Tables_in_docker_database |
+---------------------------+
| person |
+---------------------------+
1 row in set (0.00 sec)
mysql> select * from person;
+----+------+------+
| id | name | age |
+----+------+------+
| 0 | Tom | 18 |
+----+------+------+
1 row in set (0.00 sec)
重启容器后,数据初始化。
This blog is under a CC BY-NC-SA 3.0 Unported License
本文链接:http://yov.oschina.io/article/容器/Docker/Docker实现mysql容器启动后自动建库/