您好,登錄后才能下訂單哦!
Dockerfile是一個文本文件,其內包含了一行行的指令和參數,每一行指令構建一層,因此每一行指令的內容,就是描述該層應當如何構建;它們極大簡化了從頭到尾流程上的部署工作;Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數,并最終產出一個新的可以用于創建容器的鏡像。
?
指令 | 描述 | 示例 |
FROM | 必須為第一個命令,指定基礎鏡像 | FROM centos:latest |
MAINTAINER | 這個命令用于聲明作者,應該放在FROM的下一行 | MAINTAINER wzs |
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里
案例一、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
案例二、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
案例三、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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。