Docker 实践


目标

创建一个基于最新版Ubuntu的镜像,在该镜像中更新apt包源并安装NTP package,最后将该新镜像提交到本地私有的registry中。

本地创建私有Registry

有N种方法创建私有Registry,这里选择最方(tou)便(lan)的,利用官方Registry镜像来构建。在你需要创建Registry的主机上运行:

  1. docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /opt/data/registry:/tmp/registry -p 5000:5000 registry

制作目标镜像

当然,创建镜像的方法也有N种。用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。
那么是否可以利用一个container创建镜像呢?答案是可以滴。
具体可以参考创建镜像

创建Dockerfile

最好是创建一个新的空目录,然后在该空目录下创建Dockerfile

  1. # This dockerfile uses the ubuntu image
  2. # Version 0.0.1
  3. # Author: Andy WU
  4. FROM ubuntu:latest
  5. MAINTAINER AndyWu zewei@nfs-qd.com
  6. # 更新apt包源
  7. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe">>/etc/apt/sources.list
  8. # 添加一行文字到文件/andy/test
  9. RUN echo "hello world">>/andy/test
  10. # 安装NTP
  11. RUN apt-get install ntp -y
  12. # 将 src 目录拷贝到目标镜像目录/opt/data下
  13. ADD src /opt/data

在Dockerfile同一目录下执行镜像创建命令:

  1. docker build -t 10.50.200.248:5000/andy/new_image .

注意,如果是要将镜像上传到私有的Registry中,必须将repository写全,格式是:registry/user/tag,这样当你push的时候,docker才能正确提交。

但是很不幸,提交时出现 error:

  1. ...
  2. Step3: RUN echo "hello world">>/andy/test
  3. --->Runningin8ae55dfb7dd7
  4. /bin/sh:1: cannot create /andy/test:Directory nonexistent

什么问题?为什么能正确更新/etc/apt/souce.list而不能更新/andy/test呢?我明明在刚刚利用Ubuntu镜像创建的容器里新建了这个文件啊?
提示没有/andy/test这个文件,那应该是Ubuntu这个base的镜像不存在这个文件,那么怎么来理解这个 base image 呢?
Base 镜像就是那个最原始,没有经过任何修改,这里的修改通常指的是添加其他package等。

镜像 VS 容器

造成这个错误的另一个根本原因是没有弄清image和container之间的关系。
image是死的,container是活的,我们利用image启动一个container,在container中所做的工作一旦退出,就不存在了
container不可重复,即利用image创建container,不可能创建出与之前一直的container。这可以从container ID看出:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16616512db82 10.50.200.248:5000/andy/new_mage:latest /bin/bash About a minute ago Exited (0) 5 seconds ago   cocky_heisenberg
b759a51351ba 10.50.200.248:5000/andy/new_mage:latest /bin/bash 9 minutes ago Exited (0) 2 minutes ago   sleepy_mclean

用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。
当然,你也可以通过docker start 来重新启动一个退出的container。

  1. docker start -i b759a51351ba

没有修改Dockerfile,无论你怎么修改tag,创建的总是同一个image.

上传镜像

  1. docker push 10.50.200.248:5000/andy/new_image

上传之后你可以去Registry查看是否成功:

  1. root@nfs:/opt/data/registry/repositories# tree --charset ASCII
  2. .
  3. `-- andy
  4. |-- new_image
  5. | |-- _index_images
  6. | |-- json
  7. | |-- tag_latest
  8. | `-- taglatest_json
  9. `-- test
  10. |-- _index_images
  11. |-- json
  12. |-- tag_latest
  13. `-- taglatest_json

验证

  1. docker pull 10.50.200.248:5000/andy/new_image
  2. docker run -it 10.50.200.248:5000/andy/new_image /bin/bash
  3. root@b759a51351ba:/# ntpq
  4. ntpq>

Bingo!

最后,上图。

Docker practice的更多相关文章

  1. Docker 使用及常用命令

    https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/expose.html docker practice 资料 -- ...

  2. Docker 系列之 基础入门

    安装 Docker Windows 10 专业版以上版本 Docker for Windows Installer 在安装前,需要确保目标机器已经开启了硬件虚拟化和 HyperV :在安装的过程中建议 ...

  3. HyperLedger Fabric 资料网址大全

    BLOCKCHAIN FOR DEVELOPERS 官方网址 i. 这个网址是ibm给的测试网址,注册进去就可以设置4个节点的区块链,而且有智能合约可以测试 区块链和HyperLedger开源技术讲堂 ...

  4. Docker Compose practice

    Docker Compose 什么是 Docker-Compose? Compose 可以让用户在集群中部署分布式应用.简单的说,Docker Compose 属于一个"应用层"的 ...

  5. Install Docker on Mac OS X(转)

    Install Docker on Mac OS X You can install Docker using Boot2Docker to run docker commands at your c ...

  6. Docker Resources

    Menu Main Resources Books Websites Documents Archives Community Blogs Personal Blogs Videos Related ...

  7. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  8. Kafka connect in practice(3): distributed mode mysql binlog ->kafka->hive

    In the previous post Kafka connect in practice(1): standalone, I have introduced about the basics of ...

  9. docker 系列 - Java程序制作Docker Image推荐方案(转载)

    本文转自 https://segmentfault.com/a/1190000016449865  , 感谢作者! 本文的源代码在:https://github.com/chanjarste... 这 ...

随机推荐

  1. AtCoder Grand Contest 019 A: Ice Tea Store

    tourist出的题诶!想想就很高明,老年选手可能做不太动.不过A题还是按照惯例放水的. AtCoder Grand Contest 019 A: Ice Tea Store 题意:买0.25L,0. ...

  2. MySQL复制 -- Binlog (1)

    复制之所以工作得益于MySQL把对数据库的变更都记录在 binlog中,然后主库把它读出来,放到从库上去应用.当然binlog 的用途不仅限于此,比如 PITR等 在5.1.4版本以前,binlog格 ...

  3. 二维RMQ模板

    int main(){ ; i <= n; i++) ; j <= m; j++) { scanf("%d", &val[i][j]); dp[i][j][][ ...

  4. [AT2363] [agc012_c] Tautonym Puzzle

    题目链接 AtCoder:https://agc012.contest.atcoder.jp/tasks/agc012_c 洛谷:https://www.luogu.org/problemnew/sh ...

  5. 从块级元素和行内元素的分析到bfc的布局理解

    接口和属性介绍 播放器提供了progressMakers属性,是一个数组类型,每一条记录包含offset时间和text打点的内容,还可以包含其他属性,此属性用于告诉播放器进度条打点记录,记录内容属性说 ...

  6. 《Node入门》读书笔记——用Node.js开发一个小应用

    Android APP的开发告一段落,一个稳定的.实现了基本功能的APP已经交付用户使用了!我和老板交流了下,接下来准备转战Node.js了,而且一部分前端的功能也要做进去!哈哈哈~~~接下来要朝一个 ...

  7. 数百种编程语言,而我为什么要学 Python?

    是应用率最高.长期霸占排行榜的常青藤 Java?是易于上手,难以精通的 C?还是在游戏和工具领域仍占主流地位的 C++?亦或是占据 Windows 桌面应用程序半壁江山的 C#?…… 我想,每个人可能 ...

  8. Yura

    Portal --> broken qwq Description ​  给你一个长度为\(n\)的序列\(a\)和一个正整数\(k\),求满足如下条件的区间\([l,r]\)的数量:\((\s ...

  9. error 65: access violation at 0x40021000 : no 'read' permission

    http://blog.csdn.net/stephen_yu/article/details/7725247 使用MDK自己创建一个STM32F103VE核的项目 加入源码后编译,正常,在线仿真单步 ...

  10. kill -9 a postgres process

    在postgresql中,不推荐使用Kill -9直接杀掉异常连接,因为直接使用kill -9会引起整个数据库核心进程的重启,同时其他正常程序连接也会被杀掉. 现开启两个psql连接,然后使用Kill ...