容器(docker)使用Dockerfile制作镜像

举报
Gere 发表于 2022/08/07 19:32:02 2022/08/07
【摘要】 目录一. DockerFile 制作Centos镜像1. 编写DockerFile 文件2. 通过这个DockerFile 文件构建镜像3. 测试运行自己构建的镜像二.  CMD 和 ENTRYPOINT 命令的区别1. CMD 命令2. ENTRYPOINT 命令三. DockerFile 制作Tomcat 镜像一. DockerFile 制作Centos镜像当我们学习了DockerFil...

目录

一. DockerFile 制作Centos镜像

1. 编写DockerFile 文件

2. 通过这个DockerFile 文件构建镜像

3. 测试运行自己构建的镜像

二.  CMD 和 ENTRYPOINT 命令的区别

1. CMD 命令

2. ENTRYPOINT 命令

三. DockerFile 制作Tomcat 镜像


一. DockerFile 制作Centos镜像

当我们学习了DockerFile 的基础指令之后,我们就可以自己制作一个镜像了;Docker Hub 网站上的大部分镜像都是从这个镜像过来的:FROM scratch,然后配置需要的软件和配置进行构建,例如可以创建一个自己的centos:

1. 编写DockerFile 文件

默认的centos 很多命令是没有的,例如vim,ifconfig命令是没有的,我们可以制作自己的镜像然后加入一些自己的命令,我们在/home/目录下创建一个dockerfile 目录:

编写dockerfile 文件的时候需要注意dockerfile 中的FROM centos 命令后面需要写上版本号:7,因为默认是基于centos 8,而centos 8 在2021年停止了服务,所以使用yum 命令会报错,下面的FROM表示以谁为基础,需要在后面跟上一个版本号,MAINTAINER表示镜像是谁写的,ENV表示设置环境变量,WORKDIR表示镜像的工作目录, RUN表示镜像构建的时候需要运行的命令,EXPOSE声明端口,CMD:指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可以被替代:

FROM centos:7
MAINTAINER zhangyu<632666326@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUM yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash

2. 通过这个DockerFile 文件构建镜像

docker build -f mydockerfile -t mycentos:0.1 . # build 表示构建, -f 表示当前dockerfile的路径, -t 表示对生成的镜像以及tag进行命名, mycentos:0.1 表示构建的镜像为mycentos, 0.1表示版本号

当成功运行之后会出现Successfully tagged mycentos:0.1,如下图所示:

3. 测试运行自己构建的镜像

默认的centos 工作目录为/,我们自己构建的centos由于设置了工作目录为/usr/local,所以当我们进入容器的时候使用pwd命令显示的当前目录就是/usr/local,当我们进入docker的时候默认进入的是工作目录而不是/ 目录,并且设置了ifconfig命令也是可以使用的:

docker run -it mycentos:0.1 # 通过我们构建的镜像启动容器, 注意需要加上版本号
pwd # 查看当前的工作目录

我们可以列出本地进行的变更历史,这样我们揣摩一下官方是如何做的:

docker history 镜像id

所以平时拿到一个镜像可以研究一下别人是怎么样做的;

二.  CMD 和 ENTRYPOINT 命令的区别

1. CMD 命令

在/home/dockerfile 目录下使用vim创建docker-cmd-test文件,docker-cmd-test 文件内容如下所示,以centos7为基础,执行ls -a 命令:

FROM centos:7
CMD ["ls", "-a"]

使用build 命令构建成为一个镜像,使用run 命令直接运行,使用镜像启动容器的时候会执行ls -a指令:

docker build -f docker-cmd-test -t cmdtest . # 使用build命令构建一个镜像
docker images # 查看所有的镜像
docker run 846cf65f5a01 # 运行当前构建的镜像, 镜像id为846cf65f5a01, 通过镜像启动容器

我们想在ls -a后面追加一个命令-l,但是运行之后发现报错了,为什么呢?因为在cmd 命令的情况下,-l替换了CMD ["ls" , "-a"]命令,-l不是命令所以报错,解决方法:需要使用完全的路径构建但是这样做特别麻烦:

2. ENTRYPOINT 命令

其实cmd和entrypoint命令类似于覆盖与追加的概念,entrypoint命令直接可以在命令后面追加参数:

FROM centos
ENTRYPOINT ["ls", "-a"]

在/home/dockerfile/目录下使用vim 创建docker-entrypoint-test 文件,然后使用build 命令构建一个名为entrypoint-test的镜像:

FROM centos
ENTRYPOINT ["ls", "-a"]
docker build -f docker-entrypoint-test -t entrypoint-test .

通过刚才构建的entrypoint-test 镜像使用run 命令运行:

当我们追加-l参数的时候发现是不会报错的,这也是CMD命令与ENTRYPOINT命令的区别:

小结:docker 中很多命令都是类似的,我们需要了解它们的差别,然后测试它们;

三. DockerFile 制作Tomcat 镜像

DockerFile 制作Tomcat 镜像还是比较复杂的,下面是具体的制作过程:

1. 准备镜像文件tomcat 压缩包,jdk 压缩包(tomcat 镜像需要使用到tomcat 和jdk 环境,我是使用xftp 将压缩包上传到 /root/zhangyu/tomcat 目录);

2. 编写dockerfile 文件,官方命名Dockerfile,这样使用build 命令的时候会自动寻找这个文件,就不需要-f 指定了,下面是Dockerfile 文件的内容,其中COPY 和 ADD 命令压缩包的路径都是使用的相对路径,之前使用绝对路径好像报错了所以修改为相对路径,使用相对路径需要进入到压缩包所在的目录进行操作(注意Dockerfile 文件中的内容一定要写对否则后面会出现其他的问题):

FROM centos:7
MAINTAINER zhangyu<37273273828@qq.com>
COPY readme.txt /usr/local
ADD jdk-8u152-linux-x64.tar.gz /usr/local/ # ADD 命令在添加内容的实现可以实现自动解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_152
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 先启动tomcat, && 表示命令的拼接tail -F 命令表示查看日志

3.  通过Dockerfile 文件使用build 命令构建镜像,由于dockerfile 文件使用了官方命名Dockerfile 所以不用 -f参数指定Dockerfile 路径,直接使用-t 后面跟上镜像名:标签名:

docker build -t mytomcat . # 使用build 命令构建一个镜像

4. 运行构建的镜像,使用-v 命令挂载目录:

docker run -d -p 9090:8080 --name zhangyutomcat -v /root/zhangyu/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /root/zhangyu/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat
# -d 表示后台运行, -p 表示宿主机端口与容器内部端口映射, --name 表示给容器起一个名字, -v 表示挂载目录

如果成功运行之后可以发现文件挂载成功:

使用exec 命令进入正在运行的 zhangyutomcat 容器(如果启动不了容器大概率是Dockerfile文件中配置文件的路径写错了或者是某些命令写错了只有当Dockerfile 文件的命令正确的时候最终才可以成功启动一个tomcat容器,成功运行之后才可以使用exec 命令进入到正在运行的tomcat容器):

docker exec -it 运行的容器id /bin/bash # 进入正在运行的容器 

可以发现使用exec 命令进入到tomcat容器中的默认的工作目录就是/usr/local,并且挂载的目录也是存在的:

5. 测试运行

在浏览器中输入 centos 7 的ip 地址:9090, 判断是否成功访问,我之前设置的linux 的静态ip 地址为:192.168.65.5,如果可以成功访问那么可以看到tomcat 的访问页面,之前由于写错了JAVA_HOME的路径,与Linux 上启动的容器中的java 路径是不匹配的导致java 环境出错了,所以在浏览器页面中输入centos 7 的静态ip 地址无法访问成功,所以无法访问,后面查看了一下centos 7 本地的输出日志(catalina.out文件)后面发现是找不到java 的环境变量所以出错了,只能够删除掉镜像重新构建了:

Dockerfile 文件中的java 环境变量如下,不一致了导致找不到就出错了:

当java 环境变量修改一致之后在windows 浏览器中就可以成功访问了,如果成功运行那么在浏览器中会看到tomcat 的页面(我的centos 7 的静态ip 地址设置为192.168.65.5),一般无法成功启动服务需要查看日志输出根据提示信息判断哪里出了问题:


6. 发布项目(由于做了卷挂载,我们直接在本地编写项目发布即可,这样就可以不用进入到容器中了),我们只需要在之前 linux 上的挂载目录test 上发布项目即可,在centos 7 挂载的test目录上创建WEB-INF 目录,并且在这个目录中创建web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

创建一个index.jsp页面用来测试:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%
	System.out.println("hello world!!!")
%>
</body>
</html>

如果可以正常访问那么会显示jsp 页面中的代码,说明我们挂载的目录使正确的:

小结:以后开发的步骤就是要掌握Dockerfile 文件的编写,之后的一切都是使用docker 镜像发布运行!

四. 发布镜像到Docker Hub 网站上:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。