Docker-day4-Dockerfile 构建镜像指令+编写案例

Dockerfile 构建镜像指令与编写案例

  • Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。

  • Docker 以从上到下的顺序运行 Dockerfile 的指令

    • 为了指定基本映像,第一条指令必须是 FROM。

    • 一个声 明以#字符开头则被视为注释。

    • 可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令(必须大写)。

    • 指令后面跟shell、mysql等命令及语句即可

  • 由三个部分组成

    • 基础镜像信息(必须)
    • 维护者信息
    • 镜像操作指令
    • 容器启动时执行指令

在这里插入图片描述

一、Dockerfile指令

1.FROM

  • 指定基础镜像,目的是为了给构建镜像提供一个基础环境
格式:
FROM centos:7

2.MAINTAINER

  • 指定维护者信息
格式:
MAINTAINER Peng

3.RUN

  • 基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像
  • RUN指令后面执行的命令必须是镜像中已经存在了的命令。
  • 反斜线 \ 还可用于续行、转义空格等特殊字符
格式:
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666 -s /sbin/nologin -M
RUN mkdir /code/wordpress/ -p
RUN rm -rf /etc/nginx/conf.d/default.conf

4.ADD

  • 将本地文件添加到容器中,相当于cp命令,又强与cp命令

  • tar 类型文件会自动解压到目标路径(仅支持解压 tar 包)

  • 支持远程下载,但是不会解压下载内容

格式:
ADD nginx.conf /etc/nginx/
ADD /root/www.conf /etc/php-fpm.d/
ADD wordpress.tar.gz /code/
ADD /root/check* /test/

5.COPY

  • 复制文件到镜像中,建议直接用ADD

  • 功能类似 ADD,但不会自动解压文件,也不能访问网络资源

格式:
COPY nginx.conf /etc/nginx/
COPY /etc/passwd /etc/
COPY /root/check* /test/

6.LABEL

  • 用于为镜像添加元数据,不常用
  • 一个LABEL指定一层,尽量合并为一个指令,同名覆盖
格式:
LABEL <key>=<value> <key>=<value> <key>=<value>
LABEL version="1.0"

7.ENV

  • 设置环境变量
  • key 之后的所有内容均会被视为 value 的组成部分,因此一次只能设置一个变量
  • 如果 中包含空格,可以使用 \ 来进行转义,也可以通过""来进行标示
  • 反斜线 \ 还可用于续行
格式:
ENV <key> <value>
ENV name john
ENV name John Alex		# 变量值则为John Alex
ENV name "john Alex"	# 变量值则为John Alex
ENV name john \Alex		# 变量值则为John Alex
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

8.CMD

  • 指定容器运行的默认命令
格式:
CMD nginx -g "daemon off;"
CMD ["nginx","-g","daemon off;"]

9.EXPOSE

  • 指定与外界交互的端口
  • EXPOSE 并不会让容器的端口访问到主机
  • 指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-p, 可以指定多个端口
格式:
EXPOSE <port> <port> ...
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp

10.VOLUME

  • 用于指定持久化目录
  • 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能
    • 卷可以容器间共享和重用
    • 容器并不一定要和其它容器共享卷
    • 修改卷后会立即生效
    • 对卷的修改不会对镜像产生影响
    • 卷会一直存在,直到没有任何容器在使用它
格式:
VOLUME ["/path/to/dir"]
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

11.WORKDIR

  • 进入容器的最初目录/程序运行的开始目录工作,类似于 cd 命令回车后的主路径

  • 通过 WORKDIR 设置工作目录后,Dockerfile 中的其他命令都会在该目录下执行

  • 在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

格式:
WORKDIR /path/to/workdir
WORKDIR /a		# 这时工作目录为/a
WORKDIR /a/b 	# 这时工作目录为/a/b

12.ARG

  • 用于制定传递给构建运行时的变量
格式:
ARG <name>[=<default value>]
ARG site
ARG build_user=www

13.ONBUILD

  • 用于设置镜像触发器
  • 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
  • ONBUILD 后面跟的是Dockerfile指令不是linux命令
格式: ONBUILD [INSTRUCTION]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

二、Dockerfile 编写案例

  • Dockerfile 指令是按照从上到下执行的
  • 如果构建的上一个镜像执行过此步骤,下一个则可以使用缓存(Using cache)
    • 从互联网下载内容不会使用缓存
    • 添加文件的内容(ADD、COPY)
    • 如果上一步修改过,则下面的dockerfile步骤全部不使用缓存。

1.Nginx

[root@docker1 code] cat nginx/Dockerfile 
FROM nginx
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666 -s /sbin/nologin -M
ADD linux.wp.com.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx/
RUN mkdir /code/wordpress/ -p
RUN rm -rf /etc/nginx/conf.d/default.conf
EXPOSE 80
WORKDIR /root
CMD ["nginx","-g","daemon off;"]

2.MySQL

[root@docker1 code]# cat mysql/Dockerfile 
FROM mysql:5.7
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ADD setup.sh /mysql/setup.sh
ADD schema.sql /mysql/schema.sql
ADD privileges.sql /mysql/privileges.sql
CMD ["sh", "/mysql/setup.sh"]

3.PHP

[root@docker1 code]# cat php/Dockerfile 
FROM centos:7
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN yum -y install wget \
 && wget https://www.php.net/distributions/php-7.4.16.tar.gz
RUN yum -y install gcc \
gcc-c++ \
make \
libxml2-devel \
openssl-devel \
curl-devel \
libjpeg-devel \
libpng-devel \
libicu-devel \
sqlite-devel \
freetype-devel \
openldap-devel \
openldap \
openldap-devel

RUN tar -zxvf php-7.4.16.tar.gz
WORKDIR /php-7.4.16
RUN ./configure --prefix=/usr/local/php \
       --with-config-file-scan-dir=/usr/local/php/etc/ \
       --with-mhash --with-pdo-mysql \
       --with-openssl --with-mysqli \
       --with-iconv --with-zlib \
       --enable-inline-optimization \
       --disable-debug --disable-rpath \
       --enable-shared --enable-xml \
       --enable-bcmath --enable-shmop \
       --enable-sysvsem --enable-sysvshm --enable-mbregex \
       --enable-ftp \
       --enable-pcntl --enable-sockets \
       --with-xmlrpc --enable-soap \
       --without-pear --with-gettext \
       --enable-session --with-curl \
       --enable-opcache --enable-fpm \
       --without-gdbm --enable-fast-install \
       --disable-fileinfo
RUN make && make install
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666 -s /sbin/nologin -M
ADD www.conf /usr/local/php/etc/php-fpm.d/
ADD php.ini /usr/local/php/etc/
ADD php-fpm.conf /usr/local/php/etc/
EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm","-F"]
posted @ 2022-06-09 18:18  秋风お亦冷  阅读(77)  评论(0编辑  收藏  举报