Dockerfile定制鏡像
1. 創(chuàng)建文件夾,并在文件夾里創(chuàng)建名為Dockerfile 的文件
2. 在Dockerfile里寫構(gòu)建鏡像的語句
| 關(guān)鍵字 | 作用 |
|---|---|
| FROM | 指定基礎(chǔ)鏡像 |
| MAINTAINER | 維護(hù)者的信息 |
| RUN | 執(zhí)行什么命令 |
| EXPOSE | 聲明容器對(duì)外服務(wù)的端口 |
| WORKDIR | 指定工作目錄 |
| ENV | 配置環(huán)境變量 |
| ADD | 將文件拷貝到鏡像中并解壓 |
| COPY | 將文件拷貝到鏡像中 |
| VOLUME | 配置數(shù)據(jù)卷 |
| CMD | 容器啟動(dòng)時(shí)候執(zhí)行的命令 |
| ENTRYPOINT | 容器啟動(dòng)時(shí)候執(zhí)行的命令 |
編寫Dockerfile文件注意點(diǎn)
FROM ubuntu:18.04 #指定基礎(chǔ)鏡像,這一句必須要有
MAINTAINER Evan_Tang@admin.com #維護(hù)者信息(可以不寫)
RUN apt-get install -y vim #執(zhí)行 apt-get install -y vim 命令,安裝vim
RUN apt-get install -y net-tools #執(zhí)行 apt-get install -y net-tools, 安裝net-tools工具
WORKDIR /dev/ #啟動(dòng)容器后,如果啟動(dòng)交互模式,直接進(jìn)入到哪個(gè)目錄
CMD ["/bin/bash"] #啟動(dòng)容器的時(shí)候,進(jìn)入到/bin/bash這種命令行
FROM 表示指定基礎(chǔ)鏡像 >如果沒有基于鏡像則用scratch表示
RUN 表示運(yùn)行命令 可以使用shell格式或者使用exec格式
- shell格式:RUN 后面直接接命令。
- exec 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
COPY 原路徑 目標(biāo)路徑 將上下文的路徑的文件復(fù)制一份到新鏡像的目標(biāo)路徑
ADD 和COPY基本一樣 如果拷貝壓縮文件 ADD命令會(huì)進(jìn)行解壓(會(huì)令構(gòu)建鏡像緩存失效不推薦使用,盡可能使用COPY)
CMD和ENTRYPOINT 都用是啟動(dòng)命令都只能有一個(gè)生效,最后出現(xiàn)的生效,
如果同一個(gè)Dockerfile文件同時(shí)出現(xiàn)CMD和ENTRYPOINT,CMD在前ENTRYPOINT在后 CMD無效,如果ENTRYPOINT在前CMD在后,CMD可能無效而被當(dāng)作ENTRYPOINT的參數(shù)
FROM ubuntu:18.04
MAINTAINER Evan_Tang@admin.com
RUN mkdir -p /datas/
ENTRYPOINT ["echo", "hello"]
CMD ["world"] #會(huì)將world作為echo hello的參數(shù),最后的命令其實(shí)為echo hello world
ubuntu鏡像默認(rèn)的CMD是/bin/bash,如果我們直接docker run -it ubuntu的話,會(huì)直接進(jìn)入bash,可以在運(yùn)行時(shí)用cat 路徑/文件名指定運(yùn)行別的命令
ENV用于設(shè)置環(huán)境變量 ENV <key> <value>
VOLUME用于設(shè)置數(shù)據(jù)卷 VOLUME <路徑>
EXPOSE 聲明提供服務(wù)的端口并不會(huì)開啟這個(gè)端口 EXPOSE <端口1>
WORKDIR 用于指定工作目錄,如果目錄不存在會(huì)建立目錄
Dockerfile中的每一個(gè)指令都會(huì)建立一層,所以在編寫RUN >時(shí)我們需要考慮進(jìn)行RUN合并減少RUN的條數(shù)
\ 表示換行 && 用于連接兩條語句
每層構(gòu)建后需要清理掉無用的東西,減少構(gòu)建的鏡像體積
寫完后使用 :wq 退出保存
3. 在有Dockerfile的文件目錄下執(zhí)行 docker build -t 鏡像名:鏡像標(biāo)簽 .(有個(gè)空格點(diǎn)別忘了)
構(gòu)建命令中最后一個(gè)點(diǎn) 表示當(dāng)前目錄,指定上下文的路徑,構(gòu)建鏡像時(shí)并不是在本地構(gòu)建的,而是在服務(wù)端,也就是 Docker 引擎中構(gòu)建的,執(zhí)行構(gòu)建命令時(shí)會(huì)將上下文路徑下的內(nèi)容打包發(fā)送到服務(wù)端執(zhí)行構(gòu)建