侧边栏壁纸
博主头像
蔡关荣博客 博主等级

行动起来,活在当下

  • 累计撰写 19 篇文章
  • 累计创建 9 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Docker 入门教程(五) 使用Dockerfile文件构建镜像

Administrator
2024-10-12 / 0 评论 / 0 点赞 / 20 阅读 / 0 字

1、什么是Dockerfile

Dockerfile 是一个文本文件,其中包含一条条指令,每一条指令都用于构建镜像中的每一层。Dockerfile可以使用docker build 命令进行编译。在编写Dockerfile 之前先看看常用的镜像命令。

1.1 FORM命令

FORM命令用来指定基础镜像,后面所有的操作都是基于这个基础镜像进行操作的 (基础镜像一般使用Alpine镜像,优点是小巧,安装速度比较快)

1.2 MAINTAINER命令

MAINTAINER 命令用于将镜像作者相关的信息一起写入镜像中,通常格式为:MAINTAINER 作者姓名 邮箱地址 后续执行docker inspect 命令可以输出相应作者信息 如下所示

1.3 RUN命令

RUN 用于创建一个新的容器并执行一个命令,RUN命令最常用的就是安装包用的apt-get 命令,关于这个命令需要注意以下两点:

(1) 不要使用RUN apt-get upgrade 命令或者dist-upgrade 命令

如果基础镜像中某个包版本比较旧,盲目升级会导致意想不到的兼容问题,如果确定某个包需要升级(如foo),可以使用apt-get install -y foo 它会自动升级foo包。

(2)将RUN apt-get update 命令和apt-get install 命令组合成一条RUN声明。

RUN apt-get update 命令放在一条单独的RUN声明会导致缓存问题,以及后续的apt-get install 命令执行失败,因此,通常将RUN apt-get update 命令个apt-get install命令组合成一条RUN命令(为了保持Dockerfile文件的可读性和可维护性,一般将长的命令或复杂的命令使用反斜杠"\"进行连接)

RUN apt-get update && apt-install -y \
package-a \
package-b \
package-c \

1.3 ADDCOPY命令

ADD命令和COPY命令的功能都是实现复制,但一般优先使用COPY命令,因为COPY比ADD命令更透明。

COPY命令只支持将宿主机文件复制到容器中,而ADD命令有一些不明显的功能(如将宿主机tar提取和远程URL支持)。因此,ADD命令的最坚固用了是将宿主机的tar文件自动提取到镜像中,如"ADD jdk-8u421-linux-x64.tar.gz"。为了使镜像尽可能小,一般不建议使用ADD命令从远程URL中获取包,而是使用curl和wget。 这样就可以在文件提取完之后删除不需要的文件从而减小镜像体积。

1.4 ENV命令

ENV 用于为容器安装的程序更新PATH环境变量。例如使用ENV PATH /usr/local/nginx/bin:$PATH 来确保后面的CMD [nginx] 命令可用。 ENV命令也可以为容器化的服务提供必要的环境变量,如MySQL的MYSQL_ROOT_PASSWORD

1.5 WORKDIR 命令

指定工作目录

1.6 EXPOSE 命令

EXPOSE 命令用于指定容器将要监听的端口,比如Nginx应该使用EXPOSE 80

1.7 CMDENTRPOINT 命令

CMDENTRPOINT 命令都可以用于设置容器启动时要执行的命令。在Dockerfile文件中,CMDENTRPOINT 命令至少必有其一。

1.8 VOLUME 命令

VOLUME 命令用于指定宿主机和容器目录的映射,一般为配置文件或者容器创建的文件和目录,如Nginx的配置文件

下面通过一个简单的示例来演示如何使用Dockerfile 构建我们的镜像。

FROM centos # 指定基础镜像为CentOS
MAINTAINER cgr caicai105230@gmail.com # 作者信息
RUN mkdir /root/training  # 在CentOS中创建一个"/root/training" 目录
RUN mkdir /root/tools     # 在CentOS中创建一个"/root/tools" 目录
COPY jdk-8u421-linux-x64.tar.gz /root/tools # 将宿主机的JDK二进制文件复制到CentOS的"/root/tools" 目录下
RUN tar zxvf /root/tools/jdk-8u421-linux-x64.tar.gz -C /root/training # 将JDK二进制文件解压到CentOS的"/root/training" 目录下
ENV JAVA_HOME /root/training/jdk1.8.0_421   
ENV PATH $JAVA_HOME/bin: $PATH    # 在CentOS中设置JAVA_HOME 环境变量
ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.96/bin/apache-tomcat-9.0.96.tar.gz  /root/tools   # 从Apache网站下载Tomcat的二进制安装文件
RUN tar zxvf /root/tools/apache-tomcat-9.0.96.tar.gz -C /root/training  # 将Tomcat二进制安装文件解压到CentOS 的"/root/training" 目录
COPY MyDemoWeb.war /root/training/apache-tomcat-9.0.96/webapps # 将宿主机上的MyDemoWeb.war 复制到CentOS 的Tomcat 的webapps目录下
ENTRYPOINT ["/root/training/apache-tomcat-9.0.96/bin/catalina.sh", "run"] # 启动容器时运行Tomcat

使用docker build -t 镜像名称:tag .命令编译Dockerfile文件,参数-t用于指定镜像的标签名称,这里一定要注意,命令中最后的".",是当前命令行执行的所在目录,千万不要忽略了。

构建完成后使用docker images 查看镜像列表

补充用法

docker build -t 项目:tag 上下文(Dockerfile配置文件所在的文件夹)
# 指定Dockerfile 位置
docker build -f Dockerfile地址
# 远程Dockerfile配置文件的地址
docker build URL 

避坑指南

Status: Downloaded newer image for 111.229.198.148/library/vue-demo:latest WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested exec /docker-entrypoint.sh: exec format error

这个问题是因为在Mac系统中,构建了镜像,发布到镜像仓库中,然后pull 下来运行时报的错

docker build -t image-name:tag .

解决方案 使用docker build 时使用参数--platform指定平台类型

docker build --platform linux/amd64 -t image-name:tag .

0

评论区