1.Dockerfile简介
Docker可以通过阅读Docker的指令来自动构建映像 Dockerfile。A Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。使用docker build 用户可以创建自动构建,该构建连续执行多个命令行指令。
2. Dockerfile的基本结构
Dockerfile 由一行行命令语句组成,并且支持以 #
开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
3. Dockerfile关键字
命令 | 描述 |
---|---|
FROM | 基础镜像,当前新镜像是基于哪个镜像的 |
MAINTAINER | 镜像维护者的名字和邮箱地址 |
RUN | 容器构建时需要的命令 |
EXPOSE | 当前容器对外暴露的接口 |
WORKDIR | 指定创建容器后,终端默认登录进来的工作目录 |
ENV | 用来构建镜像中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像并且ADD会自动处理URL和解压tar包 |
COPY | 类似ADD,拷贝文件和目录到镜像中 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换 |
ENTRYPOINT | 指定容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数 |
ONBUILD | 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后触发父镜像的ONBUILD |
4.案例通过Dockerfile创建tomcat镜像
该案例是基于openjdk镜像构建一个自己的tomcat镜像。
因为本人安装的Docker for Windows,所以以下操作内容中会和linux有一点区别,最要体现在目录路径上。
4.1. 创建Dockerfile文件
创建一个空文件夹docker
,在文件夹中添加下载好的apache-tomcat-8.5.51.tar.gz
文件,并创建名为Dockerfile
的文件。
在Dockerfile中编辑以下内容:
# 创建的容器需要基于openjdk:8u102-jre容器 (必须有)
FROM openjdk:8u102-jre
# 作者姓名及邮箱 (可有可无)
MAINTAINER xx<xxx@qq.com>
# 设置环境变量CATALINA_HOME为tomcat的路径
# PATH设置tomcat的bin目录方便运行内部脚本文件
ENV CATALINA_HOME /usr/local/tomcat-8
ENV PATH $CATALINA_HOME/bin:$PATH
# 设置工作路径,相当linux中使用cd到某个目录
WORKDIR $CATALINA_HOME
# 拷贝当前文件夹中的tomcat文件到容器中的root目录中
# ADD指定可自动解压这里的tar文件
# 当然也可以使用COPY指令,但是tar文件需要在下面的RUN指令手动解压
ADD ./apache-tomcat-8.5.51.tar.gz /root/
# 移动tomcat文件到自定义的tomcat路径中
RUN mv /root/apache-tomcat-8.5.51/* $CATALINA_HOME
# 需要共享、挂载和持久化的目录 (可有可无)
VOLUME $CATALINA_HOME/webapps/
# 需要暴露的端口 (可有可无)
EXPOSE 8080
# 容器启动后需要运行的命令,这里也可以使用ENTRYPOINT替代
# 这里有个需要使用双引号,使用单引号找不到命令
CMD ["catalina.sh","run"]
4.2 构建镜像
在以上创建的docker文件夹中打开cmd命令窗口,并数据命令docker build -t mytomcat .
。这里有个" . " 别漏了,表示从当前路径中查找Dockerfile文件。
4.3 创建并启动镜像
继续输入以下指令docker run -d -p 8080:8080 -v D:/DevelopmentData/docker/tomcat:/usr/local/tomcat-8/webapps mytomcat
,构建并运行mytomcat容器。-d后台运行,-p 宿主机:容器之间端口映射,-v 将容器的webapp路径挂载到宿主机的tomcat目录。
使用docker ps
命令查看运行中容器。
4.4 测试
在浏览器中输入localhost:8080
,显示以下内容表示启动成功。
现在在宿主机的挂载目录下新建一个ROOT目录并在目录中创建一个index.html文件,输入内容:“ 我的tomcat镜像创建成功… ”。
然后再次在浏览器中输入localhost:8080
,显示如下内容,表示目录挂载成功。
4.5 问题
在以上4.4的测试中输入网址网页显示为什么是404
,而不是tomcat的主页,因为在以上运行容器的命令参数中有 -v D:/DevelopmentData/docker/tomcat:/usr/local/tomcat-8/webapps
,因为宿主机的tomcat目录为空,它会覆盖掉容器的webapps目录。也是就是说容器的目录一定会被它所挂载的宿主机目录所覆盖。
如果想要保留容器目录中的内容,可以考虑先不挂在目录启动容器,并进入容器拷贝出要挂载的内容到宿主机目录,然后再重复以上4.3的操作。