详解如何使用Docker Hub官方的MySQL镜像生成容器
一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像。但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了。Docker Hub官方提供的CentOS镜像才324MB。目前来说我还没有找到什么好的方法把我制作的镜像的体积减下来,所以就先使用官方的吧!
一、下载官方的mysql镜像
docker pull mysql
下载完成后查看镜像:
[root@localhost mysql_data]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mysql latest e206c8d4ffcf 4 days ago 324.3 MB
二、生成容器
我在第一次生成容器时使用之前生成容器的方法,生成的容器运行后会马上退出。
[root@localhost mysql_data]# docker run -d -P mysql
c98c9e052d5d5a7981218140f0128390190e0e8d6e72d78ca05a29e2ed161c9f
[root@localhost mysql_data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c98c9e052d5d mysql "/entrypoint.sh mysq 4 seconds ago Exited (1) 3 seconds ago mad_kirch
查看logs
[root@localhost mysql_data]# docker logs c98c
error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?
提示说是因为没有使用参数MYSQL_ROOT_PASSWORD
但是除了这个参数还有没有其他参数呢?想到这里,我看到生成容器时,调用的启动脚本是/entrypoint.sh,我想应该查一下这个脚本的内容确定一下。
但是这个容器无法启动,根本就没法查看,那只能是新生成一个查看/entrypoint.sh脚本的容器了:
[root@localhost mysql_data]# docker run mysql cat /entrypoint.sh
#!/bin/bash
set -e
# if command starts with an option, prepend mysqld
if [ "${1:0:1}" = '-' ]; then
set -- mysqld "$@"
fi
if [ "$1" = 'mysqld' ]; then
# Get config
DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
if [ ! -d "$DATADIR/mysql" ]; then
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
exit 1
fi
mkdir -p "$DATADIR"
chown -R mysql:mysql "$DATADIR"
echo 'Running mysql_install_db'
mysql_install_db --user=mysql --datadir="$DATADIR" --rpm --keep-my-cnf
echo 'Finished mysql_install_db'
mysqld --user=mysql --datadir="$DATADIR" --skip-networking &
pid="$!"
mysql=( mysql --protocol=socket -uroot )
for i in {30..0}; do
if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
break
fi
echo 'MySQL init process in progress...'
sleep 1
done
if [ "$i" = 0 ]; then
echo >&2 'MySQL init process failed.'
exit 1
fi
# sed is for https://bugs.mysql.com/bug.php?id=20545
mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql
"${mysql[@]}" <<-EOSQL
-- What's done in this file shouldn't be replicated
-- or products like mysql-fabric won't work
SET @@SESSION.SQL_LOG_BIN=0;
DELETE FROM mysql.user ;
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
DROP DATABASE IF EXISTS test ;
FLUSH PRIVILEGES ;
EOSQL
if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then
mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
fi
if [ "$MYSQL_DATABASE" ]; then
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
mysql+=( "$MYSQL_DATABASE" )
fi
if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"
if [ "$MYSQL_DATABASE" ]; then
echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
fi
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
fi
echo
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
if ! kill -s TERM "$pid" || ! wait "$pid"; then
echo >&2 'MySQL init process failed.'
exit 1
fi
echo
echo 'MySQL init process done. Ready for start up.'
echo
fi
chown -R mysql:mysql "$DATADIR"
fi
exec "$@"
通过查看/entrypoint.sh脚本内容,总结参数如下
mysqld #启动mysql服务,必须使用
MYSQL_ROOT_PASSWORD #设置mysql的root密码,必须使用
#以下二个参数添加除root之外的用户并设置密码,可选。
MYSQL_USER
MYSQL_PASSWORD
#设置生成容器时需要新建的数据库,可选
MYSQL_DATABASE
#容器的mysql数据库默认的保存路径是:
/var/lib/mysql
#容器的配置文件my.cnf的路径为:
/etc/mysql/my.cnf
使用上要的参数生成新的容器:
mkdir /mysql_data
docker run -d -P -e mysqld -e MYSQL_ROOT_PASSWORD=147258 -e MYSQL_USER=steven -e MYSQL_PASSWORD=147258 -e MYSQL_DATABASE=discuz -v /mysql_data:/var/lib/mysql mysql
命令详解:
1、设置容器的mysql的root密码为”147258”;
2、新添加一个名为“steven”的用户,密码设置为“147258”;
3、在生成容器的同时新建一个名为“discuz”的数据库;
4、将宿主机的目录“/mysql_data”映射到容器的“/var/lib/mysql”目录。这是因为默认情况下数据库的数据库文件和日志文件都会存放于容器的AUFS文件层,这不仅不使得容器变得越来越臃肿,不便于迁移、备份等管理,而且数据库的性能也会受到影响。因此建议挂载到宿主机的目录到容器内。
查看新生成的容器:
[root@localhost mysql_data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a5733de65cf mysql "/entrypoint.sh mysq 4 seconds ago Up 3 seconds 0.0.0.0:32792->3306/tcp determined_lovelace
32c10755406e mysql "/entrypoint.sh cat 29 minutes ago Exited (0) 29 minutes ago jolly_torvalds
c98c9e052d5d mysql "/entrypoint.sh mysq 34 minutes ago Exited (1) 34 minutes ago mad_kirch
容器的3306端口已经映射给了宿主机的32792端口。如果需要将容器的3306端口开放给指定的宿主机端口,请使用参数 “-p 宿主机端口:3306”。
查看本地的mysql_data是否生成容器内的数据库:
[root@localhost ~]# ll /mysql_data/
总用量 110608
-rw-rw---- 1 999 999 56 10月 18 09:55 auto.cnf
drwx------ 2 999 999 4096 10月 18 09:55 discuz
-rw-rw---- 1 999 999 12582912 10月 18 11:10 ibdata1
-rw-rw---- 1 999 999 50331648 10月 18 11:10 ib_logfile0
-rw-rw---- 1 999 999 50331648 10月 18 09:55 ib_logfile1
drwx------ 2 999 999 4096 10月 18 09:55 mysql
drwx------ 2 999 999 4096 10月 18 09:55 performance_schema
已经生成相关的文件和默认数据库,同时也新建了”disucz”数据库.
测试:在宿主机上通过端口访问容器中的mysql服务:
安装 mysql
yum -y install mysql
测试:
[root@localhost ~]# mysql -u steven -p -h 127.0.0.1 -P 32792
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
测试成功!
需要注意的是:宿主机上的UID和GID是999。这是容器里用户mysql的UID和GID。千万另进行权限变更,否则容器对这个目录进行读写就会出现问题。如果觉得不舒服,可以在本地新建一个mysql_docker的用户指定UID和GID是999。
三、进入到新生成的容器
由于官方的镜像没有提供sshd服务,所以可以选择在生成容器之前先自行安装sshd服务,重新生成镜像,然后再生成容器。这部分在之前的文章里提过,所以就不多说了。
另一种方法是使用exec命令直接进入到容器内部
查看生成的容器ID
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a5733de65cf mysql "/entrypoint.sh mysq 11 minutes ago Up 11 minutes 0.0.0.0:32792->3306/tcp determined_lovelace
使用exec进入容器,同时进行相关操作:
[root@localhost ~]# docker exec -it 9a57 /bin/bash
查看进程:
root@9a5733de65cf:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1 0.0 11.5 678020 118008 ? Ssl 03:10 0:00 mysqld
root 33 0.3 0.1 20156 1916 ? Ss 03:23 0:00 /bin/bash
root 38 0.0 0.1 17432 1140 ? R+ 03:23 0:00 ps aux
查看数据库所在的文件夹:
root@9a5733de65cf:/# ls -l /var/lib/mysql/
total 110608
-rw-rw---- 1 mysql mysql 56 Oct 18 01:55 auto.cnf
drwx------ 2 mysql mysql 4096 Oct 18 01:55 discuz
-rw-rw---- 1 mysql mysql 50331648 Oct 18 03:10 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Oct 18 01:55 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 Oct 18 03:10 ibdata1
drwx------ 2 mysql mysql 4096 Oct 18 01:55 mysql
drwx------ 2 mysql mysql 4096 Oct 18 01:55 performance_schema
进入mysql:
root@9a5733de65cf:/# mysql -u steven -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
四、修改容器中mysql的配置文件
默认镜像中并没有安装vi或者vim,需要手工安装。
apt-get update && apt-get -yq install vim
然后就可以使用vim 来修改mysql的配置文件:
vim /etc/mysql/my.cnf
如果已经有一个比较成熟的my.cnf的配置方案,可以在宿主机上新建一个文件夹将已经设置好的my.cnf和conf.d这二个文件放到里面,在新建窗口的时候,直接使用参数”-v” 将这个文件夹映射到容器的”/etc/mysql”目录上即可。
详解如何使用Docker Hub官方的MySQL镜像生成容器的更多相关文章
- 详解使用DockerHub官方的mysql镜像生成容器
详解使用DockerHub官方的mysql镜像生成容器 收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!&g ...
- 【转载】使用Docker Hub官方gcc:latest镜像编译C/C++程序以及缩小镜像的方法
摘要:使用Docker Hub官方gcc:latest镜像(1.2GB)编译C/C++程序,以及缩小镜像的方法. 方法1: 在gcc容器里编译C/C++程序 将C/C++代码运行在gcc容器内的最简单 ...
- docker学习笔记4:利用docker hub上的mysql镜像创建mysql容器
docker hub上有官方的mysql镜像,我们可以利用它来创建mysql容器,作为一个服务容器使用. 1.下载mysql镜像 docker pull mysql 2.创建镜像 docker run ...
- 【Docker】(2)---仓库、镜像、容器
[Docker](2)---仓库.镜像.容器 学习Docker,我觉得首先要了解的是仓库.镜像.容器到底是什么,他们有什么区别. 一.通俗理解 1.Docker 镜像 (images) 容器运 ...
- vagrant(二)配置文件vagrantfile详解 以及安装php、nginx、mysql
上一篇文章完整的讲叙了如何安装一个vagrant的环境.这里主要说一说vagrant的配置文件Vagrantfile. 一 配置详解 在我们的开发目录下有一个文件Vagrantfile,里面包含有大量 ...
- 如何使用DockerHub官方的mysql镜像
Mysql是一个广泛使用的开源关系型数据库. 如何获取Mysql Docker镜像? docker pull mysql:5.7 如何使用这个Docker镜像? 1.启动一个Mysql Server容 ...
- docker入门——安装(CentOS)、镜像、容器
Docker简介 什么是docker 官方解释: Docker is the company driving the container movement and the only container ...
- docker部署项目,对镜像,容器的操作
服务器上的项目访问不了,所以我去看了看容器,果然 那我就删除容器呗 :docker rm 容器id docker rm f097e24a9a0f 说明:从镜像到容器,同一个镜像构建多个运行的 Dock ...
- Python-第三方库requests详解(附requests中文官方教程)
转自http://blog.csdn.net/cyjs1988/article/details/73294774 Python+requests中文官方教程: http://www.python-re ...
随机推荐
- eclipse 中springboot2.0整合jsp 出现No Java compiler available for configuration options compilerClassName
今天使用eclipse创建springboot整合jsp出现一个问题,在idea中并没有遇到这个问题.最后发现是需要在eclipse中添加一个eclipse依赖,依赖如下: <dependenc ...
- [Ubuntu] 解决 ubuntu 升级时 /boot 空间不足
经常升级Linux内核,导致更新时警告/boot分区空间不足.这是以为多次升级内核后,导致内核版本太多,清理一下没用的内核文件就行了. 原文地址请保留http://www.cnblogs.com/ro ...
- MyEclipse优化设置(最详细版本)
MyEclipse优化设置由于自己需要,在网上查了相关资料,现在总结如下: 本优化方法较全,希望能帮助到需要的人... 第一步: 取消自动validation validation有一堆,什么xml. ...
- 阿里云centos7.2 lamp配置
安装apache 1.安装yum -y install httpd 2.设置apache服务开机启动systemctl enable httpd.service 3.开启apache服务systemc ...
- Linux运维之——每日小技巧,获取网站请求数的前20个IP
获取网站请求书的前20个IP |grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
- Oracle 截取字符串(截取固定分隔符中间的字符
#### Oracle 截取字符串(截取固定分隔符中间的字符) #### #### oracle 取固定分隔符之间的字符--方法一 substr+ instrSELECT substr('12JP ...
- 乘风破浪:LeetCode真题_036_Valid Sudoku
乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...
- 第二次项目冲刺(Beta版本)2017/12/10
一.任务分布 二.燃尽图 三.站立式会议 1.照片(再给我两分钟) 2.任务安排 四.总结 冲刺的最后一天了,时间安排的不够好,还有部分功能没有完成,大家都尽力了,我们后续会抓紧时间完成项目.
- ffmpeg常用参数一览表
基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 -y 覆盖已有 ...
- es6安装babel包
1.前面下载node.js及安装淘宝镜像可以查看我写的vue.js环境搭建 2.安装完node后,安装babel npm install -g babel-cli 3.检验babel是否安装成功: b ...