Dockerfile入門和實戰案例

一、概念

Dockerfile是一個文本文件,其內包含了一行行的指令和參數,每一行指令構建一層,所以每一行指令的內容,就是描述該層應當如何構建;它們極大簡化了從頭至尾流程上的部署工做;DockerfileFROM命令開始,緊接着跟隨者各類方法,命令和參數,最終產出一個新的能夠用於建立容器的鏡像。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才能覆蓋;CMDENTRYPOINT能夠搭配使用,ENTRYPOINT用作固定命令,CMD用作ENTRYPOINT中命令攜帶的可變參數

用法一:不使用[]任何runCMD都不能被傳入,也會覆蓋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

RUNCMDENTRYPOINTCOPYADD執行命令指定運行用戶

USER wzs

WORKDIR

RUNCMDENTRYPOINTCOPYADD設置工做目錄

WORKDIR /data

ARG

在構建鏡像時指定一些參數

ARG user

USER $user

 

三、CMDENTRYPOINT用法講解

說明:因CMDENTRYPOINT的用法比較複雜,這裏舉幾個案例對CMDENTRYPOINT的區別和用法進行解讀

案例一:CMD用法1

image.png

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

使用Dockerfile構建cmd:v1鏡像後,執行docke run cmd:v1能夠看到使用了Dockfile中的CMD echo 123 命令

image.png 

執行docke run cmd:v1 echo abc 會將Dockfile中的CMD命令覆蓋

image.png 

 

案例二:CMD用法2

image.png

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

使用[]中括號方式;這時,命令沒有再任何shell終端環境下,若是咱們要執行shell,必須把shell加入到中括號的參數中

image.png

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

image.png

 

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

CMD的第三種用法用於傳參,不攜帶任何命令;因此要配合ENTRYPOINT使用

image.png

Dockefile文件中ENTRYPOINT中的echo 做爲命令,CMDhello cmd做爲傳參,執行後以下:

image.png

也能夠在docker run時攜帶參數 hello entrypoint 覆蓋CMD的內容

image.png


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

image.png

Dockerfile中的ENTRYPOINT不使用中括號後,會覆蓋CMD的內容;docker run只會執行ENTRYPOINT

image.png

docker run時攜帶任何參數或命令都沒法被傳入到entrypoint

image.png

四、實戰案例

案例1、tomcat部署

首先建立一個制定tomcat鏡像的目錄,存放鏡像所需的安裝包和Dockerfile文件

image.png

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

image.png

使用鏡像建立並運行容器

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

image.png


案例2、nginx部署

建立一個制定nginx鏡像的目錄,存放鏡像所需的安裝包和Dockerfile文件

image.png

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

image.png

使用鏡像建立運行容器

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

image.png


案例3、mysql部署

建立一個制定tomcat鏡像的目錄,由於mysql使用yum安裝;因此這裏只有Dockerfile文件

image.png

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

image.png

使用鏡像建立運行容器

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

image.png

相關文章
相關標籤/搜索