Docker 镜像介绍

Docker镜像构建分为两种,一种是手动构建,另一种是Dockerfile(自动构建)

手动构建docker镜像

案例:我们基于centos镜像进行构建,制作自己的nginx镜像

docker run --name mynginx -it centos
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y

我们需要修改nginx配置文件,让他运行在前台

vi /etc/nginx/nginx.conf
daemon off;

修改完之后我们退出,将mynginx本地提交

[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a8128fa6245 centos "/bin/bash" 9 minutes ago Exited (0) 2 minutes ago mynginx
[root@linux-node1 ~]# docker commit -m "My Nginx" 2a8128fa6245 shhnwangjian/mynginx:v1
sha256:a8be358735525b50f49ca0bfe2b264427875333dcb1c02495b49dce4d1b10705
[root@linux-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shhnwangjian/mynginx v1 a8be35873552 39 seconds ago 335.2 MB
nginx latest 01f818af747d 3 weeks ago 181.6 MB
centos latest 67591570dd29 4 weeks ago 191.8 MB

上面commit命令一行注释

  • -m 描述
  • 容器ID
  • 第一个shhnwangjian是仓库的名称
  • 第二个mynginx是镜像的名称
  • v1 标签,如果是最后一个版本我们可以打latest

我们现在启动制作好的nginx镜像

[root@linux-node1 ~]# docker run --name mynginxv1 -d -p 88:80 shhnwangjian/mynginx:v1 nginx
21bb74c3979c26697b7f03a79c3ddb49363791d03160e07fd04617d7e8c00436

提示:最后面的nginx不是镜像的nginx,而是服务的名称

[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21bb74c3979c shhnwangjian/mynginx:v1 "nginx" 35 seconds ago Up 33 seconds 0.0.0.0:88->80/tcp mynginxv1

Dockerfile

Dockerfile是由一行命令和语句组成的。

案例:我们基于centos镜像进行自动构建(dockerfile)

规划存放dockerfile文件的目录结构

[root@linux-node1 ~]# cd /root
[root@linux-node1 nginx]# mkdir -p dockerfile/nginx
[root@linux-node1 nginx]# pwd
/root/dockerfile/nginx

创建文件需注意:D需要大写,当我们构建dockerfile的时候,docker默认会在我们当前目录读取一个名为Dockerfile的文件。这时候的D必须大写。

[root@linux-node1 nginx]# vim Dockerfile
# This Dockerfile # Base image
FROM centos # Maintainer
MAINTAINER shhnwangjian xxx@163.com # Commands
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]

说明:

  • #井号代表注释
  • #Base image 除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么
  • #Maintainer 维护信息
  • #Commands 命令
  • #ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改
  • EXPOSE 对外端口号
  • CMD ["nginx"] 它要启动的命令是nginx (就算是nginx服务)

我们写好Dockerfile还需要一个index.html

echo shhnwangjian > index.html

开始构建

docker build -t mynginx:v2 .

提示:.代表构建的位置,我们是当前目录。

构建完成

启动容器

[root@linux-node1 nginx]# docker run --name mynginxv2 -d -p 89:80 mynginx:v2
0c4f1703d96c63587825e62225ffc67a172b1233b958a320d881e5560383846d

Dockerfile参数简介:

  • FROM (指定基础镜像)
  • MAINTAINER (指定维护者信息)
  • RUN (在命令前面加上RUN)
  • ADD (COPY文件,会自动解压)
  • WORKDIR (设置当前工作目录,类似于cd)
  • VOLUME (设置卷,挂载主机目录)
  • EXPOSE (指定对外的端口)
  • CMD (指定容器启动后要干的事情)

Dockerfile参数解释

FROM

格式:FROM<image>或FROM<image>:<tag>。

解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。

MAINTAINER

格式:MAINTAINER <name>

解释:指定维护者信息。

RUN

格式:RUN <command>或 RUN["executable", "param1", "param2"]。

解释:运行命令,命令较长使可以使用\来换行。推荐使用上面数组的格式。

CMD

格式:
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;

解释:CMD指定容器启动时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

ENTRYPOINT

格式:
ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2(shell中执行)。

解释:和CMD类似都是配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
  每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。

    所以生产实践中我们可以同时使用ENTRYPOINT和CMD。

例:

ENTRYPOINT ["/usr/bin/rethinkdb"]
CMD ["--help"]

USER

格式:USER daemon

解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户。

EXPOSE

格式:EXPOSE<port> [<port>...]

解释:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。

ENV

格式:ENV<key> <value>
ENV <key>=<value> ...

解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。

ADD

格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]

解释:将指定的<src>复制到容器文件系统中的<dest>

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

如果文件是可识别的压缩格式,则docker会帮忙解压缩

VOLUME

格式:VOLUME ["/data"]

解释:可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR

格式:WORKDIR/path/to/workdir

解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。

可以多次切换(相当于cd命令), 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

例:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。

ONBUILD 

解释:指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

ARG

格式:ARG<name>[=<default value>]

解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。

Docker镜像构建(五)的更多相关文章

  1. 4、Docker 镜像构建

    Docker 镜像构建 构建分为两种 手动构建 自动构建dockerfile 手动构建 首先启动一个Centos 容器,然后在容器中安装一个nginx [root@node ~]# docker ru ...

  2. Docker镜像构建原理解析(不装docker也能构建镜像)

    在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...

  3. 精简Docker镜像的五种通用方法

    http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...

  4. Docker镜像构建的两种方式

    关于Docker里面的几个主要概念 这里用个不太恰当的比方来说明. 大家肯定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统.你可以拿别人的ghost文件安装系统(使用镜像运行 ...

  5. Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器

    我们知道,docker能实现应用打包隔离,实现快速部署和迁移.如果我们开发应用使用了spring cloud + spring boot架构,那么,通过docker-maven-plugin实现快速构 ...

  6. Docker镜像构建的两种方式(六)--技术流ken

    镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...

  7. Docker镜像构建

    一.简介 在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议.通常镜像的制作有两种方式: 使用现有的容器使用docker commit 生成镜像 使用Docke ...

  8. Docker 镜像(五)

    我们都知道,操作系统分为内核和用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相当于是一个 root 文件系统.比 ...

  9. (转)Docker镜像构建上下文(Context)

    镜像构建上下文(Context) Docker在构建镜像时,如果注意,会看到 docker build 命令最后有一个 ... 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为 ...

随机推荐

  1. 欢迎来怼--第三十七次Scrum会议

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/12/3 17:50~18:23,总计33min. 地点 ...

  2. BugPhobia开发篇章:Scurm Meeting-更新至0x03

    0x01 :目录与摘要 If you weeped for the missing sunset, you would miss all the shining stars 索引 提纲 整理与更新记录 ...

  3. 20135316王剑桥 linux第六周课实验笔记

    6.存储器层次结构 6.1存储技术 1.如果你的程序需要的数据是存储在CPU寄存器中的,那么在执行期间,在零个周期内就能访问到它们.如果存储在高速缓冲中,需要1-10个周期.如果存储在主存中,需要50 ...

  4. java怎样把后台值传到前台

    后台代码:if(this.Request["type"]!=null){aaa=this.Request["type"].ToString(); try{bbb ...

  5. java List.get

    并不能 用如果List在i位置值不存在 并不能 List.get(i) !=null 判断 会抛异常 版权声明:本文为博主原创文章,未经博主允许不得转载.

  6. 【CSAPP笔记】4. 汇编语言——基础知识

    程序的机器级表示 计算机能读懂是机器代码(machine code)-- 用字节序列编码的低级操作 -- 也就是0和1.编译器基于编程语言的规则.目标机器的指令集和操作系统的规则,经过一系列阶段产生机 ...

  7. 第三周作业(三)WordCount

    这个程序主要就是统计一下文件中的字符数,单词数以及行数. 我的程序很简单,代码很简短,只实现了书中的基本功能. #include <stdio.h> #include <string ...

  8. pxe前期接入H3C交换机网络准备

    环境:一个装机vlan3010,一个业务vlan,将接入交换机的下联,上联设置好vlan 如果服务器一直出于dhcp状态,有可能是交换机到服务器的光纤线路有问题,建议在交换机查看端口是否是down的. ...

  9. Delphi函数的out、var等关键字的作用,和使用场景

    问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解 ...

  10. 红帽旗下Linux的版本说明RedHat、CentOS、Fedora、OEL等

    简单总结一下RedHat.CentOS.Fedora Core区别关系: RedHat: 红帽已经被IBM 340亿刀收购了,但是红帽依旧发型自己的RedHat enterprise linux 版本 ...