Dockerfile是一個文本文件,其內包含了一行行的指令和參數,每一行指令構建一層,所以每一行指令的內容,就是描述該層應當如何構建;它們極大簡化了從頭至尾流程上的部署工做;Dockerfile從FROM命令開始,緊接着跟隨者各類方法,命令和參數,並最終產出一個新的能夠用於建立容器的鏡像。html
指令mysql |
描述linux |
示例nginx |
FROMc++ |
必須爲第一個命令,指定基礎鏡像sql |
FROM centos:latestdocker |
MAINTAINERshell |
這個命令用於聲明做者,應該放在FROM的下一行apache |
MAINTAINER wzscentos |
RUN |
構建鏡像時執行的shell命令,是Dockerfile執行命令的核心部分;
|
RUN yun install httpd RUN [「yum」,」install 」,」httpd」] |
CMD |
與RUN命令類似,都是執行shell命令;和RUN不一樣的是,RUN在構建鏡像過程當中執行,CMD是在用鏡像構建容器後被調用;若是咱們在 docker run時指定了命令或者有entrypoint,那麼CMD會被覆蓋;Dockerfile中多個CMD命令僅最後一個生效 |
用法一:不帶中括號 CMD echo "hello cmd!" 用法二:帶中括號,默認無任何shell CMD ["/bin/bash", "-c", "echo 'hello cmd!'"] 用法三:傳參給ENTRYPOINT CMD [「-l」] |
ENTRYPOINT |
與CMD命令類似,都是運行容器時執行的shell命令;與CMD不一樣的是,CMD能夠在執行docker run的時候指定命令覆蓋,ENTRYPOINT則只有使用--entrypoint才能覆蓋;CMD和ENTRYPOINT能夠搭配使用,ENTRYPOINT用作固定命令,CMD用作ENTRYPOINT中命令攜帶的可變參數 |
用法一:不使用[]任何run和CMD都不能被傳入,也會覆蓋CMD ENTRYPOINT /bin/bash -c ‘start.sh’ 用法二:使用[]可傳入CMD中的-l參數,即ls -l CMD [「-l」] ENTRYPOINT [「ls」] |
EXPOSE |
暴露容器的端口;還能夠指定端口是偵聽TCP仍是UDP,默認爲TCP |
EXPOSE 80,443 EXPOSE 80/udp |
ENV |
設置容器內的環境變量,能夠在啓動容器時--env <key>=<value>修改環境變量的值 |
ENV MYSQL_ROOT_PASSWD 123456 |
ADD |
拷貝文件或目錄到鏡像,若是是URL或壓縮包會自動下載或解壓 |
ADD https://xxx.com/html.tar.gz /var/www/html ADD html.tar.gz /var/www/html |
COPY |
拷貝文件或目錄到鏡像 |
COPY ./test.txt /tmp/test.txt |
USER |
爲RUN、CMD、ENTRYPOINT、COPY、ADD執行命令指定運行用戶 |
USER wzs |
WORKDIR |
爲RUN、CMD、ENTRYPOINT、COPY、ADD設置工做目錄 |
WORKDIR /data |
ARG |
在構建鏡像時指定一些參數 |
ARG user USER $user |
說明:因CMD和ENTRYPOINT的用法比較複雜,這裏舉幾個案例對CMD、ENTRYPOINT的區別和用法進行解讀
案例一:CMD用法1
docker build -t cmd:v1 -f /var/Dockerfile/cmd-1.txt /var/Dockerfile/
使用Dockerfile構建cmd:v1鏡像後,執行docke run cmd:v1能夠看到使用了Dockfile中的CMD echo 「123」 命令
執行docke run cmd:v1 echo 「abc」 會將Dockfile中的CMD命令覆蓋
案例二:CMD用法2
docker build -t cmd:v2 -f /var/Dockerfile/cmd-2.txt /var/Dockerfile/
使用[]中括號方式;這時,命令沒有再任何shell終端環境下,若是咱們要執行shell,必須把shell加入到中括號的參數中
執行docker run cmd:v2 ls /tmp/ 會將Dockfile中的CMD命令覆蓋
案例三:CMD用法3,ENTRYPOINT用法1
CMD的第三種用法用於傳參,不攜帶任何命令;因此要配合ENTRYPOINT使用
Dockefile文件中ENTRYPOINT中的echo 做爲命令,CMD的 「hello cmd」做爲傳參,執行後以下:
也能夠在docker run時攜帶參數 「hello entrypoint」 覆蓋CMD的內容
案例四:CMD用法3,ENTRYPOINT用法2
當Dockerfile中的ENTRYPOINT不使用中括號後,會覆蓋CMD的內容;docker run只會執行ENTRYPOINT
docker run時攜帶任何參數或命令都沒法被傳入到entrypoint裏
案例1、tomcat部署
首先建立一個制定tomcat鏡像的目錄,存放鏡像所需的安裝包和Dockerfile文件
Dockerfile文件內容
#使用基礎鏡像
FROM centos:latest
#註明做者
MAINTAINER wzs
#建立目錄
RUN mkdir -p /usr/local
#添加安裝包到鏡像
ADD apache-tomcat-7.0.93.tar.gz /usr/local/
ADD jdk-8u221-linux-x64.tar.gz /usr/local/
#定義環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.93
ENV PATH $CATALINA_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#暴露端口
EXPOSE 8080
#啓動時運行tomcat進程
CMD ["/usr/local/apache-tomcat-7.0.93/bin/catalina.sh","run"]
使用Dockerfile構建鏡像
docker build -t tomcat:v1 -f ./Dockfile.txt ./
使用鏡像建立並運行容器
docker run -itd --name tomcat-docker -p 8081:8080 tomcat:v1
案例2、nginx部署
建立一個制定nginx鏡像的目錄,存放鏡像所需的安裝包和Dockerfile文件
Dockerfile文件內容
#使用基礎鏡像
FROM centos:latest
#聲明做者
MAINTAINER wzs
#安裝依賴庫
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssh-devel zlib
#添加安裝包到鏡像
ADD nginx-1.8.0.tar.gz /usr/local
#編譯部署
RUN cd /usr/local/nginx-1.8.0 && \
./configure --prefix=/usr/local/nginx && \
make && \
make install
#刪除安裝包文件
RUN rm -rf /usr/local/nginx-1.8.0
#暴露端口
EXPOSE 80
#定義工做目錄
WORKDIR /usr/local/nginx
#啓動時運行nginx
CMD ["./sbin/nginx","-g","daemon off;"]
使用Dockerfile文件構建鏡像
docker build -t nginx:v1 -f ./Dockerfile.txt ./
使用鏡像建立運行容器
docker run -itd --name nginx-docker -p 81:80 nginx:v1
案例3、mysql部署
建立一個制定tomcat鏡像的目錄,由於mysql使用yum安裝;因此這裏只有Dockerfile文件
Dockerfile文件內容
#使用基礎鏡像
FROM centos:latest
#做者
MAINTAINER wzs
#添加mysql用戶
RUN useradd -d /opt/mysql mysql
#下載mysql的yum安裝包文件
ADD http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm /opt/
RUN rpm -ivh /opt/mysql-community-release-el7-5.noarch.rpm
#安裝mysql-server
RUN yum install -y mysql-server
#mysql初始化
RUN mysql_install_db --user=mysql --basedir=/usr/ --ldata=/var/lib/mysql/
#暴露端口
EXPOSE 3306
#這裏使用CMD和ENTRYPOINT組合,ENTRYPOINT中爲mysql服務啓動的固定命令,CMD指定mysql的運行用戶,所在docker run時能夠覆蓋修改
CMD ["--user=mysql"]
ENTRYPOINT ["/usr/sbin/mysqld"]
使用Dockerfile構建mysql鏡像
docker build -t mysql:v1 -f ./Dockerfile ./
使用鏡像建立運行容器
docker run -itd --name mysql-docker mysql:v1