Dockerfile常用指令

Dockerfile常用指令

1.FROM:构建镜像基于哪个镜像

语法:FROM <image>[:<tag>]
例如:FROM centos:7
解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。

2.MAINTAINER:镜像维护者姓名或邮箱地址

语法:MAINTAINER <name>
例如:MAINTAINER adam
解释:MAINTAINER指令允许你给将要制作的镜像设置作者信息

3.RUN:构建镜像时运行的shell命令

  语法: ①RUN <command>        #将会调用/bin/sh -c <command>
       ②RUN ["executable", "param1", "param2"]   #将会调用exec执行,以避免有些时候shell方式执行时的传递参数问题,而且有些基础镜像可能不包含/bin/sh
             例如:
            RUN [“yum”,”install”,”httpd”]
            RUN yum -y install httpd
  解释:RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样。

4.CMD:运行容器时执行的shell命令

  语法:①CMD ["executable", "param1", "param2"]    #将会调用exec执行,首选方式
      ②CMD ["param1", "param2"]        #当使用ENTRYPOINT指令时,为该指令传递默认参数
      ③CMD <command> [ <param1>|<param2> ]        #将会调用/bin/sh -c执行
            例如: CMD [“/bin/bash”]

  解释:CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。
  注意:RUN和CMD都是执行命令,他们的差异在于RUN中定义的命令会在执行docker build命令创建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。

5.EXPOSE:声明容器的服务端口

  语法:EXPOSE <port> [ ...]
    例如:EXPOSE 80 443
  解释:EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息。

6.ENV:设置容器环境变量

  语法:ENV <key> <value>
    例如:ENV MYSQL_ROOT_PASSWORD 123.com
  解释:ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env <key>=<value>参数来修改。
  注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。

7.ADD:拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压

  语法:ADD <src> <dest>
  解释:ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,<src>是一个文件或目录的路径,也可以是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,<dest>是目标容器的一个绝对路径,例如/home/yooke/Docker/Dockerfile这个文件中定义的,那么ADD /data.txt /db/指令将会尝试拷贝文件从/home/yooke/Docker/data.txt到将要生成的容器的/db/data.txt,且文件或目录的属组和属主分别为uid和gid为0的用户和组,如果是通过url方式获取的文件,则权限是600。
    例如:
ADD <源文件>。。。<目标目录>
ADD [“源文件”…”目标目录”]

  注意:①如果执行docker build – < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget …或RUN curl …来完成,ADD指令不支持认证。
      ②<src>路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD ../somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。
      ③如果<src>是一个url且<dest>不是以”/“结尾,则会下载文件并重命名为<dest>。
      ④如果<src>是一个url且<dest>以“/”结尾,则会下载文件到<dest>/<filename>,url必须是一个正常的路径形式,“http://example.com”像这样的url是不能正常工作的。
      ⑤如果<src>是一个本地的压缩包且<dest>是以“/”结尾的目录,则会调用“tar -x”命令解压缩,如果<dest>有同名文件则覆盖,但<src>是一个url时不会执行解压缩。

8.COPY:拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能

语法:COPY <src> <dest>
解释:用法与ADD相同,不过<src>不支持使用url,所以在使用docker build – < somefile时该指令不能使用。
ENTRYPOINT
语法:①ENTRYPOINT ["executable", "param1", "param2"]        #将会调用exec执行,首选方式
②ENTRYPOINT command param1 param2             #将会调用/bin/sh -c执行
解释:ENTRYPOINT指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run <images> -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],当通过docker run <image>启动容器时该容器会运行ls -a /etc命令,当使用docker run <image> -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。
注意:①当使用ENTRYPOINT指令时生成的镜像运行时只会执行该指令指定的命令。
②当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当做ENTRYPOINT指令的参数使用,其他情况则会被忽略。

9.VOLUME: 指定容器挂载点到宿主机自动生成的目录或其他容器

语法:VOLUME ["samepath"]
例如:VOLUME ["/var/lib/mysql"]
解释:VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。

10.USER:为RUN、CMD、和ENTRYPOINT执行命令指定运行用户

语法:USER [username|uid]
解释:USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令。

11.WORKDIR: 为RUN、CMD、ENTRYPOINT、 COPY和ADD设置工作目录,意思为切换目录

语法:WORKDIR /path/to/workdir
解释:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。

12.ONBUILD

 语法:ONBUILD [INSTRUCTION]
  解释:ONBUILD指令用来设置一些触发的指令,用于在当该镜像被作为基础镜像来创建其他镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后被执行,上述介绍的任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。
  注意:①ONBUILD中定义的指令在当前镜像的build中不会被执行。
      ②可以通过查看docker inspeat <image>命令执行结果的OnBuild键来查看某个镜像ONBUILD指令定义的内容。
      ③ONBUILD中定义的指令会当做引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的先后顺序执行,如果ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并导致整个build失败,当所有的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。
      ④ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像创建完成后将会清除所有引用的ONBUILD指令。
      ⑤ONBUILD指令不允许嵌套,例如ONBUILD ONBUILD ADD . /data是不允许的。
      ⑥ONBUILD指令不会执行其定义的FROM或MAINTAINER指令。

13.HEALTHCHECK:健康检查
14.ARG: 构建时指定的一些参数

例如:
FROM centos:7
ARG user
USER $user

设置环境变量除了ENV 外对容器还可能用以下两种方式 :

docker exec -i CONTAINER_ID /bin/bash -c "export
DOCKER_HOST=tcp://localhost:port"+

echo ‘export DOCKER_HOST=tcp://localhost:port‘ >> ~/.bashrc

注意:
1、RUN在building时运行, 可以写多条
2、CMD和ENTRYPOINT在运行container时运行, 只能写一条,如果写多条,最后一条生效
3、CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定--entrypoint覆盖。
4、如果在Dockerfile里需要往镜像内导入文件,则此文件必须在dockerfile所在目录或子目录下。

小实验

1)使用dockerifle制作一个镜像,基于centos:7镜像部署安装nginx服务。

[[email protected] ~]# mkdir web
[[email protected] ~]# rz

[[email protected] ~]# cp nginx-1.14.0.tar.gz  web/
[[email protected] ~]# cd web/
//创建测试目录
[[email protected] web]# vim Dockerfile
FROM centos:7
RUN yum -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
COPY nginx-1.14.0.tar.gz /
RUN tar -zxf nginx-1.14.0.tar.gz -C /usr/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/src/nginx-1.14.0
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
RUN make && make install
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
RUN nginx -t
RUN nginx
EXPOSE 80

//如果想要保证容器运行之后,nginx服务就直接开启,不必手动开启,我们可以在命令最后加上:nginx -g "daemon off;"

[[email protected] web]# docker build -t test-web .
//创建镜像
[[email protected] web]# docker images
//查看一下镜像

[[email protected] web]# docker run -itd --name testweb  test-web:latest
[[email protected] web]# docker exec -it testweb /bin/bash
//进入容器testweb
[[email protected] nginx-1.14.0]# nginx
//开启nginx
[[email protected] nginx-1.14.0]# exit
[[email protected] web]# docker inspect  testweb
//查看容器testweb的详细信息(现在看IP)

[[email protected] web]# curl 172.17.0.2:80
//访问一下nginx


2)将制作的镜像运行一个容器,使容器运行时自动开启nginx服务。验证服务正常运行。

[[email protected] web]# docker run -itd --name testweb_2 test-web:latest  nginx -g "daemon off;"
//开启容器时一并开启nginx
[[email protected] web]# docker inspect  testweb_2
//查看容器testweb_2的详细信息(现在看IP)

[[email protected] web]# curl 172.17.0.3:80
//访问一下nginx

3)运行一个私有仓库,将自制镜像上传到私有仓库,且开启另外一台虚拟机同样加入私有仓库,在docker02上下载私有仓库镜像并运行一个容器,验证服务正常运行。

[[email protected] web]# docker pull registry:2
//先下载一个镜像


用docker容器运行registry私有仓库

[[email protected] web]# docker run  -itd --name registry --restart=always  -p 5000:5000 -v /registry:/var/lib/registry registry:2
//运行一下registery私有仓库服务(会返回一个进程编号)
-p:端口映射。宿主机端口:容器暴露的端口。
-v:挂载目录。宿主机目录:容器内的目录。
[[email protected] web]# docker ps
//查看一下容器

[[email protected] web]# docker tag test-web1 192.168.1.11:5000/test
//镜像重命名
[[email protected] web]# docker images

[[email protected] web]# vim /usr/lib/systemd/system/docker.service
//修改docker配置文件
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000  #13行
[[email protected] web]# systemctl daemon-reload
[[email protected] web]# systemctl restart docker
//重启docker
[[email protected] web]# docker ps
//查看容器

[[email protected] web]# docker push 192.168.1.11:5000/test:latest
//上传私有仓库

[[email protected] web]# ls/registry/docker/registry/v2/repositories
//查看一下私有仓库

打开第二台docker测试一下

   39  vim /usr/lib/systemd/system/docker.service
//修改docker配置文件
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000  #13行
   40  systemctl  daemon-reload
   41  systemctl  restart docker
44  docker pull 192.168.1.11:5000/test:latest
//从私有仓库下载镜像
   53   docker run -itd --name xgp1 192.168.1.11:5000/test:latest  nginx -g "daemon off;"
     //开启容器时一并开启nginx
   54  docker  inspect xgp1
     //查看容器testweb_2的详细信息(现在看IP)

   56  curl 172.17.0.2
      //访问一下nginx

原文地址:https://blog.51cto.com/14320361/2458041

时间: 2024-08-01 02:53:34

Dockerfile常用指令的相关文章

Dockerfile常用指令详解&镜像缓存特性

Dockerfile简介 Dockerfile 是Docker中用于定义镜像自动化构建流程的配置文件.在Dockerfile中,包含了构建镜像过程中需要执行的命令和其他操作.通过Dockerfile可以更加清晰,明确的给定Docker镜像的制作过程,由于仅是简单,小体积的文件,在网络等介质中传递的速度快,能够更快的实现容器迁移和集群部署.Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 相对于提交容器修改在进行镜像迁

Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)

是时候系统学习 Dockerfile 了. 下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build context 复制到镜像.COPY 支持两种形式: COPY src dest COPY ["src", "dest"] 注意:src 只能指定 build context 中的文件或目录. ADD与 COPY 类似,从 b

docker基础——关于安装、常用指令以及镜像制作初体验

为什么使用docker docker就是一个轻量级的虚拟机,他解决的是服务迁移部署的时候环境配置问题.比如常见的web服务依赖于jdk.Tomcat.数据库等工具,迁移项目就需要在新的机器重新配置这些,不光麻烦,而且可能配错. 如果能够将整个服务连同他依赖的外部环境一同打包就好了,docker就是这么干的.他将配置好的软件打包成image,在新的机器里面启动这个image即可 当然我所理解的只是一小部分,docker还有提供弹性云服务.组建微服务架构等方面的应用 最后,相对于传统虚拟机,dock

Docker Compose 配置文件常用指令

Docker Compose 配置文件常用指令 YAML文件格式及编写注意事项 YAML是一种标记语言很直观的数据序列化格式,可读性高.类似于XML数据描述语言,语法比XML简单的很多. YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来,hash用花括号括起来. YAML文件格式注意事项: 1. 不支持制表符tab键缩进,需要使用空格缩进 2. 通常开头缩进2个空格 3. 字符后缩进1个空格, # 构建镜像上下文路径 build # 指定Dockef

Dockerfile基本指令

Dockerfile中常用命令: 语法组成: 1 注释信息 2 指令---参数 [通常要大写|实质上不区分大小写] 3 顺序执行 4 第一个非注释行必须是from [基于那个基础镜像制作] 5 需要一个专用目录[自己创建] 6 首字目必须大写---Dockerfile 7 制作镜像依赖到文件或者包组时,必须提前准备至专用目录下 .dockerignore file --每一行中定义一个忽略文件 --创建在工作目录中 例如:pam.d/su* ...........................

Docker的使用初探(一):常用指令说明

目录 Docker的使用初探(一):常用指令说明 为什么要用Docker Docker的安装与简单使用 国内镜像加速 常用指令 Docker的使用初探(一):常用指令说明 前几个星期实践的了,再不记录一下真的就忘干净了 Docker即容器技术,具体的介绍已经有很多,不打算赘述了,说一些优点 为什么要用Docker 对我个人来说,最大的优点就是在一台电脑上可以部署不同的环境而不用担心它们产生冲突,最常见的冲突就是端口占用,使用Docker技术可以很方便地规避这一问题,而且便于管理,我不用在本地处理

JSP 的内置对象及方法,动作和作用,常用指令

JSP 的内置对象及方法:JSP 共有以下9 种基本内置组件:request:用户端请求,此请求会包含来自GET/POST 请求的参数:response:网页传回用户端的回应:pageContext:网页的属性是在这里管理:session:与请求有关的会话期,可以存贮用户的状态信息:application:servlet 正在执行的内容:out:用来传送回应的输出:config:servlet 的构架部件,用于存取servlet 实例的初始化参数:page:JSP 网页本身:exception:

Angular JS从入门基础 mvc三层架构 常用指令

Angular JS从入门基础  mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等等. 1.常用指令 AngularJS 通过指令扩展了HTML,且通过表达式绑定数据到 HTML.下面我们看一下AngularJS中的常用指令. (1).基本概念 指令:AngularJS中,通过扩展HTML的属性提供功能.所以,ng-

Angular 2 模板语法与常用指令简介

一.模板语法简介 插值表达式 <div>Hello {{name}}</div> 等价于 <div [textContent]="interpolate(['Hello'], [name])"></div> 模板表达式 1.属性绑定 1.1输入属性的值为常量 <show-title title="Some Title"></show-title> 等价于 <show-title [titl