Docker学习笔记二打造基础镜像

在上篇笔记里面[url]http://qindongliang.iteye.com/blog/2279738[/url],我们已经下载好了基于docker的centos最新的镜像,本篇来看下如何构建,我们自己的一个镜像:


构建镜像二种方法:

(1)使用commit命令构建,适合一些简单的场景,定制型差

1,执行命令

docker run -it centos /bin/sh,//启动一个容器

vi /usr/bin/run.sh 编写一个shell脚本

#!/bin/sh

COUNT=0
while(true); do
COUNT=$(($COUNT+1))
echo $COUNT
sleep 2
done

保存退出
然后在执行 chmod +x /usr/bin/run.sh 给与执行权限
执行exit,退出容器

2,执行docker ps -a查看容器镜像id

[img]http://dl2.iteye.com/upload/attachment/0115/4524/90f3194b-a4a2-353e-965c-cf2d956e0930.png[/img]


然后执行提交镜像,执行命令:注意第一列第三个数是容器的id

docker commit 42750406c3d5 mytest:study

再次查看镜像,发现我们提交的镜像,已经可以查到了:
[code="java"]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest study 4d396274a0ff 12 minutes ago 196.6 MB
centos latest 0f0be3675ebb 8 days ago 196.6 MB
hello-world latest 690ed74de00f 4 months ago 960 B
#
[/code]
然后执行,运行我们的镜像文件:

docker run -it mytest:study run.sh

就会打印如下的信息:
[code="java"]
# docker run -it mytest:study run.sh
1
2
3
4
5
^C6
7
^C8
9
[/code]
这时候按Ctrl+C并不能直接退出容器,
需要先执行docker ps -a 查询它的容器id
然后在执行docker kill 容器id ,即可成功停止镜像

docker kill 94254a6a607a
//或者
docker stop 94254a6a607a



(2)使用Dockerfile构建 , 适合一些复杂的业务场景,定制型好


Dockerfile是一个文件名,必须这样命令,docker的规定,
通过docker build -t 镜像名字 项目路径
来构建一个image镜像

Dockerfile中的RUN命令,每一行执行完都会提交一个新的镜像
各个镜像直接,是增量编译的,互不影响,几个重要的指令:

FROM {base image}
FROM 必须放在Dockerfile的第一行,表示从哪个基础Image开始构建

MAINTAINER
可选 ,用来表示维护者的信息
#可用#号注意Dockerfile里面的内容

RUN
每个run指令,都会提交为image,作为下一个run的base image

RUN ["executable" ,"arg1",.....]

CMD
在Dockerfile中定义的cmd命令,在提交成image的时候不会起作用,只有当使用
image运行成container时,才会执行,
一个Dockerfile只能有一个有效的CMD
当运行时指定了command,那么将会覆盖默认设置的这个CMD


EXPOSE port:port 容器对外映射的端口或者暴露的端口,
一个port是容器启动的端口,两个是宿主映射端号:容器启动端口

ENV 指定环境变量:
例子:
ENV JAVA_BASE=/usr/local VERSION=8 UPDATE=20

ENV JAVA_HOME=${JAVA_BASE}/jdk1.${VERSION}.0_${UPDATE}

ENV PATH=$JAVA_HOME/bin:$PATH

ADD : 添加本地文件至docker容器中,如果是压缩文件会自动解压,
还可以ADD url

COPY:拷贝本地文件至docker容器中,如果是压缩文件,会自动解压

WORKDIR: 切换目录
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

最终路径时/a/b/c

ENTRYPOINT 容器启动时,执行的命令,不会被run参数的覆盖

如果有多个命令,仅仅会被执行一个,属于入口命令


CMD,容器启动时执行的命令,可以被运行时覆盖,

VOLUME 挂载 格式为 VOLUME ["/data"]
一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享。数据卷可以在多个容器之间共享。

创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然你也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,你就可以在其他容器中通过--volumes-froms参数来挂载该数据卷了,而不管该容器是否运行。你也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷。




编写一个例子:
(1)新建一个docker_test目录
(2)进入目录,新建一个Dockerfile,加入下面的简单内容
[code="java"]
# vi Dockerfile
FROM centos

RUN touch test.sh

CMD ["ls","-al" "/" ]

##默认执行ls -al /
##外部可以传命令进行覆盖
[/code]

(3)构建镜像docker build -t 仓库:标签 Dockerfile根目录
[code="java"]
# docker build -t dong:hello1 docker_test/
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM centos
---> 0f0be3675ebb
Step 2 : RUN touch test.sh
---> Running in 776952560bbc
---> a6fc535d5520
Removing intermediate container 776952560bbc
Step 3 : CMD ["ls","-al" ,"/" ]
---> Running in 4d2b382c4ec5
---> 68f78c1771ce
Removing intermediate container 4d2b382c4ec5
Successfully built 68f78c1771ce
[/code]

(4)查看镜像,会发现我们刚才的镜像,已经构建成功了:

[img]http://dl2.iteye.com/upload/attachment/0115/4526/cad6acda-0996-36e0-b54c-433089b65022.png[/img]


如果命令写错了,则可以重新生成镜像,不过需要远来镜像,使用下面的命令

//根据镜像id强制删除一个镜像
docker rmi -f 68f78c1771ce
//批量停止:
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
//批量删除已经退出的docker服务
docker ps -a | grep "Exited" | gawk '{print $1 }'| xargs docker rm
//删除none的镜像
docker images|grep none|awk'{print $3 }'|xargs docker rmi
//如果还删除不掉,就强制删除
docker images|grep none|awk '{print $3 }'|xargs docker rmi -f



docker里面安装tomcat例子:
[url]https://open.taobao.com/doc2/detail.htm?articleId=102822&docType=1&treeId=null[/url]

参考文章:
[url]http://blog.csdn.net/qq1010885678/article/details/46291461[/url]
[url]http://xiaorui.cc/[/url]

docker volume的文章:
[url]http://my.oschina.net/guol/blog/271225[/url]
[b][color=green][size=large]
有什么问题 可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园
[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值