Docker镜像构建(五)
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镜像构建(五)的更多相关文章
- 4、Docker 镜像构建
Docker 镜像构建 构建分为两种 手动构建 自动构建dockerfile 手动构建 首先启动一个Centos 容器,然后在容器中安装一个nginx [root@node ~]# docker ru ...
- Docker镜像构建原理解析(不装docker也能构建镜像)
在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...
- 精简Docker镜像的五种通用方法
http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...
- Docker镜像构建的两种方式
关于Docker里面的几个主要概念 这里用个不太恰当的比方来说明. 大家肯定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统.你可以拿别人的ghost文件安装系统(使用镜像运行 ...
- Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器
我们知道,docker能实现应用打包隔离,实现快速部署和迁移.如果我们开发应用使用了spring cloud + spring boot架构,那么,通过docker-maven-plugin实现快速构 ...
- Docker镜像构建的两种方式(六)--技术流ken
镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...
- Docker镜像构建
一.简介 在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议.通常镜像的制作有两种方式: 使用现有的容器使用docker commit 生成镜像 使用Docke ...
- Docker 镜像(五)
我们都知道,操作系统分为内核和用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相当于是一个 root 文件系统.比 ...
- (转)Docker镜像构建上下文(Context)
镜像构建上下文(Context) Docker在构建镜像时,如果注意,会看到 docker build 命令最后有一个 ... 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为 ...
随机推荐
- [BUAA OO]第二次博客作业
第五次作业 这次作业是电梯系列作业的终极版,要求是使用多线程实现三部电梯的运行.这次作业的难点在于第一次运用多线程技术,对于线程中的行为并不了解,以及电梯功能的实现(如果之前作业采取的是扫描指令队列预 ...
- JAVA第一次实验 ——凯撒密码的实现
JAVA实验一 编写程序实现凯撒密码 201352330 潘俊洋 一.实验说明 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加 ...
- 20135234mqy-——信息安全系统设计基础第三周学习总结
(1)计算机将信息按位编码,通常组成字节序列.用不同的编码方式表示整数,师叔和字符串.不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定. (2)C语言的设计可以包容多种不同字长和数字 ...
- c# using的作用
using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型. (二).作为语句,用于定义一个范围,在此范围的末尾将释放对象. using指令 ...
- bata1
目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...
- 注册表:DWORD
百度百科 DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位. 在键值项窗口空白处单击右键,选择“新建”菜单项 ...
- NodeJs实现客户端登陆
nodejs的api中有一个process进程对象,process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程.作为一个对象,它对于 Node.js 应用程序 ...
- 手动解析Excel获取文件元数据
工作中有遇到需要获取上传的Excel文件的列明.最大行数.大小等元数据信息.通常做法是通过Apache的POI工具加载文件然后再读取行列进行处理.这种方法很大的弊端就是需要把excel文件加载到内存, ...
- 如何快速地编写和运行一个属于自己的 MapReduce 例子程序
大数据的时代, 到处张嘴闭嘴都是Hadoop, MapReduce, 不跟上时代怎么行? 可是对一个hadoop的新手, 写一个属于自己的MapReduce程序还是小有点难度的, 需要建立一个mave ...
- SOAP 缓存问题
今天在进行soap调用老是出错,去其他人的机器上试下,就好了,下面是从网上找到的原因 一开始不知道还有SOAP缓存.因为类文件改变了,重新生成了WSDL文件,测试运行,竟然不能通过.给我的第一感觉是W ...