Javascript is required
Dockerfile命令和说明/案例

什么是Dockerfile

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

镜像:是通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。

容器:是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。

将容器中的操作保存成镜像。

将容器内的操作写在文件中。

img

使用 Dockerfile 构建镜像无须考虑构建环境,基于相同 Dockerfile 无论在哪里运行,构建结果都一致。

构建镜像

命令

docker build 
-t 镜像名称<:tags> 
-f Dockerfile目录
. 代表当前目录

语法

保留字放在每一行的开头,建议大写

指令按照顺序,从上至下执行

# 表示注解

每条指令执行都会创建一个新的镜像,并且执行提交

尝试

# 创建文件
touch dockerfile

# 编辑
vim dockerfile

# Code
FROM centos
WORKDIR /app
CMD ehco 'Hello' main.txt

# 构建
  docker build -f Dockerfile -t taoya/learn1 .

image-20201110223232132

docker run -it taoya/learn1 /bin/bash

常用命令

image.png

FROM

from必须是Dockerfile种的第一个命令。使用此命令我们设置将用作映像基础的映像。

LABEL

使用它来设置容器的描述,并使其易于管理所有容器。

LABEL Description="Bla bla bla giropops"

EXPOSE

声明容器运行的服务端口

声明容器运行的服务端口

WORKDIR

定义工作目录。随着容器的执行,这是我们访问容器时将进入的目录。

建议使用绝对路径

# 类似Linux的cd命令。 如果没有则自动创建
WORKDIR /usr/local/test

USER

要在容器内定义用户,默认用户是ROOT用户。

USER taoya

ADD & COPY

Copy

功能和 ADD 一样,只是复制,不会解压或者下载文件

# 将1.txt拷贝到根目录下。它不仅仅能拷贝单个文件,还支持Go语言风格的通配符,比如如下:
COPY 1.txt /
# 拷贝所有 abc 开头的文件到testdir目录下
COPY abc* /testdir/
# ? 是单个字符的占位符,比如匹配文件 abc1.log
COPY abc?.log /testdir/

Add

将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载

ADD <src> <dest>

# 将1.txt拷贝到根目录的abc目录下。若/abc不存在,则会自动创建
ADD 1.txt /abc

# 将test.tar.gz解压缩然后将解压缩的内容拷贝到/home/work/test
ADD test.tar.gz /home/work/test

docker官方建议当要从远程复制文件时,尽量用curl/wget命令来代替ADD。因为用ADD的时候会创建更多的镜像层。镜像层的size也大。

ENV

# 设置环境常量,方便下文引用,比如:
ENV JAVA_HOME /usr/local/jdk1.8

# 引用上面的常量,下面的RUN指令可以先不管啥意思,目的是想说明下文可以通过${xxx}的方式引用
RUN ${JAVA_HOME}/bin/java -jar xxx.jar

运行指令

run cmd entrypoint

Run

构建镜像时运行的Shell命令

RUN ['yum', 'install', 'httpd']
RUN yun install httpd

命令格式

RUN yum -y install vim

EXEC格式

RUN ['yum', '-y', 'install', 'vim']

CMD

它定义了该容器初始化时要执行的命令。

Dockerfile中只能有一条CMD指令。如果添加多个,则只有最后一个生效。

如果在命令行中传递其他命令,则使用时它可能会被覆盖

  • 启动容器后执行的命令,和 RUN 不一样,RUN 是在构建镜像是要运行的命令
  • 当使用 docker run 运行容器的时候,这个可以在命令行被覆盖

启动容器时执行的Shell命令.而不是镜像构建执行

CMD [executable, param1, param2]

CMD与Entrypoint的区别

CMD

指定这个容器启动的时候要运行的命令。只有最后一个生效。可被替换

build成功后直接执行

Entrypoint

指定这个容器启动的时候运行的命令。可以追加命令。

FROM centos
CMD ['ls', '-a']

# 对比
FROM centos
ENTRYPOINT ['ls', '-a']
docker run asda -l # 第一个报错
docker run asda -l # 第二个可以追加

VOLUME

创建一个卷,该目录将在我们的机器/主机具有一个副本。

在我们的机器中更改该体积中的某些内容将反映容器,反之亦然。

VOLUME /mydir

例子

构建自己的CentOS

FROM centos
MAINTAINER taoya7<3335215292@qq.com>

# 配置环境变量
ENV MYPATH /app
WORKDIR $MYPATH

# 安装一些软件
RUN yum -y install vim
RUN yun -y install net-tools

EXPORT 80

CMD echo $MYPATH
CMD echo '<--Success-->'
docker build -f Dockerfile -t taoya/learn2 .

image-20201111002708249

因为CMD只会执行最后一个命令

Tomcat镜像

准备好Tomcat安装包和Java的安装包

FROM centos
MAINTAINER taoya<569781231@qq.com>

ENV MYPATH /app/package
WORKDIR $MYPATH

ADD pak/jdk-8u202-linux-x64.tar.gz .
ADD pak/tomcat8.tar.gz .

RUN yum -y install vim

ENV JAVA_HOME=/app/package/jdk1.8.0_202
ENV CLASS_PATH=$JAVA_HOME/lib
ENV CATALINA_HOME=/app/package/apache-tomcat-8.5.59
ENV CATALINA_BASH=/app/package/apache-tomcat-8.5.59
ENV PATH $JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_BASH/lib:$PATH


EXPOSE 8080

CMD /app/package/apache-tomcat-8.5.59/bin/startup.sh && tail -f /app/package/apache-tomcat-8.5.59/logs/catalina.out

image-20201111004941548

  ~ docker run -it --name my -p 9000:8080 c969912f6336

image-20201111014732436

使用.dockerignore

在使用git时,我们可以使用.gitignore文件忽略一些不需要做版本管理的文件。同理,使用.dockerignore文件允许我们在构建时,忽略一些不需要参与构建的文件,从而提升构建效率。.dockerignore的定义类似于.gitignore。

参考

https://www.cnblogs.com/along21/p/10243761.html