【Docker】Dockerfile基础命令和操作

【Docker】Dockerfile基础命令和操作

文章目录

  • 【Docker】Dockerfile基础命令和操作
    • 1. Dockerfile 保留命令
      • 1.1 From 命令
      • 1.2 RUN 命令
      • 1.3 EXPOSE 命令
      • 1.4 CMD命令
      • 1.5 ENTRYPOINT 命令
      • 1.6 WORKDIR 命令
      • 1.7 ENV 命令
      • 1.8 ADD 命令
      • 1.9 COPY 命令
    • 2. 实践经验
      • 2.1 ADD 和 COPY 的区别是什么?
      • 2.2 CMD 和 ENTRYPOINT 的区别
      • 2.3 CMD 和 ENTRYPOINT 结合使用
      • 2.4 编写Dockerfile构建jar包镜像

1. Dockerfile 保留命令

保留字 作用
FROM 当前镜像是基于哪个镜像
RUN 构建镜像时需要需要运行的指令
EXPOSE 当前容器对外暴露的端口号
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY 类似于ADD,拷贝文件和命令到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数

1.1 From 命令

基于哪个镜像进行构建的镜像,在构建时会自动从 docker hub 拉取base镜像,From 必须作为 Dockerfile 的第一个指令出现。

语法如下:

FROM 
FROM [:]	//使用版本不写则为latest
FROM [@]	//使用摘要

1.2 RUN 命令

RUN 命令将在当前映像之上的新层中执行任意命令并提交结果,生成的提交映像将用于 Dockerfile 中的下一步。

语法如下:

RUN  (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)

RUN /bin/bash -c 'source $HOME/.bashrc && echo $HOME'
RUN ["/bin/bash", "-c", "echo hello"]

1.3 EXPOSE 命令

用来指定构建的镜像在运行为容器时对外暴露的端口。

语法如下:

EXPOSE 80/tcp	#如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp

1.4 CMD命令

用来为启动的容器指定执行的命令,在 Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令生效。

语法如下:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

例子:

  • CMD java -jar a.jar
  • CMD [“java”,“-jar”,“a.jar”] (推荐)

1.5 ENTRYPOINT 命令

指定一个容器启动时要运行的命令ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数。

语法如下:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

1.6 WORKDIR 命令

用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

语法如下:

#使用绝对路径
WORKDIR /path/to/workdir

#先使用绝对路径,再使用相对路径
WORKDIR /a
WORKDIR b
WORKDIR c
# /a/b/c
RUN pwd

ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

1.7 ENV 命令

用来为构建镜像设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中。

语法如下:

ENV  
ENV =

1.8 ADD 命令

用来从 context(上下文) 上下文复制新文件,目录或远程文件 url ,并将它们添加到位于指定路径的镜像文件系统中。

语法如下:

ADD hom* /mydir/
ADD hom?.txt /mydir/
ADD test.txt relativeDir/
ADD test.txt /absoluteDir/

ADD url

1.9 COPY 命令

用来将 context(上下文) 目录中指定文件复制到镜像的指定目录中。

语法如下:

COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/

2. 实践经验

2.1 ADD 和 COPY 的区别是什么?

ADD和COPY都能够将宿主机的文件添加到容器当中,但是ADD还有一个更强大的功能,ADD后面还能够接url参数,就是说ADD可以联网下载你url指定的文件,而COPY仅仅只能添加上下文目录中的文件。


2.2 CMD 和 ENTRYPOINT 的区别

  • CMD 里面命令如何在运行容器时进行覆盖?

docker run image:version 覆盖自己定义命令

  • ENTRYPOINT 里面命令如何在运行容器时进行覆盖?

docker run --entrypoint=覆盖指令 image:version 传递参数


2.3 CMD 和 ENTRYPOINT 结合使用

我们创建的镜像一般不会让其他人看到镜像的内部构造,所以我们应该固定一个指令,参数随意。这样就应该让 CMD 和 ENTRYPOINT 结合使用。

  • ENTRYPOINT:用来书写一个容器固定的指令
  • CMD:用来给entrypoint传递参数

注意:配合使用时必须使用json数组语法


2.4 编写Dockerfile构建jar包镜像

一个简单的 Dockerfile 示例:

#指定基础镜像
FROM java:8-apline
#设置环境变量
ENV APP_PATH=/app
#设置工作目录
WORKDIR $APP_PATH
#将jar包导入新的镜像
ADD demo.jar $APP_PATH/apps.jar
#暴露端口
EXPOSE 8989
ENTRYPOINT ["java","-jar"]
CMD ["apps.jar"]

编写完之后,在 Dockerfile 文件目录下执行以下命令:

docker build -t apps:1.0 .

运行容器:

docker run -p 8989:8989 apps:1.0

你可能感兴趣的:(中间件,docker,容器,运维)