Dockerfile入门和实战案例
admin
2023-04-01 09:46:54
0

1、概念

Dockerfile是一个文本文件,其内包含了一行行的指令和参数,每一行指令构建一层,因此每一行指令的内容,就是描述该层应当如何构建;它们极大简化了从头到尾流程上的部署工作;DockerfileFROM命令开始,紧接着跟随者各种方法,命令和参数,最终产出一个新的可以用于创建容器的镜像。

 

2、命令详解

指令

描述

示例

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才能覆盖;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 =修改环境变量的值

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

 

3、CMDENTRYPOINT用法讲解

说明:因CMDENTRYPOINT的用法比较复杂,这里举几个案例对CMDENTRYPOINT的区别和用法进行解读

案例一:CMD用法1

Dockerfile入门和实战案例

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

使用Dockerfile构建cmd:v1镜像后,执行docke run cmd:v1可以看到使用了Dockfile中的CMD echo 123 命令

Dockerfile入门和实战案例 

执行docke run cmd:v1 echo abc 会将Dockfile中的CMD命令覆盖

Dockerfile入门和实战案例 

 

案例二:CMD用法2

Dockerfile入门和实战案例

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

使用[]中括号方式;这时,命令没有再任何shell终端环境下,如果我们要执行shell,必须把shell加入到中括号的参数中

Dockerfile入门和实战案例

执行docker run cmd:v2 ls /tmp/ 会将Dockfile中的CMD命令覆盖

Dockerfile入门和实战案例

 

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

CMD的第三种用法用于传参,不携带任何命令;所以要配合ENTRYPOINT使用

Dockerfile入门和实战案例

Dockefile文件中ENTRYPOINT中的echo 作为命令,CMDhello cmd作为传参,执行后如下:

Dockerfile入门和实战案例

也可以在docker run时携带参数 hello entrypoint 覆盖CMD的内容

Dockerfile入门和实战案例


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

Dockerfile入门和实战案例

Dockerfile中的ENTRYPOINT不使用中括号后,会覆盖CMD的内容;docker run只会执行ENTRYPOINT

Dockerfile入门和实战案例

docker run时携带任何参数或命令都无法被传入到entrypoint

Dockerfile入门和实战案例

4、实战案例

案例一、tomcat部署

首先创建一个制定tomcat镜像的目录,存放镜像所需的安装包和Dockerfile文件

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

Dockerfile入门和实战案例

使用镜像创建并运行容器

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

Dockerfile入门和实战案例


案例二、nginx部署

创建一个制定nginx镜像的目录,存放镜像所需的安装包和Dockerfile文件

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

Dockerfile入门和实战案例

使用镜像创建运行容器

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

Dockerfile入门和实战案例


案例三、mysql部署

创建一个制定tomcat镜像的目录,因为mysql使用yum安装;所以这里只有Dockerfile文件

Dockerfile入门和实战案例

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入门和实战案例

使用镜像创建运行容器

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

Dockerfile入门和实战案例


相关内容

热门资讯

特朗普下令不打了,美国的“余粮... 可以说戛然而止,快得让很多人都无法适应。前两周,每一天美国都要打击伊朗一通。就在7月24日白宫会议前...
穆杰塔巴最新表态:支持黎真主党 △伊朗最高领袖穆杰塔巴·哈梅内伊(资料图)当地时间7月26日晚,伊朗最高领袖穆杰塔巴·哈梅内伊对黎巴...
美军瘫痪一艘驶向伊朗的油轮,特... 美国总统特朗普虽下令暂停打击伊朗,但美军仍在执行对霍尔木兹海峡的封锁任务。针对美军瘫痪一艘驶向伊朗油...
“小牌大耍”的底气到底是哪里来... 澎湃首席评论员 李平这两天,“艺人李权哲乘高铁占座事件”在网上引发热议,该艺人参加的活动主办方曾发布...
越南籍船舶南海遇险沉没,中方已... 据凤凰卫视报道,一艘越南船舶7月24日夜间在越南庆和以东220海里附近遇险沉没,船上共62名越南籍人...
李权哲占座、蒙面、装死:娱乐圈... 你买了一张高铁一等座的票,找到自己的位置,18A。有人坐着。你拿出手机看了眼购票记录——没错,18A...
杭州景区咖啡店闯入1条幼蛇,仅... 夏天气温高、湿度大,蛇类活动进入高峰期,千万别被“小蛇无害”的刻板印象骗了!有些幼蛇看着迷你可爱,实...
AI开源公开信签署企业增至50... IT之家 7 月 26 日消息,英伟达、微软、IBM、Meta 等 25 家美国科技企业本周(7 月...
南阳快手短视频代运营企业的服务... 在短视频平台快速发展的背景下,企业通过快手等渠道进行内容运营已成为常见的市场动作。对于希望借助短视频...
普通人该如何跟上科技发展的步伐 这个被称作科技的词汇, 听起来既有宏大之感, 又颇为遥远, 好似仅仅归属于在实验室里专心致志钻研的科...