前言
- 这是docker小白入门的第二部分,这部分的主要目的是普及Dockerfile的应用;
- Dockerfile作为docker的自动化配置文件,可以根据文件内容自动生成docker镜像,镜像生成后只要启动容器(run)即可使用平台,比第一阶段稍稍高级一点,但其实还是低级阶段;
- 本文的目的是让初学者能马上写一个能用的Dockerfile,不至于“从入门到放弃”;
一、安装docker
最基本的,系统里得有docker,所以,首先要先 安装docker (这部分在第一阶段有比较详细的介绍);执行命令
yum -y install docker
可以用docker version
检查docker是否安装成功,如果出现 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 的报错提示,可执行 systemctl daemon-reload
和 systemctl restart docker.service
二、为Dockerfile文件创建工作目录,编写Dockerfile
docker安装完成后,创建工作目录,我直接在根目录下创建了docker文件夹;然后编写Dockerfile文件,并将文件放到文件夹docker下;Dockerfile文件没有后缀;所有命令如下图
下面是Dockerfile文件的内部代码,直接复制粘贴即可,也可以下载一份现成的;
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo 'Hello Docker!' > index.html
二*、注意事项
上面就是一个完整的、极其简单的Dockerfile,需要解释以下几点:
- FROM命令是指此镜像是基于什么基础镜像创建的,tomcat基础镜像包含jdk等一系列必备的东西;
- WROKDIR命令指定工作路径,或者说切换当前路径;
- RUN命令有两大用法,一个是执行shell命令,上面两条RUN都是执行的shell脚本,所以Dockerfile的复杂主要体现在Shell脚本的编写,用户可以针对Shell脚本进入深入学习,以此来增强Dockerfile的编写能力;RUN的另一个用法是执行exec命令,用法格式为
RUN ["","参数1","参数2"]
,入门阶段不涉及; - 常用命令还有COPY复制命令,COPY命令也有两种使用方式,和RUN类似,一个类似命令,一个类似函数调用。类似命令的COPY指令的格式是
COPY <上下文路径> ... <目标路径>
,上下文路径就不解释了,目标路径就是镜像中的文件夹的路径,这俩都是相对路径。 - 常用命令还有一个ADD,和COPY类似,但多了一个功能,即源路径(上下文路径)可以是一个URL,同时,如果源文件是tar格式的话,ADD命令会自动解压文件到目标路径;但是要注意,ADD指令会令镜像构建缓存失效,从而可能会令镜像构建变的比较缓慢;
- 后面的demo中有个EXPOSE指令,含义为暴露端口
- CMD命令也和RUN类似,好比执行cmd命令,这个需要一个例子才好介绍,本例还未涉及到,所以,用户可先自行百度查看;
补充: 上下文路径是指,liunx中打包并解压后的文件夹路径;
三、执行Dockerfile
Dockerfile文件写完之后要利用这个Dockerfile创建镜像,下面就是创建镜像的执行命令。
docker build -t mydocker .
注意:
- 这里的“mydocker”是镜像的名字,创建的时候可以随意起名,但是只支持小写字母;
- mydocker 后面一定记得跟那个点,不然会报错,如下图;
- 如果build创建的过程中出现错误,创建失败,可能会出现[虚悬镜像],这个时候我们用
docker image prune
指令来清除虚悬镜像;如果巧了,虚悬镜像没有清除掉,有可能是因为有容器的生成导致虚悬镜像删除失败,这个时候,使用docker ps -a
或者docker ps
查看容器,找到占用的容器后,使用docker rm xxxxxx
来移除容器(也可以在rm后面加 -f 来强制删除容器),容器移除完毕后再重新删除虚悬镜像即可。(这部分如果觉得我说的模糊,可以后文留言,我再补充)
此时,镜像创建完毕
四、启动镜像
镜像创建完毕后,启动镜像生成容器(以下面的代码为准,截图中的代码有误,懒得重新截图了),执行命令如下
docker run -d -p 8080:8080 mydocker
启动成功后我们可以进入容器内部,看到ROOT目录下只有我们写进去的index.html文件(进入容器内部用exec命令,使用方法看第一阶段)
如果我们在容器内,可以用命令exit
命令退出容器;
五、打开页面,查看效果
以上,这样我们就通过Dockerfile创建完成了一个,只有一个index.html页面的web项目,并且可以正常访问。如果读者想启动一个自己的项目,这里以zip包为例(即你的项目已经打成了zip包),提供了一个Dockerfile
以下是另一个Dockerfile,这个Dockerfile将一个crm项目打成了zip包,将zip复制到了tomcat下,解压并移除原始zip包,启动镜像,这样就能将任意项目通过dockerfile的方式启动了;
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
COPY crm.zip .
RUN unzip crm.zip
RUN rm -fr crm.zip
WORKDIR /usr/local/tomcat/
EXPOSE 8080
其他步骤见上文