Dockerfile的基础命令

本文详细介绍了Docker的基本概念,包括如何配置Docker以加速镜像拉取,以及通过Dockerfile创建镜像的具体指令。涵盖FROM、MAINTAINER、LABEL、COPY、ADD、WORKDIR、VOLUME、EXPOSE、ENV、RUN、CMD、ENTRYPOINT等关键指令的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Docker版本:docker-ce-18.06.1.ce-3.el7.x86_64

docker-ce的配置文件:/etc/docker/daemon.json
docker镜像站点在国外,可以配置加速器来进行镜像拉取加速:
	docker cn
		将下列字符串添加到:/etc/docker/daemin.json
		{"registry-mirrors":["https://registry.docker-cn.com"]}
	中国科技大学
	阿里云加速器:需要注册阿里云,然后获得专用加速器

2. 制作镜像

2.1 基于容器
2.2 基于Dockerfile

使用docker build 命令制作镜像,docker build --help
使用Dockerfile制作镜像时,默认将工作目录下的所有文件都包括,可以使用 .dockeringore 命令将工作目录下的文件排除在外

3. Dockerfile Instructions

  • FROM
    必须是Docekerfile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基准镜像
FROM <repositiry>[:<tag>]
FROM <repository>@<digest>(digest:哈希码)
  • MAINTAINER
    可以是任务文本信息,约定俗称的是作者信息
    新版docker已经废弃可以使用LABEL;

  • LABEL
    添加元数据

<key>=<value> <key>=<value> ...   命令形式
  • COPY
    用于从Docker主机复制文件至创建的新镜像文件
COPY <src> ... <dest>
COPY ["<src>",... "<dest>"]
	src源文件或目录,支持通配符
	dest目标路径,建议使用绝对路径
		如果src是目录,其内部文件或子目录会被递归复制,但<src>目录本身不会被复制(相当于 /*)
  • ADD
    类似于COPY命令,ADD支持使用tar文件和url路径
ADD <src> ... <dest>
ADD ["<src>",... "<dest>"]
	ADD后跟url的时候是下载文件,但不解压;ADD后面跟本地tar文件的时候,是直接解压到目标目录
  • WORKDIR
    工作目录;在dockerfile里面切换到WORKDIR目录

  • VOLUME
    用于在image中创建一个挂载点目录,以挂在Docker host的卷或其他容器的卷

VOLUME <mountpoint>
VOLUME <"<mountpoint>">
  • EXPOSE
    用于为容器打开指定要监听的端口以实现与外部通信
EXPOSE <port>[/<protocol>][<port>][/<protocol>] ...
	protocol指定传输的协议;默认是tcp
	也可以一次指定多个端口:EXPOSE 11211/udp 11212/tcp
  • ENV
    用于为镜像定义所需的环境变量;并可被Dockerfile文件中位于其后的其它指令(ENV,ADD,COPY)所调用
ENV <key> <value>
ENV <key>=<value>
  • RUN
    用于指定docker build过程中运行的程序,其可以是任何命令
RUN <command>	command通常是一个shell命令,且以"/bin/bash -c"来运行它			或	
RUN ["<executable>","<param1>","<param2>"]
	参数是一个JSON格式的数据,executable后面为要运行的命令,paramN为传递给命令的选项或参数
	依赖shell特性的话,可以将其替换为:RUN ["/bin/bash","-c","<executable>","<param1>"]
  • CMD
    RUN指令运行于镜像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新镜像文件启动一个容器时
CMD <command>
CMD ["<executable","<param1>","<param2>"]
CMD ["<param1>","<param2>"]
  • ENTRYPOINT
    类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序,与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
    注意:docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<patam2>"]
	docker run 命令传入的命令参数回覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用
	Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
  • SHELL
    指定shell程序,默认是 /bin/shell -c

  • STOPSIGNAL
    -15的信号,发送停止的信号给container

  • ARG
    是一个变量,只在build的过程中使用

  • ONBUILD
    用于在Dockerfile中定义有一个触发器;Dockerfile用于build镜像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件;在后面的Dockerfile中的FROM指令在build过程中被执行时,将会“触发”其base image的Dockerfile文件中的ONBUILD指令定义的触发器

练习

  • Dockerfile Test1:
FROM busybox:latest
MAINTAINER "chenmx <chenmx@163.com>"
#LABEL mailtainer="chenmx <chenmx@163.com>"
ENV DOC_ROOT /data/web/html/
#COPY index.html /data/web/html/
COPY index.html $DOC_ROOT
COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.6.tar.gz /usr/local/src/
ADD nginx-1.15.6.tar.gz /usr/local/src
WORKDIR /usr/local/src
VOLUME /data/mysql
EXPOSE 80/tcp
RUN cd /usr/local/src && \
	tar -x nginx-1.15.6.tar.gz && \
	mv nginx-1.15.6 webserver
  • Dockerfile Test2:
FROM busybox
LABEL maintainer="chenmx <chenmx@163.com>" app="httpd"
ENV WEB_DOC_ROOT="/data/web/html/"
RUN mkdir $WEB_DOC_ROOT && \
	echo '<h1>Busybox httpd server</h1>' > ${WEB_DOC_ROOT}/index.html
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
### Dockerfile 构建命令教程及常用指令详解 #### 一、Dockerfile 基本概念 Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的一系列指令。它从基础镜像开始,通过添加文件、运行命令、设置环境变量等步骤,最终构建出一个完整的镜像[^4]。 #### 二、常见指令解析 ##### 1. `FROM` 指令 `FROM` 指令用于指定基础镜像。这是任何 Dockerfile 中的第一条指令,因为所有的操作都基于这个基础镜像之上。 ```dockerfile FROM ubuntu:latest ``` ##### 2. `RUN` 指令 `RUN` 指令用于执行命令。这些命令会在当前层的基础上创建新的层,并记录下所作的操作。 ```dockerfile RUN apt-get update && apt-get install -y curl ``` ##### 3. `COPY` 和 `ADD` 指令 这两个指令都可以用来向镜像中复制文件或目录。区别在于 `ADD` 还支持自动解压 tar 文件并可以从 URL 下载资源。 ```dockerfile COPY . /app/ # 或者 ADD file.tar.gz / ``` ##### 4. `CMD` 和 `ENTRYPOINT` 指令 两者均定义了容器启动时要执行的命令,但行为有所不同。`CMD` 提供默认参数;如果提供了其他参数,则会覆盖它们。而 `ENTRYPOINT` 则更固定一些,默认不会被替换掉。 ```dockerfile CMD ["echo", "Hello world"] ENTRYPOINT ["java", "-jar", "/app/myapp.jar"] ``` ##### 5. `EXPOSE` 指令 告知外界此服务将会监听哪个端口,但这并不意味着防火墙会被打开或者实际暴露给外部网络。 ```dockerfile EXPOSE 8080 ``` ##### 6. `ENV` 指令 设定环境变量,在后续阶段可以引用这些变量来简化配置过程。 ```dockerfile ENV APP_HOME=/usr/src/app \ PORT=3000 WORKDIR $APP_HOME ``` #### 三、构建镜像流程 完成上述指令编写之后,可以通过如下方式构建镜像: ```bash $ docker build -t my-image-name . ``` 这行命令告诉 Docker 使用当前目录下的 Dockerfile 来构建名为 `my-image-name` 的新镜像。 #### 四、最佳实践建议 为了提高效率和安全性,应该遵循某些原则,比如尽量减少层数(即减少不必要的 RUN)、利用缓存加速下载依赖项等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值