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. 必应词典手机版(IOS版)与有道词典(IOS版)之问卷分析

    我们制定了一个调查问卷: 1.年龄分布: 2.地域分布: 3.是否用过必应词典? 对于必应词典还是没用过的人数更多. 4.是否用过有道词典? 有道词典的使用率更高一点. 5.对于必应的基本功能给几分? ...

  2. 将eclipse上的web项目部署到Tomcat服务器上经验总结

    1.  将Tomcat插件添加到eclipse上 Window --> Preferences --> Server --> Runtime Environment --> A ...

  3. MySQL课堂练习 20162315

    练习内容 1.参考教材相关代码,提交能连接到world的截图(有学号水印) 2.查询world数据库,获得人口超过500万的所有城市的列表. 3.查询world数据库,获得New Jersey州所有城 ...

  4. ### Error building SqlSession.

    org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may e ...

  5. Alpha版本冲刺(八)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  6. 22_IO_第22天(File、递归)_讲义

    今日内容介绍 1.File 2.递归 xmind:下载地址: 链接:https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg 密码:845a 01IO技术概述 * ...

  7. nginx配置hls

    备注:本来是想用浏览器播放hls,后来没有成功,最后使用flash播放rtmp的方案.所以下面的配置未使用. 修改/usr/local/nginx/conf/nginx.conf文件内容如下: wor ...

  8. 深入浅析JavaScript的API设计原则(转载)

    一.接口的流畅性 好的接口是流畅易懂的,他主要体现如下几个方面: 1.简单 操作某个元素的css属性,下面是原生的方法: ? 1 document.querySelectorAll('#id').st ...

  9. Error: Unable to access jarfile D:\Apache\apache-jmeter-3.0\bin\ApacheJMete.jar

    双击jmeter.bat后,在cmd窗口显示Error: Unable to access jarfile D:\Apache\apache-jmeter-3.0\bin\ApacheJMete.ja ...

  10. [51CTO]给您介绍Windows10各大版本之间区别

    给您介绍Windows10各大版本之间区别 随着win10的不断普及和推广,越来越多的朋友想安装win10系统了,但是很多朋友不知道win10哪个版本好用,为了让大家能够更好的选择win10系统版本, ...