制作Docker image有兩種方式: 一是使用Docker container(docker save container_name -o test.tar ) ,再導(dǎo)出image,而是使用Dockerfile, 將所有動(dòng)作導(dǎo)入到文件中,使用build命令制作成鏡像。
一,Dockerfile基本結(jié)構(gòu)
一般的Dockerfile分為四個(gè)部分:基礎(chǔ)鏡像信息,維護(hù)者信息,鏡像操作指令和容器啟動(dòng)時(shí)的指令
FROM nginx:1.13.5-alpine MAINTAINER SXY Team
FROM:指定基礎(chǔ)鏡像,要在哪個(gè)鏡像建立
FROM
第一條指令必須為FROM指令
站在用戶的角度思考問題,與客戶深入溝通,找到全南網(wǎng)站設(shè)計(jì)與全南網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋全南地區(qū)。
MAINTAINER: 指定維護(hù)者信息
MAINTAINER
RUN: 在鏡像中要執(zhí)行的命令
RUN
前者將shell終端中運(yùn)行命令,即/bin/bash -c;后者則使用exec執(zhí)行,指定使用其他終端可以通過第二種方式實(shí)現(xiàn),例如RUN ["/bin/bash", "-c", "echo hello"]
WORKDIR: 指定當(dāng)前工作目錄,相當(dāng)于cd
WORKDIR /path/to/workdir
為后續(xù)的RUN,CMD,ENTRYPOINT指令配置工作目錄,可以使用多個(gè)WORKDIR指令,后續(xù)命令如果參數(shù)是相對路徑,則會(huì)基于之前命令指定的路徑,例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終的路徑/a/b/c
EXPOSE:指定容器需要被打開的端口
EXPOSE 80
告訴docker服務(wù)容器需要暴露的端口,但是目前只在容器中暴露,如果想要在節(jié)點(diǎn)進(jìn)行暴露則需要-p 80:80,或者-P(主機(jī)將為其暴露一個(gè)隨機(jī)端口)
ENV: 定義環(huán)境變量
ENV
指定一個(gè)環(huán)境變量在容器中生成
ENV managementapi http://192.168.3.226
COPY: 復(fù)制本地dockerfile路徑根目錄下的文件到容器文件中
COPY
ADD: 相當(dāng)于COPY,但比COPY功能強(qiáng)大
ADD
此命令也是將主機(jī)任何地方文件到容器文件中,但是可以復(fù)制tar文件時(shí),也會(huì)自動(dòng)展開
VOLUME: 掛載目錄
VOLUME ["/data"]
創(chuàng)建一個(gè)可以從本地主機(jī)或者其他容器的掛載點(diǎn),一般用來存放數(shù)據(jù)
USER:
USER daemon
指定運(yùn)行容器時(shí)的用戶名或UID,后續(xù)的RUN也會(huì)使用指定用戶。當(dāng)服務(wù)不需要管理員權(quán)限時(shí),可以通過該命令指定運(yùn)行用戶,并且可以在之前創(chuàng)建需要的用戶 RUN useradd -s /sbin/nologin -M www。
ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell)
配置容器啟動(dòng)后執(zhí)行的命令,并且不可被docker run參數(shù)覆蓋,每個(gè)Dockerfile中只能有一個(gè)ENTRYPOINT,當(dāng)指定多個(gè)時(shí),只有最后一個(gè)生效
CMD:
支持三種格式
CMD ["executable","param1","param2"] 使用exec執(zhí)行
CMD command1 command2 command3 在/bin/bash中執(zhí)行,提供給需要交互應(yīng)用
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù);
指定啟動(dòng)容器時(shí)執(zhí)行的命令,每個(gè)Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最后一條會(huì)被執(zhí)行,則會(huì)覆蓋掉CMD指定命令
ENTRYPOINT和CMD的區(qū)別: ENTRYPOINT指定了該鏡像啟動(dòng)時(shí)入口,CMD則指定了容器啟動(dòng)時(shí)的命令,當(dāng)兩者共用時(shí),完整的啟動(dòng)命令像是ENTRYPOINT+CMD,使用ENTRYPOINT的好處是在我們啟動(dòng)鏡像就像是啟動(dòng)了一個(gè)可執(zhí)行程序,在CMD上僅需要指定參數(shù);另外在我們自定義CMD時(shí)不容易出錯(cuò)
使用CMD的Dockerfile:
FROM MySQL
CMD ["echo","test"]
使用ENTRYPOINT的Dockerfile
FROM mysql
ENTRYPOINT ["echo","test"]
ENTRYPOINT不能覆蓋掉執(zhí)行時(shí)的參數(shù),會(huì)把啟動(dòng)鏡像是的命令當(dāng)參數(shù),而CMD可以覆蓋掉默認(rèn)的參數(shù)