3疯坤、Docker核心必備之自定義鏡像實(shí)戰(zhàn)

3.1 構(gòu)建自定義鏡像的意義與應(yīng)用場景

簡介:介紹自定義鏡像的重要性

  • docker目前鏡像的制作有倆種方法:
    • 基于Docker Commit制作鏡像
    • 基于dockerfile制作鏡像肢簿,Dockerfile方式為主流的制作鏡像方式

3.2 Commit構(gòu)建自定義鏡像

簡介:對容器的修改以及保存

  • 啟動并進(jìn)入容器:docker run -it centos:7 /bin/bash
  • 在/home 路徑下創(chuàng)建xdclass文件夾:mkdir /home/xdclass
  • 安裝ifconfig命令:yum -y install net-tools
  • 重啟容器起愈,查看容器的xdclass文件夾還在不在:docker restart 67862569d4f7
  • 刪除容器,再重新啟動一個(gè)容器進(jìn)入查看有沒有xdclass文件夾:
    • docker rm 67862569d4f7 && docker run -it centos:7 /bin/bash
  • 構(gòu)建鏡像:
    • docker commit 4eb9d14ebb18 mycentos:7
    • docker commit -a "XD" -m "mkdir /home/xdclass" 4eb9d14ebb18 mcentos:7
    • -a:標(biāo)注作者
    • -m:說明注釋
    • 查看詳細(xì)信息:docker inspect 180176be1b4c
  • 啟動容器:docker run -itd 180176be1b4c /bin/bash
  • 進(jìn)入容器查看:docker exec -it 2a4d38eca64f /bin/bash

3.3 核心必備知識之Dockerfile構(gòu)建鏡像實(shí)戰(zhàn)

簡介:Dockerfile構(gòu)建鏡像實(shí)戰(zhàn)

  • Dockerfile
# this is a dockerfile
FROM centos:7
MAINTAINER XD 123456@qq.com
RUN echo "正在構(gòu)建鏡像R胝獭L洹!"
WORKDIR /home/xdclass
COPY 123.txt /home/xdclass
RUN yum install -y net-tools
  • 構(gòu)建:docker build -t mycentos:v2 .
  • 查看:docker images
  • 進(jìn)入驗(yàn)證:驗(yàn)證成功

3.4 Docker核心知識之鏡像分層結(jié)構(gòu)剖析

簡介:介紹鏡像的分層結(jié)構(gòu)

使用dockerfile構(gòu)建鏡像

使用dockerfile構(gòu)建鏡像的時(shí)候纵菌,每一個(gè)步驟都會生成一個(gè)鏡像ID阐污。

使用docker history命令可以查看docker構(gòu)建鏡像的過程。

查看歷史
docker分層結(jié)構(gòu)
  • 總結(jié):
    • 共享資源
    • 對容器的任何改動都是發(fā)生容器層
    • 容器層是可寫可讀咱圆,而鏡像層只讀

3.5 不得不掌握的Dockerfile基礎(chǔ)指令

簡介:介紹一些常用的Dockerfile指令

  • FROM

    • 基于哪個(gè)鏡像
  • MAINTAINER

    • 注明作者
  • COPY

    • 復(fù)制文件進(jìn)入鏡像(只能用相對路徑笛辟,不能用絕對路徑)
  • ADD

    • 復(fù)制文件進(jìn)入鏡像(假如文件是.tar.gz文件會解壓)
  • WORKDIR:

    • 指定工作目錄,假如路徑不存在會創(chuàng)建路徑
  • ENV

    • 設(shè)置環(huán)境變量
  • EXPOSE

    • 暴露容器端口
  • RUN

    • 在構(gòu)建鏡像的時(shí)候執(zhí)行序苏,作用于鏡像層面
  • ENTRYPOINT

    • 在容器啟動的時(shí)候執(zhí)行手幢,作用于容器層,dockerfile里有多條時(shí)只允許執(zhí)行最后一條
  • CMD

    • 在容器啟動的時(shí)候執(zhí)行忱详,作用于容器層围来,dockerfile里有多條時(shí)只允許執(zhí)行最后一條
    • 容器啟動后執(zhí)行默認(rèn)的命令或者參數(shù),允許被修改
  • 命令格式:

    • shell命令格式:RUN yum install -y net-tools
    • exec命令格式:RUN [ "yum","install" ,"-y" ,"net-tools"]
  • dockerfile

#第一個(gè)
FROM centos:7
RUN echo "images building!"
CMD ["echo","container","starting..."]
ENTRYPOINT ["echo","container","starting P僬觥<嗤浮!"]
#第二個(gè)
FROM centos:7
RUN echo "images building!"
CMD ["echo","containe1r","starting..."]
CMD ["echo","container2","starting..."]
ENTRYPOINT ["echo","container2","starting :剿簟U吐!"]
ENTRYPOINT ["echo","container2","starting E锤啤7嗬恰退腥!"]
#第三個(gè)
FROM centos:7
CMD ["-ef"]
ENTRYPOINT ["ps"]
構(gòu)建鏡像

執(zhí)行第一個(gè)dockerfile,我們會發(fā)現(xiàn)僅執(zhí)行run的時(shí)候出現(xiàn)images building提示再榄,在CMD阅虫、ENTRYPOINT 命令時(shí)候沒有提示。這是因?yàn)閞un命令作用于鏡像層面不跟,CMD颓帝、ENTRYPOINT命令作用于容器層。另外容器啟動的時(shí)候窝革,我們看到了CMD购城、ENTRYPOINT命令的執(zhí)行。

docker提示

執(zhí)行第二個(gè)dockerfile虐译,如下:


執(zhí)行第二個(gè)dockerfile

跟執(zhí)行第一個(gè)dockerfile類似瘪板,啟動構(gòu)建的容器:

image.png

我們發(fā)現(xiàn)ENTRYPOINT、CMD dockerfile里有多條時(shí)只允許執(zhí)行最后一條漆诽。

執(zhí)行第三個(gè)dockerfile侮攀,過程如下圖所示:


docker構(gòu)建過程

執(zhí)行鏡像:


執(zhí)行鏡像
自己添加命令可以覆蓋CMD命令

3.6 實(shí)戰(zhàn)系列之Dockerfile構(gòu)建JAVA網(wǎng)站鏡像

簡介:Dockerfile構(gòu)建java環(huán)境

本地宿主機(jī)配置jdk

vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
  • source /etc/profile
  • 檢驗(yàn):java -version
  • dockerfile
FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
  • EXPOSE:功能為暴漏容器運(yùn)行時(shí)的監(jiān)聽端口給外部

  • 啟動容器,并掛載目錄:

docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT
mycentos:jdk /bin/bash
  • 網(wǎng)頁進(jìn)行訪問驗(yàn)證

3.7 實(shí)戰(zhàn)系列之Dockerfile構(gòu)建nginx鏡像

簡介:Dockerfile構(gòu)建nginx

  • dockerfile
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80

安裝nginx的shell腳本

#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install
  • 制作Nginx鏡像:

    • docker build -t mycentos:nginx .
  • Nginx鏡像啟動注意

    • 在容器里nginx是以daemon方式啟動厢拭,退出容器時(shí)兰英,nginx程序也會隨著停止:
      /usr/local/nginx/sbin/nginx
    • 使用前臺方式永久運(yùn)行:/usr/local/nginx/sbin/nginx -g "daemon off;"
  • 檢查驗(yàn)證:

    • docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"

3.8 實(shí)戰(zhàn)系列之Dockerfile構(gòu)建redis鏡像

簡介:Dockerfile構(gòu)建redis

  • 編寫redis編譯安裝shell腳本redis_install.sh
#!/bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /home/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/conf/
cp /home/redis-4.0.9/redis.conf /usr/local/redis/conf/
sed -i '69s/127.0.0.1/0.0.0.0/' /usr/local/redis/conf/redis.conf
sed -i '88s/protected-mode yes/protected-mode no/' /usr/local/redis/conf/redis.conf
  • 編寫Dockerfile
FROM centos:7
ADD redis-4.0.9.tar.gz /home
COPY redis_install.sh /home
RUN sh /home/redis_install.sh
ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
  • 測試redis:
    • 啟動容器:docker run -itd -p 6380:6379 mycentos:redis #6380是宿主機(jī)端口,6379是容器的端口
    • 進(jìn)入容器:docker exec -it 9b402baeaba7 /bin/bash
    • 宿主機(jī)連接redis: /usr/local/redis/bin/redis-cli -p 6380
    • 驗(yàn)證:
[root@localhost home]# /usr/local/redis/bin/redis-cli -p 6380
127.0.0.1:6380> set name xdclass
OK
127.0.0.1:6380> get name
"xdclass"
127.0.0.1:6380>

3.9 實(shí)戰(zhàn)系列之docker快速部署mysql數(shù)據(jù)庫并初始化

簡介:Dockerfile快速部署mysql數(shù)據(jù)庫并初始化

  • 官方網(wǎng)址:

  • 啟動命令:

    • docker run --name some-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
  • 進(jìn)入容器命令:

    • docker exec -it 4336ae28fbfa env LANG=C.UTF-8 /bin/bash
  • dockerfile

FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ENV LANG=C.UTF-8
ADD init.sql .
  • 初始化sql語句:
-- 建庫
create database `db_student`;
SET character_set_client = utf8;
use db_student;
-- 建表
drop table if exists `user`;
CREATE TABLE user (
id tinyint(5) zerofill auto_increment not null comment '學(xué)生學(xué)號',
name varchar(20) default null comment '學(xué)生姓名',
age tinyint default null comment '學(xué)生年齡',
class varchar(20) default null comment '學(xué)生班級',
sex char(5) not null comment '學(xué)生性別',
unique key (id)
)engine=innodb charset=utf8;
-- 插入數(shù)據(jù)
insert into user values('1','小明','15','初三','男');
insert into user values('2','小紅','13','初二','女');
insert into user values('3','小東','14','初一','男');
insert into user values('4','小西','12','初二','男');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末供鸠,一起剝皮案震驚了整個(gè)濱河市畦贸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楞捂,老刑警劉巖薄坏,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寨闹,居然都是意外死亡胶坠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門繁堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沈善,“玉大人,你說我怎么就攤上這事帖蔓“粒” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵塑娇,是天一觀的道長。 經(jīng)常有香客問我劫侧,道長埋酬,這世上最難降的妖魔是什么哨啃? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮写妥,結(jié)果婚禮上拳球,老公的妹妹穿的比我還像新娘。我一直安慰自己珍特,他們只是感情好祝峻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扎筒,像睡著了一般莱找。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗜桌,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天奥溺,我揣著相機(jī)與錄音,去河邊找鬼骨宠。 笑死浮定,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的层亿。 我是一名探鬼主播桦卒,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匿又!你這毒婦竟也來了闸盔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤琳省,失蹤者是張志新(化名)和其女友劉穎迎吵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體针贬,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡击费,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桦他。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫巩。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖快压,靈堂內(nèi)的尸體忽然破棺而出圆仔,到底是詐尸還是另有隱情,我是刑警寧澤蔫劣,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布坪郭,位于F島的核電站,受9級特大地震影響脉幢,放射性物質(zhì)發(fā)生泄漏歪沃。R本人自食惡果不足惜嗦锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沪曙。 院中可真熱鬧奕污,春花似錦、人聲如沸液走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缘眶。三九已至嘱根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磅崭,已是汗流浹背儿子。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砸喻,地道東北人柔逼。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像割岛,于是被迫代替她去往敵國和親愉适。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容