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)在本地了
運(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
-
-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è)版本的鏡像來生成容器
進(jìn)入實(shí)例
容器已經(jīng)運(yùn)行起來了,我們就可以使用命令進(jìn)入到實(shí)例里
docker exec -it container-name bash
然后輸入 mysql -uroot -p
輸入我們剛剛設(shè)置的密碼侣颂,就能正常操作數(shù)據(jù)庫了
這樣我們就基于官方 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:
-
-t
:鏡像名阴挣,可跟上版本气堕,eginit_mysql:0.0.1
-
.
: 表示Dockerfile
在當(dāng)前路徑下 - 更多命令可以使用 docker build --help 查看
這時(shí)就能查看到我們剛剛生成了鏡像了
運(yùn)行容器
鏡像生成后,我們就可以去運(yùn)行一個(gè)容器了
docker run -itd --name demo-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d test_mysql
我們進(jìn)入實(shí)例就可以看見剛剛初始化好的表以及數(shù)據(jù)
當(dāng)然也可以使用客戶端連接畔咧,同樣也能看見
總結(jié)
好了茎芭,恭喜你到此,折騰半天后誓沸,可以在 docker
里面放肆的使用數(shù)據(jù)庫梅桩。人生也不過如此,在于折騰拜隧,以及折騰后的成功宿百,心情也會(huì)很愉快趁仙。盡管是搬磚,但也是自己實(shí)際動(dòng)手操作過犀呼。我是一名搬磚工幸撕,專注搬磚,謝謝外臂,附上源碼吧坐儿,如需請(qǐng)自取(盡管它很簡(jiǎn)單)