【Docker】Dockerfile基础命令和操作

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

【Docker】Dockerfile基础命令和操作

文章目录

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 <image>
FROM <IMAGE>[:<tag>]	//使用版本不写则为latest
FROM <image>[@<digest>]	//使用摘要

1.2 RUN 命令

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

语法如下

RUN <command> (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 <key> <value>
ENV <key>=<value>

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
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker