溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dockerfile入門和實戰(zhàn)案例

發(fā)布時間:2020-10-09 11:22:25 來源:網(wǎng)絡 閱讀:380 作者:wx5c1078d59f836 欄目:云計算

1、概念

Dockerfile是一個文本文件,其內包含了一行行的指令和參數(shù),每一行指令構建一層,因此每一行指令的內容,就是描述該層應當如何構建;它們極大簡化了從頭到尾流程上的部署工作;DockerfileFROM命令開始,緊接著跟隨者各種方法,命令和參數(shù),最終產(chǎn)出一個新的可以用于創(chuàng)建容器的鏡像。

?

2、命令詳解

指令

描述

示例

FROM

必須為第一個命令,指定基礎鏡像

FROM centos:latest

MAINTAINER

這個命令用于聲明作者,應該放在FROM的下一行

MAINTAINER wzs

RUN

構建鏡像時執(zhí)行的shell命令,是Dockerfile執(zhí)行命令的核心部分;

?

RUN yun install httpd

RUN [yum,install ,httpd]

CMD

RUN命令相似,都是執(zhí)行shell命令;和RUN不同的是,RUN在構建鏡像過程中執(zhí)行,CMD是在用鏡像構建容器后被調用;如果我們在 docker run時指定了命令或者有entrypoint,那么CMD會被覆蓋;Dockerfile中多個CMD命令僅最后一個生效

用法一:不帶中括號

CMD echo "hello cmd!"

用法二:帶中括號,默認無任何shell

CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]

用法三:傳參給ENTRYPOINT

CMD [-l]

ENTRYPOINT

CMD命令相似,都是運行容器時執(zhí)行的shell命令;與CMD不同的是,CMD可以在執(zhí)行docker run的時候指定命令覆蓋,ENTRYPOINT則只有使用--entrypoint才能覆蓋;CMDENTRYPOINT可以搭配使用,ENTRYPOINT用做固定命令,CMD用做ENTRYPOINT中命令攜帶的可變參數(shù)

用法一:不使用[]任何runCMD都不能被傳入,也會覆蓋CMD

ENTRYPOINT /bin/bash -c start.sh

用法二:使用[]可傳入CMD中的-l參數(shù),即ls -l

CMD [-l]

ENTRYPOINT [ls]

EXPOSE

暴露容器的端口;還可以指定端口是偵聽TCP還是UDP,默認為TCP

EXPOSE 80,443

EXPOSE 80/udp

ENV

設置容器內的環(huán)境變量,可以在啟動容器時--env <key>=<value>修改環(huán)境變量的值

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

RUNCMD、ENTRYPOINT、COPY、ADD執(zhí)行命令指定運行用戶

USER wzs

WORKDIR

RUN、CMD、ENTRYPOINT、COPY、ADD設置工作目錄

WORKDIR /data

ARG

在構建鏡像時指定一些參數(shù)

ARG user

USER $user

?

3、CMDENTRYPOINT用法講解

說明:因CMDENTRYPOINT的用法比較復雜,這里舉幾個案例對CMD、ENTRYPOINT的區(qū)別和用法進行解讀

案例一:CMD用法1

Dockerfile入門和實戰(zhàn)案例

docker build -t cmd:v1 ?-f /var/Dockerfile/cmd-1.txt /var/Dockerfile/

使用Dockerfile構建cmd:v1鏡像后,執(zhí)行docke run cmd:v1可以看到使用了Dockfile中的CMD echo 123?命令

Dockerfile入門和實戰(zhàn)案例?

執(zhí)行docke run cmd:v1 echo abc?會將Dockfile中的CMD命令覆蓋

Dockerfile入門和實戰(zhàn)案例?

?

案例二:CMD用法2

Dockerfile入門和實戰(zhàn)案例

docker build -t cmd:v2 ?-f /var/Dockerfile/cmd-2.txt /var/Dockerfile/

使用[]中括號方式;這時,命令沒有再任何shell終端環(huán)境下,如果我們要執(zhí)行shell,必須把shell加入到中括號的參數(shù)中

Dockerfile入門和實戰(zhàn)案例

執(zhí)行docker run cmd:v2 ls /tmp/?會將Dockfile中的CMD命令覆蓋

Dockerfile入門和實戰(zhàn)案例

?

案例三:CMD用法3,ENTRYPOINT用法1

CMD的第三種用法用于傳參,不攜帶任何命令;所以要配合ENTRYPOINT使用

Dockerfile入門和實戰(zhàn)案例

Dockefile文件中ENTRYPOINT中的echo 作為命令,CMDhello cmd作為傳參,執(zhí)行后如下:

Dockerfile入門和實戰(zhàn)案例

也可以在docker run時攜帶參數(shù) hello entrypoint?覆蓋CMD的內容

Dockerfile入門和實戰(zhàn)案例


案例四:CMD用法3,ENTRYPOINT用法2

Dockerfile入門和實戰(zhàn)案例

Dockerfile中的ENTRYPOINT不使用中括號后,會覆蓋CMD的內容;docker run只會執(zhí)行ENTRYPOINT

Dockerfile入門和實戰(zhàn)案例

docker run時攜帶任何參數(shù)或命令都無法被傳入到entrypoint

Dockerfile入門和實戰(zhàn)案例

4、實戰(zhàn)案例

案例一、tomcat部署

首先創(chuàng)建一個制定tomcat鏡像的目錄,存放鏡像所需的安裝包和Dockerfile文件

Dockerfile入門和實戰(zhàn)案例

Dockerfile文件內容

#使用基礎鏡像

FROM centos:latest

#注明作者

MAINTAINER wzs

#創(chuàng)建目錄

RUN mkdir -p /usr/local

#添加安裝包到鏡像

ADD apache-tomcat-7.0.93.tar.gz /usr/local/

ADD jdk-8u221-linux-x64.tar.gz /usr/local/

#定義環(huán)境變量

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 ./

Dockerfile入門和實戰(zhàn)案例

使用鏡像創(chuàng)建并運行容器

docker run -itd --name tomcat-docker -p 8081:8080 tomcat:v1

Dockerfile入門和實戰(zhàn)案例


案例二、nginx部署

創(chuàng)建一個制定nginx鏡像的目錄,存放鏡像所需的安裝包和Dockerfile文件

Dockerfile入門和實戰(zhàn)案例

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 ./

Dockerfile入門和實戰(zhàn)案例

使用鏡像創(chuàng)建運行容器

docker run -itd --name nginx-docker -p 81:80 nginx:v1

Dockerfile入門和實戰(zhàn)案例


案例三、mysql部署

創(chuàng)建一個制定tomcat鏡像的目錄,因為mysql使用yum安裝;所以這里只有Dockerfile文件

Dockerfile入門和實戰(zhàn)案例

Dockerfile文件內容

#使用基礎鏡像

FROM centos:latest

#作者

MAINTAINER wzs

#添加mysql用戶

RUN useradd -d /opt/mysql mysql

#下載mysqlyum安裝包文件

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

#這里使用CMDENTRYPOINT組合,ENTRYPOINT中為mysql服務啟動的固定命令,CMD指定mysql的運行用戶,所在docker run時可以覆蓋修改

CMD ["--user=mysql"]

ENTRYPOINT ["/usr/sbin/mysqld"]

使用Dockerfile構建mysql鏡像

docker build -t mysql:v1 -f ./Dockerfile ./

Dockerfile入門和實戰(zhàn)案例

使用鏡像創(chuàng)建運行容器

docker run -itd --name mysql-docker mysql:v1

Dockerfile入門和實戰(zhàn)案例


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI