docker学习构建镜像---第三章节
一.docker镜像使用
运行docker容器时,使用的镜像如果在本地不存在,docker会自动从docker镜像仓库中下载,默认是从docker hub公共镜像源下载
在这里,我们需要了解:管理和使用本地的docker镜像,创建镜像
列出本地镜像列表:docker images
[root@k8s-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.13.1 fdb321fd30a0 6 days ago 80.2MB
k8s.gcr.io/kube-apiserver v1.13.1 40a63db91ef8 6 days ago 181MB
k8s.gcr.io/kube-controller-manager v1.13.1 26e6f1db2a52 6 days ago 146MB
k8s.gcr.io/kube-scheduler v1.13.1 ab81d7360408 6 days ago 79.6MB
k8s.gcr.io/coredns 1.2.6 f59dcacceff4 6 weeks ago 40MB
quay.io/external_storage/cephfs-provisioner latest 8d09a3e96942 2 months ago 401MB
k8s.gcr.io/etcd 3.2.24 3cab8e1b9802 3 months ago 220MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 11 months ago 44.6MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 12 months ago 742kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
training/webapp latest 6fae60ef3446 3 years ago 349MB
参数说明:
- REPOSITORY:表示镜像的仓库员
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像的创建时间
- SIZE:镜像大小
同一个仓库源可以有多个TAG,表示这个仓库源的多个不同版本。我们使用REPOSITORY:TAG来定义不同的镜像
我们在使用docker镜像的时候,如果不指定一个镜像的版本标签,docker默认使用laster镜像
二.创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行修改:
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用dockerfile指令来创建一个新的镜像
2.1 更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器
[root@k8s-01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb2ea5793288 training/webapp "python app.py" About an hour ago Up About an hour 0.0.0.0:32768->5000/tcp laughing_engelbart
[root@k8s-01 ~]# docker exec -it cb2ea5793288 /bin/bash
root@cb2ea5793288:/opt/webapp# touch yushengyin.txt
root@cb2ea5793288:/opt/webapp# cat yushengyin.txt
TEST CHUANGJIAN JINGXIANG
我们进入容器中创建了一个yushengyin.txt的文件,并写入了一行文本,下面我们通过docker commit来提交容器副本
[root@k8s-01 ~]# docker commit -m "add yushengyin.txt" -a "yuhaohao" cb2ea5793288 modify/webapp:v2
sha256:64647147dc09efb200997c2544ecaf22581fb392536512075d3e8ef36937740b
提交修改的参数说明:
- -m:提交的描述信息
- -a:指定提交的镜像作者
- cb2ea5793288:容器的ID
- modify/webapp:v2:指定要创建的目标镜像名和TAG
下面我们通过docker images查看我们更新的镜像modify/webapp:v2
[root@k8s-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
modify/webapp v2 64647147dc09 5 seconds ago 349MB
training/webapp latest 6fae60ef3446 3 years ago 349MB
使用新更新的镜像启动一个容器:
[root@k8s-01 ~]# docker run -i -t modify/webapp:v2 /bin/bash
root@16d6341b43c5:/opt/webapp# ls
Procfile app.py requirements.txt tests.py yushengyin.txt
可以看出新更新的镜像包含我们修改的内容
2.2 Dockerfile介绍
我们使用docker build,从零开始来构建一个新的镜像。构建镜像之前,我们需要创建一个Dockfile文件,需要包含一组指令来告诉docker如何构建我们的镜像:
docker有10几条命令可用于构建镜像,下面简要介绍这些命令
ADD:ADD命令有两个参数,源和目标,它的基本作用是从源系统的文件系统上复制文件到目前容器的文件系统。如果源是一个URL,那么该URL的内容将被下载并复制到容器中。
如:
Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
CMD:和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的时候执行的,而是在用镜像构建容器后被调用
如:
Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
ENTRYPOINT:配置容器启动后执行的命令,并且不可以被docker run提供的参数覆盖,每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除"application"而仅仅保留参数。参数将传递给ENTRYPOINT命令。
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo
ENV:ENV命令用于设置环境变量,这些变量以"key=value"的形式存在,并可以在容器内被脚本或者程序调用。这个机制在给容器中运行应用带来了极大的方便。
# Usage: ENV key value
ENV SERVER_WORKS 4
EXPOSE:EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互
# Usage: EXPOSE [port]
EXPOSE 8080
FROM:FROM命令可能是最重要的Dockerfile命令,该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像,如果基础镜像没有被发现,docker将试图从docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令
#Usage: FROM [image name]
FROM ubuntu
MAINTAINER:我建议这个命令放在dockerfile的起始部分,虽然理论上它可以放置于dockerfile的任意位置。这个命令用于生命作者,并应该放在RROM的后面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN:RUN命令是dockerfile执行命令的核心部分,它接受命令作为参数 并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成的层)
# Usage: RUN [command]
RUN aptitude install -y riak
USER:USER命令用于设置运行容器的UID
# Usage: USER [UID]
USER 751
VOLUME:VOLUME命令用于让你的容器访问宿主机上的目录
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
WORKDIR:WORKDIR命令用于设置CMD指明的命令的运行目录
# Usage: WORKDIR /path
WORKDIR ~/
2.3 构建镜像
[root@k8s-01 ~]# cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
这里每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
- 第一条FROM,指定使用哪个镜像源
- RUN指令告诉docker在镜像内指定命令,安装了什么
- 然后我们使用Dockerfile文件,通过docker build命令来构建一个镜像
执行镜像的构建:
[root@k8s-01 docker]# docker build -t yushengyin/centos:6.7 .
Sending build context to Docker daemon 2.048kB
Step 1/9 : FROM centos:6.7
6.7: Pulling from library/centos
cbddbc0189a0: Pull complete
Digest: sha256:da0f2d8fb80e6f82ec8b89c2723cfd6c910196ac3894b681f5b001af7d9cf82d
Status: Downloaded newer image for centos:6.7
---> 192ad0341c8b
Step 2/9 : MAINTAINER yushengyin "yushengyin@163.com"
---> Running in b1986e6eb7e1
Removing intermediate container b1986e6eb7e1
---> 280571722c0a
Step 3/9 : RUN /bin/echo 'root:123456' |chpasswd
---> Running in 2a9e4ed352de
Removing intermediate container 2a9e4ed352de
---> 77256a924e7a
Step 4/9 : RUN useradd runoob
---> Running in e1312eb6a6a3
Removing intermediate container e1312eb6a6a3
---> 8e551279ca45
Step 5/9 : RUN /bin/echo 'runoob:123456' |chpasswd
---> Running in 4bfbfee565f6
Removing intermediate container 4bfbfee565f6
---> 3988c5ef7688
Step 6/9 : RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
---> Running in ca280bc04666
Removing intermediate container ca280bc04666
---> 448d1cf226c2
Step 7/9 : EXPOSE 22
---> Running in 714f2bd21f68
Removing intermediate container 714f2bd21f68
---> 8ae1b8ebab8a
Step 8/9 : EXPOSE 80
---> Running in dd99b9df58d0
Removing intermediate container dd99b9df58d0
---> 63f66a55adea
Step 9/9 : CMD /usr/sbin/sshd -D
---> Running in 62c5810140bd
Removing intermediate container 62c5810140bd
---> 4f2531db0da1
Successfully built 4f2531db0da1
Successfully tagged yushengyin/centos:6.7
查看镜像:
[root@k8s-01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yushengyin/centos 6.7 4f2531db0da1 15 seconds ago 191MB
使用新镜像启动一个容器:
[root@k8s-01 docker]# docker run -t -i yushengyin/centos:6.7 /bin/bash
[root@4d65228dd85a ~]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)
上面的镜像包含我们创建的用户runoob
设置标签:
我们可以用docker tag命令,给镜像添加一个新的标签
[root@k8s-01 docker]# docker tag 4f2531db0da1 yushengyin/centos:dev
[root@k8s-01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yushengyin/centos 6.7 4f2531db0da1 2 minutes ago 191MB
yushengyin/centos dev 4f2531db0da1 2 minutes ago 191MB
参考链接:http://www.runoob.com/docker/docker-image-usage.html
docker学习构建镜像---第三章节的更多相关文章
- docker入门——构建镜像
前面我们已经介绍了如何拉取已经构建好的带有定制内容的Docker镜像,那么如何构建自己的镜像呢? 构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker buil ...
- docker之构建镜像
构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker build命令和 Dockerfile 文件. 在这里并不推荐使用docker commit来构建镜像,而 ...
- IDEA使用Docker插件构建镜像
IDEA使用Docker插件构建镜像 记一次坑 第一次插件docker-maven-plugin的 配置文件中没写远程主机的地址 <dockerHost>http://192.168.1 ...
- Docker 学习之镜像导入导出及推送阿里云服务器(三)
在前面两节里主要就是记录一些docker的基本的操作,包括搜索镜像,拉取镜像,根据镜像创建容器等等,在这一节主要就是记录Docker对于镜像文件的导入导出,及推送到阿里云再从阿里云获取镜像. 一.镜像 ...
- Docker系列教程04-Docker构建镜像的三种方式
简介 创建镜像的方法主要有三种:基于已有镜像的容器创建.基于本地模板导入.基于Dockerfile创建. 今天就逐一讲述为大家讲述,如何构建属于自己的docker镜像. 1.基于容器构建镜像 基于已有 ...
- 4.docker学习之镜像
镜像 我们知道,我们想在Windows操作系统上跑Linux,需要安装一个虚拟机程序,然后下载一个Linux镜像,在该虚拟机程序中创建一个虚拟机,并使用该镜像安装对应的Linux操作系统,安装好之后, ...
- Docker学习以及镜像制作流程
一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- docker学习常用指令---第五章节
前面我们了解了docker的基本概念,和docker镜像,端口相关的内容.在具体的实际操作过程中,我们需要了解一些相关的docker操作指令. 一.Docker save指令 指令功能:将指定镜像保存 ...
- Docker学习之镜像操作
使用Docker镜像 以下都是Docker镜像的一系列重要名操作,包括获取.查看.搜索.删除.创建.存出或载入.上传等.可使用docker image help命令查看帮助. 1.获取镜像(pull) ...
随机推荐
- OO随笔
第一次作业——多项式计算 1.自我程序分析 第一次作业是多项式计算,只使用了一个多项式类.第一次接触面向对象的程序,还比较生疏,不是很能理解面向对象的思想.将读入,处理,计算,都放到了main函数中, ...
- git删除远程分支,删除本地分支
远程 # git push origin --delete duck - [deleted] duck 本地 # git branch -d duck 已删除分支 duck(曾为 dda11b8). ...
- IE低版本 JSON.parse 和stringify 的兼容 (IE8以下)
低版本的IE不支持JSON,JSON对象解析不是随着javascript产生的,找到一段兼容常用的JSON.parse和JSON.stringify的代码if (!window.JSON) {wind ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 格式化列
jQuery EasyUI 数据网格 - 格式化列 以下实例格式化在 easyui DataGrid 里的列数据,并使用自定义列的 formatter,如果价格小于 20 就将文本变为红色. 为了格式 ...
- golang相关书签
https://www.zhihu.com/question/30461290 golang资料精选汇编
- 2 Class类
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时地类型标识.这个信息跟踪着每个对象所属地类.虚拟机 利用运行时类型信息选择相应地方法执行. 然而,可以通过专门地Java类访问这 ...
- flex属性介绍
- Linux下的crontab定时执行任务命令详解(参考:https://www.cnblogs.com/longjshz/p/5779215.html)
在Linux中,周期执行的任务一般由cron这个守护进程来处理[ps -ef | grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行以及调用时间. cron的配置文件成为 ...
- MVC架构模式详细说明
一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式(Mod ...
- C++ 命名管道 与Winform跨进程通信
以下是.NET命名管道解决方案中几个主要的类. NamedPipeNative:这个类和kernal32.dll联系实现命名管道的通信,其中包含一些常用方法和常量. NamedPipeWrapper ...