Dockerfile小记

什么是dockerfile?

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。简单来说Dockerfile是由一行行指令语句构成的一个创建docker镜像的配置文件。

docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

举个🌰:

 docker build -f /tmp/Dockerfile

Dockerfile组成:

基础镜像(必须的)、运行指令、容器默认执行命令。

 

Dockerfile文件说明:

Docker以从上到下的顺序运行Dockerfile的指令。所以第一条指令必须是FROM来指定基本镜像。

Docker文件中使用FROM,RUN,ENV,CMD,EXPOSE等指令。

 

1.FROM  [必须]

FROM 指定基础镜像,目的是为了给构建镜像提供一个基础环境。

格式:

  FROM <image>
  FROM <image>:<tag>
 
示例:
  FROM nginx

2、MAINTAINER             指定维护者信息

格式:
    MAINTAINER <name>
示例:
  MAINTAINER  liusu   xxxxxx

 

3、RUN

基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像。RUN指令后面执行的命令必须是镜像中已经存在了的命令。

格式:
    RUN <command>

 

4、CMD    构建容器后调用,也就是在容器启动时才进行调用

格式:
    CMD ["executable","param1","param2"]      (执行可执行文件,优先)
    CMD ["param1","param2"]                   (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2                 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注意:
  CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

 

5、ADD和COPY

ADD : 将本地文件添加到镜像
ADD支持自动解压,但是仅仅支持解压tar包
ADD支持远程下载,但是不会解压下载内容

格式:
    ADD /tmp/epel.repo   /etc/yum.repos.d 
    ADD curl -o xxxxxxxxxxx    远程下载

COPY : 将文件复制到镜像

 

6、ENV      设置一个容器的环境变量

格式:
    ENV <key> <value>      #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
    ENV myName John Doe
  

7、EXPOSE          

指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-P, 可以指定多个端口

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080

注意:
  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

 

8、ARG

指定运行时参数,用于构建docker镜像时传入参数 --build-arg=USER=root

格式:

    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www

9、VOLUME

设置需要挂载的目录,没有实现挂载。

 

10、WORKDIR       设置工作目录

1、程序运行的开始目录
2、进入容器的最初目录
  格式:

    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
 

11、ONBUILD

ONBUILD 后面跟的是Dockerfile指令不是linux命令

构建触发器 : 当当前镜像用作基础镜像时触发

格式:
  ONBUILD [INSTRUCTION] 示例:   ONBUILD ADD . /app/src    注意:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
 

 二:案例

[root@Centos7 nginx]# docker network create lnmp
c7ad0d637a1455ebd5ea9d08e23f5d13971a0172a910ddc8bd4649a68ee27fc4

 

# 创建nginx
[root@Centos7 nginx]# vim Dockerfile
FROM nginx
RUN useradd www
ADD default.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx
EXPOSE 80
WORKDIR /root
CMD nginx -g "daemon off;"

## 修改nginx.conf
user www;

## 修改default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}


# 创建PHP
[root@Centos7 php]# vim Dockerfile
FROM centos:7
RUN yum install php php-devel php-fpm -y
RUN useradd www
ADD www.conf /etc/php-fpm.d/
EXPOSE 9000
CMD ["php-fpm"]

## 修改www.conf
listen = 9000
;listen.allowed_clients = 127.0.0.1
user = www
group = www
request_terminate_timeout = 0

# 创建mysql
docker rm -f mysql && docker run -d --name mysql--network=lnmp -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

注意:

dockerfile执行是按照从上到下

如果构建的上一个镜像执行过此步骤,下一个则可以使用缓存(Using cache)

1、从互联网下载内容不会使用缓存
2、添加文件的内容(ADD、COPY)不使用缓存

如果上一步修改过,则下面的dockerfile步骤全部不使用缓存。

 

posted @ 2021-04-30 15:32  芒果~~  阅读(63)  评论(0编辑  收藏  举报