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

在上篇笔记里面http://qindongliang.iteye.com/blog/2279738,我们已经下载好了基于docker的centos最新的镜像,本篇来看下如何构建,我们自己的一个镜像: 构建镜像二种方法: (1)使用commit命令构建,适合一些简单的场景,定制型差 1,执行命令

Java代码

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

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

Java代码

  1. #!/bin/sh
  2. COUNT=0
  3. while(true); do
  4. COUNT=$(($COUNT+1))
  5. echo $COUNT
  6. sleep 2
  7. done

保存退出 然后在执行 chmod +x /usr/bin/run.sh 给与执行权限 执行exit,退出容器 2,执行docker ps -a查看容器镜像id

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

Java代码

  1. docker commit 42750406c3d5 mytest:study

再次查看镜像,发现我们提交的镜像,已经可以查到了:

Java代码

  1. [root@h1 ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. mytest study 4d396274a0ff 12 minutes ago 196.6 MB
  4. centos latest 0f0be3675ebb 8 days ago 196.6 MB
  5. hello-world latest 690ed74de00f 4 months ago 960 B
  6. [root@h1 ~]#

然后执行,运行我们的镜像文件:

Java代码

  1. docker run -it mytest:study run.sh

就会打印如下的信息:

Java代码

  1. [root@h1 ~]# docker run -it mytest:study run.sh
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. ^C6
  8. 7
  9. ^C8
  10. 9

这时候按Ctrl+C并不能直接退出容器, 需要先执行docker ps -a 查询它的容器id 然后在执行docker kill 容器id ,即可成功停止镜像

Java代码

  1. docker kill 94254a6a607a
  2. //或者
  3. 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,加入下面的简单内容

Java代码

  1. [root@h1 docker_test]# vi Dockerfile
  2. FROM centos
  3. RUN touch test.sh
  4. CMD ["ls","-al" "/" ]
  5. ##默认执行ls -al /
  6. ##外部可以传命令进行覆盖

(3)构建镜像docker build -t 仓库:标签 Dockerfile根目录

Java代码

  1. [root@h1 ~]# docker build -t dong:hello1 docker_test/
  2. Sending build context to Docker daemon 2.048 kB
  3. Step 1 : FROM centos
  4. ---> 0f0be3675ebb
  5. Step 2 : RUN touch test.sh
  6. ---> Running in 776952560bbc
  7. ---> a6fc535d5520
  8. Removing intermediate container 776952560bbc
  9. Step 3 : CMD ["ls","-al" ,"/" ]
  10. ---> Running in 4d2b382c4ec5
  11. ---> 68f78c1771ce
  12. Removing intermediate container 4d2b382c4ec5
  13. Successfully built 68f78c1771ce

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

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

Java代码

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

docker里面安装tomcat例子: https://open.taobao.com/doc2/detail.htm?articleId=102822&docType=1&treeId=null 参考文章: http://blog.csdn.net/qq1010885678/article/details/46291461 http://xiaorui.cc/ docker volume的文章: http://my.oschina.net/guol/blog/271225

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2016-03-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python、Flask、Django

Docker部署java项目[tomcat环境][第一次优化]

3323
来自专栏糊一笑

小白学Docker之Compose

承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之...

38611
来自专栏Python、Flask、Django

Docker精简项目(Python3.6+Flask1.0+Pipenv)

3302
来自专栏散尽浮华

Docker容器学习梳理--基础知识(1)

Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0...

30110
来自专栏糊一笑

小白学Docker之基础篇

系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记...

5134
来自专栏测试驿栈

Docker_部署jenkins(dockerfile实现)

我用的是ubuntu14.04的基础镜像,并且在基础镜像中已经把ant,tomcat,jdk的安装包配置好了。具体的这里不做赘述。

1.4K3
来自专栏搜云库

Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginx

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测...

2466
来自专栏同步博客

Docker之常用命令(二)

631
来自专栏dalaoyang

docker部署springboot项目

1714
来自专栏搜云库

Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginx

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测...

2395

扫码关注云+社区

领取腾讯云代金券