docker入門之mysql

docker火了那么久,自己在平時(shí)也常常聽別人說docker怎么怎么樣(假裝能聽懂的樣子)揩晴,后來還是決定自己擼起袖子就開干勋陪,因?yàn)樽约浩綍r(shí)也有練習(xí)一些小項(xiàng)目,斷斷續(xù)續(xù)的硫兰,當(dāng)時(shí)解決了诅愚,后來隔斷時(shí)間不用就又忘記了,俗話說好記性不如爛筆頭瞄崇,這次就把實(shí)踐的全部記下來了呻粹,以防未來又忘記了(???♀?)

準(zhǔn)備步驟

安裝 docker

你要用docker,那么三部曲無外乎就是安裝苏研,編碼等浊,運(yùn)行,所以我們首先來安裝 docker摹蘑。安裝 docker 有很多種方式筹燕,網(wǎng)上教程也是五花八門;這里就跳過衅鹿,畢竟網(wǎng)上一大把撒踪,貼一個(gè)菜鳥的教程
docker 安裝好了,就可以使用簡(jiǎn)單的命令去查看了大渤;常用的有:

docker images  // 查看當(dāng)前本地鏡像
docker pull imagename  // 獲取一個(gè)新鏡像
docker search imagename  // 查找一個(gè)鏡像
docker rmi images-id  // 刪除一個(gè)鏡像
docker image prune --force --all  // 刪除所有不使用的鏡像
docker ps -a // 查看容器
docker rm container-id // 刪除容器
docker stop container-id // 停止容器

當(dāng)然還有很多 docker build制妄、docker run 等命令,可以去查閱其具體用法

拉取鏡像

docker 安裝好了泵三,我們使用命令去獲取一個(gè) mysql 的鏡像

docker pull mysql:5.6

note
:5.6:表示版本
這個(gè)時(shí)候我們使用查看命令就可以看到該鏡像已經(jīng)在本地了

查看鏡像.png

運(yùn)行

docker 安裝好了耕捞,鏡像也獲取了衔掸,那么現(xiàn)在就可以基于該鏡像起一個(gè)容器了

運(yùn)行容器

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

note

  1. -itd: -i 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用俺抽;-t 為容器重新分配一個(gè)偽輸入終端敞映,通常與 -i 同時(shí)使用;-d 后臺(tái)運(yùn)行容器磷斧,并返回容器ID
    2.--name [name]:容器名稱
    3.-p 3306:3306 :映射容器服務(wù)的 3306 端口到宿主機(jī)的 3306 端口振愿,外部主機(jī)可以直接通過 宿主機(jī)ip:3306 訪問到 mysql 的服務(wù)。
    3.-e MYSQL_ROOT_PASSWORD=my-secret-pw:設(shè)置 mysql 服務(wù) root 用戶的密碼弛饭。
    這個(gè)時(shí)候我們使用查看容器命令冕末,就可以看見該容器已經(jīng)運(yùn)行起來了
    4.-d mysql:[version]:這里指基于哪個(gè)版本的鏡像來生成容器
查看容器.png

進(jìn)入實(shí)例

容器已經(jīng)運(yùn)行起來了,我們就可以使用命令進(jìn)入到實(shí)例里

docker exec -it container-name bash

然后輸入 mysql -uroot -p 輸入我們剛剛設(shè)置的密碼侣颂,就能正常操作數(shù)據(jù)庫了

數(shù)據(jù)庫.png

這樣我們就基于官方 mysql 鏡像栓霜,運(yùn)行起了一個(gè)數(shù)據(jù)庫實(shí)例,我們也可以使用其他數(shù)據(jù)庫客戶端去連接該數(shù)據(jù)庫横蜒,不過如果你是基于最新的數(shù)據(jù)庫創(chuàng)建的實(shí)例,連接可能會(huì)失敗销凑,說找不到image not found丛晌,那么你可能需要進(jìn)入 mysql 實(shí)例去修改下密碼

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

數(shù)據(jù)初始化

雖然上面我們已經(jīng)生成了數(shù)據(jù)庫實(shí)例,但是在實(shí)際中斗幼,我們希望在創(chuàng)建實(shí)例的過程中就能初始化我們寫好的 sql 腳本澎蛛,剛好 mysql 的官方鏡像可以支持在容器啟動(dòng)的時(shí)候自動(dòng)執(zhí)行指定的 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"]

很明顯里面已經(jīng)設(shè)定了 ENTRYPOINT蜕窿,會(huì)調(diào)用 /entrypoint.sh 這個(gè)腳本谋逻,腳本其中一段內(nèi)容如下:

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

說的是會(huì)遍歷 docker-entrypoint-initdb.d 目錄下所有的 .sh.sql 后綴的文件并執(zhí)行。所以我們的思路是將數(shù)據(jù)庫初始化腳本拷貝到 docker-entrypoint-initdb.d 目錄下桐经。那么接下來我們就編寫 Dockerfile 文件

  • Dockerfile
#基礎(chǔ)鏡像使用 mysql:5.6
FROM mysql:5.6

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

#定義工作目錄
ENV WORK_PATH /usr/local/work

#定義會(huì)被容器自動(dòng)執(zhí)行的目錄
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

#創(chuàng)建文件夾
RUN mkdir -p $WORK_PATH

#把數(shù)據(jù)庫初始化數(shù)據(jù)的文件復(fù)制到工作目錄下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/

#把要執(zhí)行的sql文件放到/docker-entrypoint-initdb.d/目錄下毁兆,容器會(huì)自動(dòng)執(zhí)行這個(gè)sql
COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/

#給執(zhí)行文件增加可執(zhí)行權(quán)限
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 構(gòu)建一個(gè)鏡像

docker build -t init_mysql .

note:

  1. -t:鏡像名阴挣,可跟上版本气堕,eg init_mysql:0.0.1
  2. .: 表示 Dockerfile 在當(dāng)前路徑下
  3. 更多命令可以使用 docker build --help 查看
    這時(shí)就能查看到我們剛剛生成了鏡像了
鏡像.png

運(yùn)行容器

鏡像生成后,我們就可以去運(yùn)行一個(gè)容器了

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

我們進(jìn)入實(shí)例就可以看見剛剛初始化好的表以及數(shù)據(jù)

數(shù)據(jù)庫.png

當(dāng)然也可以使用客戶端連接畔咧,同樣也能看見


客戶端.png

總結(jié)

好了茎芭,恭喜你到此,折騰半天后誓沸,可以在 docker 里面放肆的使用數(shù)據(jù)庫梅桩。人生也不過如此,在于折騰拜隧,以及折騰后的成功宿百,心情也會(huì)很愉快趁仙。盡管是搬磚,但也是自己實(shí)際動(dòng)手操作過犀呼。我是一名搬磚工幸撕,專注搬磚,謝謝外臂,附上源碼吧坐儿,如需請(qǐng)自取(盡管它很簡(jiǎn)單)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宋光,一起剝皮案震驚了整個(gè)濱河市貌矿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罪佳,老刑警劉巖逛漫,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赘艳,居然都是意外死亡酌毡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蕾管,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枷踏,“玉大人,你說我怎么就攤上這事掰曾⌒袢洌” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵旷坦,是天一觀的道長(zhǎng)掏熬。 經(jīng)常有香客問我,道長(zhǎng)秒梅,這世上最難降的妖魔是什么旗芬? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮番电,結(jié)果婚禮上岗屏,老公的妹妹穿的比我還像新娘。我一直安慰自己漱办,他們只是感情好这刷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娩井,像睡著了一般暇屋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洞辣,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天咐刨,我揣著相機(jī)與錄音昙衅,去河邊找鬼。 笑死定鸟,一個(gè)胖子當(dāng)著我的面吹牛而涉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播联予,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼啼县,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了沸久?” 一聲冷哼從身側(cè)響起季眷,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卷胯,沒想到半個(gè)月后子刮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窑睁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挺峡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担钮。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沙郭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裳朋,到底是詐尸還是另有隱情,我是刑警寧澤吓著,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布鲤嫡,位于F島的核電站,受9級(jí)特大地震影響绑莺,放射性物質(zhì)發(fā)生泄漏暖眼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一纺裁、第九天 我趴在偏房一處隱蔽的房頂上張望诫肠。 院中可真熱鬧,春花似錦欺缘、人聲如沸栋豫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丧鸯。三九已至,卻和暖如春嫩絮,著一層夾襖步出監(jiān)牢的瞬間丛肢,已是汗流浹背围肥。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜂怎,地道東北人穆刻。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杠步,于是被迫代替她去往敵國和親氢伟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351