DockerFile指令详解及使用

Docker

指令详解

Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。

1.FROM
格式为FROM image或FROM image:tag,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。

2.MAINTAINER
格式为MAINTAINER user_name user_email,指定维护者信息

3.RUN
格式为RUN command或 RUN [“EXECUTABLE”,“PARAM1”,“PARAM2”…],前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c “echo hello”;后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c",“echo hello”]

4.CMD
支持三种格式:
CMD [“executable”,“param1”,“param2”],使用exec执行,这是推荐的方式。
CMD command param1 param2 在/bin/sh中执行。
CMD [“param1”,“param2”] 提供给ENTERYPOINT的默认参数。
CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。

5.EXPOSE
格式为 EXPOSE port [port2,port3,…],例如EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。

6.ENV
格式为:EVN key value 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
例如
ENV word hello
RUN echo $word

7.ADD
格式:ADD src dest
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。

8.COPY
格式为:COPY src desc
复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。

9.ENTRYPOINT
格式有两种:
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。

10.VOLUME
格式为 VOLUME ["/data"]
作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。

11.USER
格式为:USER username
指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。
例如:RUN groupadd -r docker && useradd -r -g docker docker

12.WORKDIR
格式: WORKDIR /path
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

13.docker build
创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。

jar包镜像Dockerfile

#基础镜像使用java8
FROM java:8
#作者
MAINTAINER  tfs <XXX@agree.com>
#VOLUME 指定了临时文件目录为/tmp
VOLUME /tmp
#将jar包添加到容器中并更名为app.jar
ADD demo.jar app.jar
#运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT [“java”,”-Djava.security.egd=file:/dev/./urandom”,”-jar”,”/app.jar”]

Zip镜像Dockerfile

#基础镜像使用java8
FROM java:8
#作者
MAINTAINER   tfs <XXX@agree.com>
#VOLUME 指定了临时文件目录为/tmp
VOLUME /tmp
#EXPOSE暴露端口
EXPOSE 8088 8081
#将zip包添加到容器中并更名为app.zip
ADD cn.com.agree.ab4.admin-20201109.141812.zip app.zip
#运行jar包
RUN unzip app.zip
ENTRYPOINT [“java”,”-Djava.security.egd=file:/dev/./urandom”,”-jar”,”app.jar”]

指定配置文件运行jar包

java -jar /home/gateway.jar --spring.config.location=/home/config/application.yml

镜像

制作镜像

docker build -t ab4docker .

启动容器

docker run -d -p hostPort:containerPort –name containerName ab4docker

-d 容器后端运行

-p 端口映射

删除所有未运行的容器

docker rm $(sudo docker ps -a -q)

进入容器内部命令

docker exec -it /bin/bash

登陆账号

docker login -u xxx -p xxx

上传镜像

docker tag graphql:v1 tfs2316178210/graphql:v1 打包镜像

docker push tfs2316178210/graphql:v1 上传

挂载文件执行

docker run -it -p 6062:6062 --name iot-web2323 -v /home/iot-web/config/:/home/config/ -v /home/iot-web/templates/:/home/templates

查看日志

docker logs

示例

# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER tfs
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  
#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dockerfile 是用于构建 Docker 镜像的一种文本格式,包含了一系列指令来描述如何构建镜像。Dockerfile 的编写需要遵循一定的规范,包括指令、注释、变量和环境变量等。下面是 Dockerfile 进阶详解: 1. 使用 ARG 指令定义变量 使用 ARG 指令可以定义一个变量,可以在后续指令使用。例如: ``` ARG VERSION=latest FROM ubuntu:${VERSION} ``` 在构建镜像时可以使用 --build-arg 参数来指定变量的值,例如: ``` docker build --build-arg VERSION=18.04 . ``` 2. 使用 ENV 指令定义环境变量 使用 ENV 指令可以定义环境变量,可以在容器运行时使用。例如: ``` ENV TZ=Asia/Shanghai ``` 3. 使用 WORKDIR 指令定义工作目录 使用 WORKDIR 指令可以定义工作目录,可以在容器运行时使用。例如: ``` WORKDIR /app ``` 4. 使用 COPY 和 ADD 指令复制文件 使用 COPY 和 ADD 指令可以复制本地文件到镜像中。COPY 只能复制本地文件,ADD 还支持 URL 和 tar 包的复制。例如: ``` COPY index.html /var/www/html/ ADD http://example.com/file.tar.gz /tmp/ ``` 5. 使用 CMD 和 ENTRYPOINT 指令定义容器启动命令 使用 CMD 和 ENTRYPOINT 指令可以定义容器启动命令,其中 ENTRYPOINT 可以和 CMD 配合使用。例如: ``` ENTRYPOINT ["/bin/sh", "-c"] CMD ["echo", "Hello World"] ``` 6. 使用 EXPOSE 指令定义端口 使用 EXPOSE 指令可以定义容器监听的端口,但并不会自动映射到主机。例如: ``` EXPOSE 80 ``` 7. 使用 FROM 指令选择基础镜像 使用 FROM 指令可以选择基础镜像,可以使用特定的版本或者 latest。例如: ``` FROM ubuntu:18.04 ``` 8. 使用 RUN 指令执行命令 使用 RUN 指令可以在镜像中执行命令。例如: ``` RUN apt-get update && apt-get install -y nginx ``` 9. 使用 LABEL 指令定义元数据 使用 LABEL 指令可以定义镜像的元数据,可以用于查询和过滤镜像。例如: ``` LABEL maintainer="John Doe <john.doe@example.com>" ``` 以上是 Dockerfile 进阶的一些指令和用法,可以帮助你更好地构建镜像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值