什么是Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
镜像:是通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
容器:是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。
将容器中的操作保存成镜像。
将容器内的操作写在文件中。
使用 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 .
docker run -it taoya/learn1 /bin/bash
常用命令
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 .
因为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
➜ ~ docker run -it --name my -p 9000:8080 c969912f6336
使用.dockerignore
在使用git时,我们可以使用.gitignore文件忽略一些不需要做版本管理的文件。同理,使用.dockerignore文件允许我们在构建时,忽略一些不需要参与构建的文件,从而提升构建效率。.dockerignore的定义类似于.gitignore。