docker入门之mysql

docker火了那么久,自己在平时也常常听别人说docker怎么怎么样(假装能听懂的样子),后来还是决定自己撸起袖子就开干,因为自己平时也有练习一些小项目,断断续续的,当时解决了,后来隔断时间不用就又忘记了,俗话说好记性不如烂笔头,这次就把实践的全部记下来了,以防未来又忘记了(🤦‍♀️)

准备步骤

安装 docker

你要用docker,那么三部曲无外乎就是安装,编码,运行,所以我们首先来安装 docker。安装 docker 有很多种方式,网上教程也是五花八门;这里就跳过,毕竟网上一大把,贴一个菜鸟的教程
docker 安装好了,就可以使用简单的命令去查看了;常用的有:

docker images  // 查看当前本地镜像
docker pull imagename  // 获取一个新镜像
docker search imagename  // 查找一个镜像
docker rmi images-id  // 删除一个镜像
docker image prune --force --all  // 删除所有不使用的镜像
docker ps -a // 查看容器
docker rm container-id // 删除容器
docker stop container-id // 停止容器

当然还有很多 docker builddocker run 等命令,可以去查阅其具体用法

拉取镜像

docker 安装好了,我们使用命令去获取一个 mysql 的镜像

docker pull mysql:5.6

note
:5.6:表示版本
这个时候我们使用查看命令就可以看到该镜像已经在本地了

查看镜像.png

运行

docker 安装好了,镜像也获取了,那么现在就可以基于该镜像起一个容器了

运行容器

docker run -itd --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6

note

  1. -itd: -i 以交互模式运行容器,通常与 -t 同时使用;-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;-d 后台运行容器,并返回容器ID
    2.--name [name]:容器名称
    3.-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 mysql 的服务。
    3.-e MYSQL_ROOT_PASSWORD=my-secret-pw:设置 mysql 服务 root 用户的密码。
    这个时候我们使用查看容器命令,就可以看见该容器已经运行起来了
    4.-d mysql:[version]:这里指基于哪个版本的镜像来生成容器
查看容器.png

进入实例

容器已经运行起来了,我们就可以使用命令进入到实例里

docker exec -it container-name bash

然后输入 mysql -uroot -p 输入我们刚刚设置的密码,就能正常操作数据库了

数据库.png

这样我们就基于官方 mysql 镜像,运行起了一个数据库实例,我们也可以使用其他数据库客户端去连接该数据库,不过如果你是基于最新的数据库创建的实例,连接可能会失败,说找不到image not found,那么你可能需要进入 mysql 实例去修改下密码

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

数据初始化

虽然上面我们已经生成了数据库实例,但是在实际中,我们希望在创建实例的过程中就能初始化我们写好的 sql 脚本,刚好 mysql 的官方镜像可以支持在容器启动的时候自动执行指定的 sql 脚本或者 shell 脚本,我们能看见官方镜像中 Dockerfile 部分代码:

COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 3306
CMD ["mysqld"]

很明显里面已经设定了 ENTRYPOINT,会调用 /entrypoint.sh 这个脚本,脚本其中一段内容如下:

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 ;;
    *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
    *)        echo "$0: ignoring $f" ;;
  esac
  echo
done

说的是会遍历 docker-entrypoint-initdb.d 目录下所有的 .sh.sql 后缀的文件并执行。所以我们的思路是将数据库初始化脚本拷贝到 docker-entrypoint-initdb.d 目录下。那么接下来我们就编写 Dockerfile 文件

  • Dockerfile
#基础镜像使用 mysql:5.6
FROM mysql:5.6

#作者
MAINTAINER cc <813659813@qq.com>

#定义工作目录
ENV WORK_PATH /usr/local/work

#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义sql文件名
ENV FILE_0 init_table.sql 
ENV FILE_1 init_data.sql

#定义shell文件名
ENV INSTALL_DB_SHELL init_db.sh

#创建文件夹
RUN mkdir -p $WORK_PATH

#把数据库初始化数据的文件复制到工作目录下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/

#把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql
COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/

#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SQL
  • init_db.sh
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
  • init_table.sql
CREATE DATABASE IF NOT EXISTS test;

use test;

CREATE TABLE IF NOT EXISTS user (
  id INT NOT NULL AUTO_INCREMENT,
  account VARCHAR(32) NOT NULL,
  password VARCHAR(32) NOT NULL,
  openId VARCHAR(100) DEFAULT NULL,
  createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
  updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);
  • init_data.sql
INSERT INTO user (account, password) values ('admin', '123456');

生成镜像

文件编写好了,我们就能基于该 Dockerfile 构建一个镜像

docker build -t init_mysql .

note:

  1. -t:镜像名,可跟上版本,eg init_mysql:0.0.1
  2. .: 表示 Dockerfile 在当前路径下
  3. 更多命令可以使用 docker build --help 查看
    这时就能查看到我们刚刚生成了镜像了
镜像.png

运行容器

镜像生成后,我们就可以去运行一个容器了

docker run -itd --name demo-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d test_mysql
容器.png

我们进入实例就可以看见刚刚初始化好的表以及数据

数据库.png

当然也可以使用客户端连接,同样也能看见


客户端.png

总结

好了,恭喜你到此,折腾半天后,可以在 docker 里面放肆的使用数据库。人生也不过如此,在于折腾,以及折腾后的成功,心情也会很愉快。尽管是搬砖,但也是自己实际动手操作过。我是一名搬砖工,专注搬砖,谢谢,附上源码吧,如需请自取(尽管它很简单)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343