Docker定制镜像
定制镜像
除了使用定制好的镜像外,我们也可以通过定制实现符合自己环境的镜像。 在docker里面通过build方法来生成镜像,在生成镜像之前,我们需要一个Dockerfile脚本,脚本中包含的是一条一条的指令,用来的表示镜像的构建。
这里我们以原先的nginx镜像为基础,使用Dockerfile重新定制一下,
1.建立一个Dockerfile文件
2.在Dockerfile中编写
FROM nginx
RUN echo '<h1>Hello DockerFile!</h1>' > /usr/share/nginx/html/index.html
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN。
FROM 指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。 而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
RUN 执行指令
RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。
这样我们就生成了一个新的镜像。这个Dockerfile比较简单 其中涉及到两个指令FROM
和RUN
。 在定制镜像的时候,一般是以一些基础镜像为基础,在这之上进行定制。 这里的FROM nginx
就是在nginx
镜像的基础上进行的定制。 而RUN
指执行命令 类似于在shell中执行。 里我们使用了 docker build 命令进行镜像构建。其格式为: docker build [选项] <上下文路径/URL/->
需要注意的是这里的上下文路径 不是生成镜像存放的位置,而是在生成镜像发送给docker引擎的路径。
构建镜像
Dockerfile文件完成之后,通过Docker build
命令进行构建镜像。
wangxian@wangxian:~/wangxian/Docker_test/code1$ docker build -t my_nginx:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> cd5239a0906a
Step 2/2 : RUN echo '<h1>Welcome to Docker!!<h1>' > /usr/share/nginx/html/index.html
---> Running in 4d51e06eccd5
Removing intermediate container 4d51e06eccd5
---> 9c8135c4b40e
Successfully built 9c8135c4b40e
Successfully tagged my_nginx:v1
wangxian@wangxian:~/wangxian/Docker_test/code1$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_nginx v1 9c8135c4b40e 5 seconds ago 109MB
ubuntu latest 113a43faa138 2 weeks ago 81.2MB
nginx latest cd5239a0906a 2 weeks ago 109MB
在这里我们指定了最终镜像的名称 -t my_nginx:v1,构建成功后,我们可以像之前运行nginx那样来运行这个镜像.
wangxian@wangxian:~/wangxian/Docker_test/code1$ docker run -d -p 80:80 my_nginx:v1
f30c9abd13de09e783f8b7db11833f31180becdb1bc5abc2243dd28f178e8592
上下文环境
Dockerfile常用指令
在定制镜像时,除了上面所讲到的FROM和RUN之外,还有一些其他的常用的指令。
COPY 复制文件 COPY 指令将从构建上下文目录中<源路径>的文件复制到新的一层的镜像内的<目标路径>位置。
FROM nginx
RUN mkdir app
COPY ./index.html ./app
FROM ubuntu:16.04
COPY ./code.txt /home/
2.CMD容器启动命令 cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。
CMD 指令的格式有两种
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
第一种
FROM ubuntu
CMD echo 'Hello CMD!!'
wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run e8c9913f85b4
Hello CMD!
运行之后,会执行语句。但是不支持添加参数
第二种
FROM ubuntu
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]
wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v1
Hello CMD!!
wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v1 echo hhhh
hhhh
从结果可以发现 使用第二种方式 支持在运行容器是 添加参数 但是会覆盖掉CMD本身的命令。
3.ENTRYPOINT 入口命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。不同的是当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为
ENTRYPOINT CMD
.
FROM ubuntu
CMD ["Hello CMD!!"]
ENTRYPOINT ["echo"]
wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v2
Hello CMD!!
wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v2 aaaa
aaaa
Docker定制镜像的更多相关文章
- Docker - 定制镜像
Dockerfile Docker Hub拥有大量高质的官方镜像:可直接使用的服务类镜像.语言应用镜像.基础操作系统镜像等,满足绝大部分需求. 此外,可以通过定制镜像的方式来满足实际使用中的特定需求. ...
- 微服务架构 ------ Dockerfile定制镜像
Docker容器不仅仅是运行原生的容器,而是把我们的具体的项目能够布置到容器上面去,这就是Docker定制镜像需要做的事情. Docker容器 = new Docker镜像 镜像相当于类,容器相当 ...
- Docker入门之--定制镜像
1. 首先定制一个Web 服务器为例 1.1 启动镜像 执行下面命令 docker run --name webserver -d -p 80:80 nginx 1.2 查看容器和镜像状态 然后执行下 ...
- docker自定制镜像
概述 很多情况下我们需要自定制镜像,如果自定制过程中需要下载配置很多包,而且这些包之间还有依赖关系,那么如果我们手动去操作的话就会很麻烦,正确的做法是把操作的命令封装到一个文件里,然后直接执行这个文件 ...
- docker之常用命令、自定制镜像、公(私)仓库的上传和下载
一.docker命令 1.参数和命令汇总 1. 参数 Options: --config=~/.docker Location of client config files #客户端配置文件的位置 - ...
- Docker学习笔记三 Dockerfile 指令 定制镜像
本文地址:https://www.cnblogs.com/veinyin/p/10412079.html 镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...
- Docker Dockerfile 定制镜像(转)
转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...
- 【Docker自定制镜像之Dockerfile】
镜像的定制,就是定制每一层所添加的配置.文件,如果可以把每一层修改.安装.构建.操作的命令都写入到一个脚本中,用脚本来构建.定制镜像,这个脚本就是Dockerfile Dockerfile是一个文本文 ...
- Docker 学习笔记(二):Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...
随机推荐
- 【转载】7条便利的ViewState技巧
32.Seven handy ViewState tips 32.7条便利的ViewState技巧 Every time I have to deal with a classic ASP.NET W ...
- bzoj 1867: [Noi1999]钉子和小球【dp】
设f[i][j]为掉到f[i][j]时的概率然后分情况随便转移一下就好 主要是要手写分数比较麻烦 #include<iostream> #include<cstdio> usi ...
- bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害【最小割】
枚举建图.jpg 一开始建的图挂了,于是枚举了几种建图方式-- 因为要删点,所以拆点,连接(i,i',1),对于原来图上的边(u,v),连接(u',v,inf),(v',u,inf),然后连接(s,i ...
- P1606 [USACO07FEB]荷叶塘Lilypad Pond(最短路计数)
P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...
- [Swift]关键字:Self、self与super
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 【题解】自行车比赛 [AHOI2016] [P2777]
[题解]自行车比赛 \([AHOI2016]\) \([P2777]\) 逼自己每天一道模拟题 传送门:自行车比赛 \([AHOI2016]\) \([P2777]\) [题目描述] 比赛中一共有 \ ...
- vux修改css样式的2种办法
最近手上有个移动端的项目.前端UI框架是选择的VUX.但是在使用的时候经常会发现框架自带的组件样式和我们要求的不一致.经常需要手动覆盖样式.这里记录下我们使用的2种方法. 我们以XHeader组件 ...
- Apache Kafka官方文档翻译(原创)
Apache Kafka是一个分布式流平台.准确的说是什么意思呢?我们认为流平台具有三种关键能力: 1.让你对数据流进行发布订阅.因此他很像一个消息队列和企业级消息系统. 2.让你以高容错的方式存储数 ...
- 什么是2MSL以及TIME_WAIT的作用
TIME_WAIT主要是用来解决以下几个问题: 1)上面解释为什么主动关闭方需要进入TIME_WAIT状态中提到的: 主动关闭方需要进入TIME_WAIT以便能够重发丢掉的被动关闭方FIN包的ACK. ...
- Spring.Net学习笔记(4)-属性及构造器注入
一.开发环境 操作系统:Win10 编译器:VS2013 .Net版本:.net framework4.5 二.涉及程序集 Spring.Core.dll:1.3.1 Common.Logging.d ...