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"]