以mysql为例:
从docker架构中得知,docker镜像可以从docker镜像仓库下载,类似于maven中下载相关jar包,docker的镜像仓库:Docker Hub(https://hub.docker.com)
Docker search mysql
查询结果:
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 5122 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 1588 [OK]
docker.io docker.io/mysql/mysql-server OptimizedMySQL Server Docker images. Crea... 358 [OK]
docker.io docker.io/percona Percona Server is a fork ofthe MySQL rela... 297 [OK]
docker.io docker.io/hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 70
docker.io docker.io/zabbix/zabbix-server-mysql Zabbix Server withMySQL database support 62 [OK]
docker.io docker.io/centurylink/mysql Imagecontaining mysql. Optimized to be li... 53 [OK]
docker.io docker.io/sameersbn/mysql 47 [OK]
docker.io docker.io/zabbix/zabbix-web-nginx-mysql Zabbix frontend basedon Nginx web-server ... 35 [OK]
docker.io docker.io/tutum/mysql Base docker image to run a MySQL database ... 27
docker.io docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 16 [OK]
docker.io docker.io/schickling/mysql-backup-s3 Backup MySQL to S3(supports periodic back... 16 [OK]
docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQLdatabase server 12
docker.io docker.io/linuxserver/mysql A Mysqlcontainer, brought to you by Linux... 12
docker.io docker.io/openshift/mysql-55-centos7 DEPRECATED: ACentos7 based MySQL v5.5 ima... 6
docker.io docker.io/centos/mysql-56-centos7 MySQL 5.6 SQL databaseserver 5
docker.io docker.io/dsteinkopf/backup-all-mysql backup all DBs in amysql server 3 [OK]
docker.io docker.io/frodenas/mysql ADocker Image for MySQL 3 [OK]
docker.io docker.io/circleci/mysql MySQLis a widely used, open-source relati... 2
docker.io docker.io/ansibleplaybookbundle/rhscl-mysql-apb An APB which deploys RHSCLMySQL 0 [OK]
docker.io docker.io/astronomerio/mysql-sink MySQL sink 0 [OK]
docker.io docker.io/astronomerio/mysql-source MySQL source 0 [OK]
docker.io docker.io/cloudfoundry/cf-mysql-ci Image used in CIof cf-mysql-release 0
docker.io docker.io/cloudposse/mysql Improved`mysql` service with support for ... 0 [OK]
docker.io docker.io/jenkler/mysql Docker Mysql package 0
docker pull mysql:tag
Tag的获取方式:直接从docker hub上获取
Docker pull mysql:latest
下载镜像
在宿主机/mysql/dockerfile目录下创建dockerfile文件
Mkdir –p /mysql/docker
Cd /mysql/dockerfile
Touch Dockerfile
Dockerfile文件内容:
#由于本机已经pull了tag为latest的mysql镜像,以mysql:latest镜像为基础
ROM mysql:latest
#设置免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
#将所需文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY schema.sql /mysql/schema.sql
COPY privileges.sql /mysql/privileges.sql
#设置容器启动时执行的命令
CMD ["sh", "/mysql/setup.sh"]
和Dockerfile相同目录下的三个文件
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.开始导入数据....'
#导入数据
mysql </mysql/schema.sql
echo '3.导入数据完毕....'
sleep 3
echo `service mysql status`
#重新设置mysql密码
echo '4.开始修改密码....'
mysql </mysql/privileges.sql
echo '5.修改密码完毕....'
#sleep 3
echo `service mysql status`
echo `mysql容器启动完毕,且数据导入成功`
schema.sql:
-- 创建数据库
DROP DATABASE IF EXISTS `docker_mysql`;
create database `docker_mysql` defaultcharacter 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,
PRIMARYKEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- 插入数据
replace INTO `user` (`id`, `created_at`,`last_modified`, `email`, `first_name`, `last_name`, `username`)
VALUES
(0,1490257904,1490257904,'john.doe@example.com','John','Doe','user');
privileges.sql:
use mysql;
DELETE from userwhere User='docker';
select host, userfrom user;
-- 新建可以远程访问的用户docker:
GRANT USAGE ON *.*TO 'docker'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
GRANT ALL PRIVILEGESON *.* TO 'docker'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
-- 这一条命令一定要有:
flush privileges;
总结:数据初始化脚本包括sql语句一定要可以重复使用的语句,去重操作一定要有,否则后面容器做启停操作的时候会导致容器无法正常运行退出
创建镜像:
docker build -t qh-mysql . 使用当前目录的docker File创建镜像
第一步:查看我们本地的镜像:
Docker images
只有一个mysql的镜像,详细信息如下
第二步:查看本地的容器
有一个在运行的mysql容器,id为:f25a0d544a82
第三步:使用该容器创建新的mysql镜像-mysql-new
Commit命令语法:
dockercommit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
详细命令:docker commit -a"qh" -m "my new mysql image" f25a0d544a82 mysq-new:v1
运行结果如下:
docker images
dockerrmi qh-mysql(名称或者id)