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 就在当前目录,因此不少初学者以为 ...
随机推荐
- 必应词典手机版(IOS版)与有道词典(IOS版)之问卷分析
我们制定了一个调查问卷: 1.年龄分布: 2.地域分布: 3.是否用过必应词典? 对于必应词典还是没用过的人数更多. 4.是否用过有道词典? 有道词典的使用率更高一点. 5.对于必应的基本功能给几分? ...
- 将eclipse上的web项目部署到Tomcat服务器上经验总结
1. 将Tomcat插件添加到eclipse上 Window --> Preferences --> Server --> Runtime Environment --> A ...
- MySQL课堂练习 20162315
练习内容 1.参考教材相关代码,提交能连接到world的截图(有学号水印) 2.查询world数据库,获得人口超过500万的所有城市的列表. 3.查询world数据库,获得New Jersey州所有城 ...
- ### Error building SqlSession.
org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may e ...
- Alpha版本冲刺(八)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- 22_IO_第22天(File、递归)_讲义
今日内容介绍 1.File 2.递归 xmind:下载地址: 链接:https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg 密码:845a 01IO技术概述 * ...
- nginx配置hls
备注:本来是想用浏览器播放hls,后来没有成功,最后使用flash播放rtmp的方案.所以下面的配置未使用. 修改/usr/local/nginx/conf/nginx.conf文件内容如下: wor ...
- 深入浅析JavaScript的API设计原则(转载)
一.接口的流畅性 好的接口是流畅易懂的,他主要体现如下几个方面: 1.简单 操作某个元素的css属性,下面是原生的方法: ? 1 document.querySelectorAll('#id').st ...
- 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 ...
- [51CTO]给您介绍Windows10各大版本之间区别
给您介绍Windows10各大版本之间区别 随着win10的不断普及和推广,越来越多的朋友想安装win10系统了,但是很多朋友不知道win10哪个版本好用,为了让大家能够更好的选择win10系统版本, ...