大家好,我是好学的小师弟,今天和大家分享下Dockerfile的常用语法和编写实战。
插曲:在学习Dockerfile之前,我们先讲解下docker save 和docker load 这两个命令
例子:
把名字为test,版本为4.0的docker镜像,保存到/data/test目录下,保存的文件名字和格式为test.tar
docker save -o /data/test/test.tar test:4.0
#这个就是docker save 的语法
#这样做,我们就可以把镜像存为tar包,保存到Linux本地,然后就可以拷给其他小伙伴用了
#因为有的公司是禁止上外网的,不好连接远程仓库,所以就用这种方式来打包镜像
#把已经生成好的服务镜像,打成tar包,再通过ssh工具,下载下来
#docker save 的语法 就是将镜像保存为你想要的格式的文件
注意:这里不要使用镜像的image id作为打包的命令,因为这样子load后,是没有镜像名字显示的;如果你是想用官方的最新镜像做tar包,那么你应该先pull最新的镜像下来然后再docker save
例子:
docker search nginx #先搜索最新的nginx镜像
docker pull nginx #默认下载的是最新的latest
docker save -o /data/test/nginx.tar nginx:latest
docker load 解压命令:
docker load -i nginx.tar
#从tar归档文件或者标准输入流载入镜像
#解压完成后,服务器就可以通过压缩包里的镜像+初始镜像=指定的特制镜像
Dockerfile的作用,就是用来生成我们指定的想要的定制镜像,通过文本编辑的方式,然后通过docker build 即可生成一个定制镜像。
Dockerfile中一些常用命令,一般包含
1.基础镜像信息
2.创建者信息
3.镜像操作指令(生成镜像过程中的指令)
4.容器启动时执行指令(通常指CMD,在镜像生成容器的时候启动该命令)
指令一般都是大写,在Dockerfile中的注释,必须是顶格的单独一行,不能和命令处于一行,不然会报错的。一般Dockerfile文件就叫Dockerfile
FROM centos:7 #我这个注释就是错误的注释写法,注释不能写在命令行
#我这个就是正确的注释写法
FROM centos:7
FROM
#FROM就是为这个要生成的镜像提供一个基础镜像
FROM centos:7
#这里的FROM就是说,我这个特制镜像的基础镜像就是centos,7版本的。
#后面的一切都是基于centos:7这个镜像来生成的
LABEL
#一般就是打标签,比如这个镜像是谁制作的,在以前的版本这个也叫做MAINTAINER
LABEL Author="好学的小师弟"
#这里的LABEL 是一个键值对的形式
ADD
#ADD其实和copy的用法差不多,只是ADD多了一个自动解压tar包的功能,所以我们一般都会使用ADD这个语法
ADD /test/nginx.tar /nginx
#注意这里是add所要添加的内容
#前面是存放tar包的目录地址,目录必须放在Dockerfile的父目录下面
#后面的目录是生成的容器里面的存放add内容的目录
#这里ADD的就是你想要的定制服务功能了,可以生成想要的镜像
#tar包哪里来的? 开发给的或者docker save这个命令来的
#ADD命令 会自动解压tar包
因为公司一般都是生成tar包的,所以我们直接在Dockerfile中ADD这个tar包即可,还有就是ADD引用的tar包要在Dockerfile的父目录下面,即和Dockerfile文件处于同一目录或子目录下
RUN
#RUN命令就是为了让你执行linux命令或者其他运行过程中的所有命令,在正常的命令语句前加一个RUN即可,例如
RUN echo “你好,这是一条测试命令”
CMD
#不管在程序里出现多少次CMD的命令,仅生效最后一个CMD命令
CMD命令的语法:
CMD [“python”,”app.py”] #这里CMD有多种使用语法,我这只是例举一项最为常见的用法
这里类似于json格式,所以必须是双引号,而不能是单引号,
cmd命令的作用就是说当容器创建的时候,执行这条命令
(简单的说,就是docker run 的时候,才会执行这道命令)
RUN和CMD命令的区别:
RUN指令运行于镜像文件构建过程中,而 CMD指令运行于基于 Dockerfile构建出的新镜像文件启动一个容器时 . CMD指令的首要目的在于为启动的容器指定默认要运行的程序。
简单的说就是,你虽然启动了容器,但是你容器里的程序还没有跑起来,所以需要你在dockfile中最后一行cmd一下这个命令,当容器起来的时候,你容器内的程序也跑起来,不然不就是一个空壳子嘛,里面的程序没有起来
VOLUME
VOLUME /home/app
#VOLUME 可以在容器内生成一个挂载点,作用就是,如果你不介意挂载的目录是随机命名的,那你生成容器的时候,直接就docker run 就行了, 不需要再docker run -v
VOLUME /data/test
#这里只是一个匿名挂载,并没有指定挂载到服务器的哪个目录下。
#就是说,你已经开了挂载这个功能,但是挂载目录名是随机命名的
#因为你没有指定,也不好指定。因为你这只是一个镜像,要给好多人用,怎么能具名挂载呢
#想要指定挂载目录名,就需要docker run的时候 -v
#或者在docker-compose中编写
插曲:Docker run -v 的两种方式介绍
#这个有冒号的,是会生成/data/test这个挂载目录名
Docker run -v /data/test:/container/data
#这个没有冒号的。只会随机生成一个挂载目录名
Docker run -v /data/test /contain/data
EXPOSE
#EXPOSE指令通知容器在运行时监听某个端口,不写协议的话(TCP/UDP),一般默认就是tcp
#这边的80端口是容器的端口,例子
EXPOSE 80/tcp
ENV
# ENV命令用来在执行docker run命令运行镜像时指定自动设置的环境变量。这个环境变量可以在后续任何RUN命令中使用,并在容器运行时保持。
ENV name="hello,nice to meet you"
RUN echo ${name}
设置的环境变量将持续存在,可以使用docker inspect来查看。这些环境变量可以通过docker run --env
ARG
#ARG命令定义用户只在构建时使用的变量,这个参数只会在构建时存在,不会保留在镜像中。
ARG
注意:ARG与ENV类似,不同的是ENV会在镜像构建结束后一直保存在容器中,而ARG会在镜像构建结束后消失
WORKDIR
#WORKDIR 是工作目录的意思
WORKDIR /usr/local
#这个意思就是说容器启动后
#会把工作目录切换到/usr/local这个workdir路径下,而不是默认的根目录
#简单地说,就是容器启动的时候,我会默认进入到这个工作目录下
#而不会进错房间,去了其他目录下了
下面这是一个Dockerfile的简单例子
#这是一个dockerfile练习笔记
FROM centos:7
#注意这里的镜像centos版本必须和服务器的centos版本一致,因为生成镜像的时候,调用的yum源就是宿主机(服务器)的yum源
LABEL Author="CSDN_好学的小师弟"
#RUN yum -y install vim
#RUN yum -y install net-tools
#ADD /bitnami-nginx.tar /bitnami-nginx
#注意这里的add所要添加的内容,目录必须放在dockerfile的父目录下面 后面的目录是生成的容器里面的存放add内容的目录
#注意在dockerfile中,所有的注释,都必须顶格写,不能和命令写在同一行。不能写成 RUN xxx #这是错误的注释写法,命令和注释不能在同一行
ENV name="hello,Dockerfile"
RUN echo ${name}
RUN echo "这是一个dockerfile的练习文档"
CMD /bin/bash
#为了节约时间,我把一些需要下载内容的命令行都注释了
Dockerfile 文档写完了之后,我们只需要通过docker build 来构建镜像
语法
Docker build -f Dockerfile所在的目录,一定要写到指向Dockerfile这个文件 -t 生成的镜像名:标签 . 注意这里在命令的最后,一定要加一个. .表示当前路径
例子:
docker build -f /root/test-Dockerfile/Dockerfile -t test-dockerfile:LATEST666 .
由于学习时间尚短,可能有出错的地方,希望大家见谅 >-
新人创作不易,觉得不错的看官,点个赞吧,么么哒!!!
转载注明出处!