一次完整的Docker实作

说了那么多后,我们必须亲自动手玩了。下面把pull,run,build,push都玩一次,破除神秘感。一个典型的运行流程如下:

1. client用pull命令从仓库把image拉到docker host

docker pull的格式是:

docker pull[选项] [Docker Registry地址] <仓库名>:<标签名>

默认地址是 DockerHub。 仓库名:这里的仓库名是两段式名称,既 / ,“/”前面一般是用户名。对于 Docker Hub,如果不给出用户名,则默认为 library ,也就是官方镜像。

下载 Ubuntu14.04的image(以Ubuntu为例):

[email protected]:~$docker pull ubuntu:14.04  
14.04:Pulling from library/ubuntu  
c60055a51d74:Downloading [>                                                 ] 539.8 kB/65.69 MB  
755da0cdb7d2:Download complete  
969d017f67e6:Download complete  
37c9a9113595:Download complete  
a3d9f8479786:Download complete                                                                  
…

运行docker images命令看看下载的images:

$docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
ubuntu            ml 14.04              b969ab9f929b        4 weeksago         188 MB

2. 在docker host上面运行Ubuntu 14.04于Containers

我们现在运行Ubuntu14.04中的bash shell,因为docker运行image于容器时,需要指定主进程(本例的主进程为bash)。

在终端1上面运行:

docker run -it --rm ubuntu:14.04 bash

在终端2上面运行:

docker run -it --rm ubuntu:14.04 bash

这样我们就运行了Ubuntu 14.04这个image的2次实例(得到2个容器), Linux下面的ps命令是看进程的,Docker下面就是看image的实例容器了。

$ docker ps  
CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  
e3a913872698       ubuntu:14.04       "bash"              11seconds ago      Up 10 seconds                           wizardly_elion  
db1c25753e97       ubuntu:14.04       "bash"              21seconds ago      Up 21 seconds                           adoring_shannon

image和container之间的关系类似程序与进程之间的关系,一个静若处子,一个动如脱兔。比如程序QQ,运行一次就是1个QQ进程,再运行一个QQ就是第2个QQ进程。同样道理,一个image也可以运行多份Container。

3. 构建自己的image

现在想在Ubuntu 14.04中增加Vim和GCC,构建一个增量image,因为目前的Ubuntu image里面没有这样的命令:

[email protected]:/# vim  
bash: vim: command not found

于是在Ubuntu 14.04这个image基础上面,叠加一层,然后把它提交到docker hub的21cnbao的仓库。

我们需要在客户端电脑上面创建一个Dockerfile文件(该文件用于描述image),以实现在现有的Ubuntu 14.04上面做增量的目的。

$ mkdir myubuntu  
$ cd myubuntu/  
$ touch Dockerfile

用Vim编辑Dockerfile,添加如下内容:

# ubuntu 14.04 with vim and gcc  
FROM ubuntu:14.04  
MAINTAINER Barry Song<[email protected]>  
RUN apt-get update && apt-getinstall –y vim gcc

RUN 指令的含义是在指定在源image内执行一条命令,本例更新APT 缓存,并且安装Vim和 GCC以形成一个增量image。

下面build这个image:

$ docker build -t 21cnbao/myubuntu:14.04 .  
time="2017-02-21T06:48:07+08:00"level=info msg="Unable to use system certificate pool: crypto/x509: systemroot pool is not available on Windows"  
Sending build context to Docker daemon2.048 kB  
Step 1/3 : FROM ubuntu:14.04  
---> b969ab9f929b  
Step 2/3 : MAINTAINER Barry Song<[email protected]>  
---> Running in f1449746b58c  
---> 5dacd7a6ee5d  
Removing intermediate containerf1449746b58c  
Step 3/3 : RUN apt-get update &&apt-get install vim gcc  
---> Running in b1469caf3509  
Ign http://archive.ubuntu.com trustyInRelease  
Get:1 http://archive.ubuntu.comtrusty-updates InRelease [65.9 kB]  
Get:2 http://archive.ubuntu.comtrusty-security InRelease [65.9 kB]  
Get:3 http://archive.ubuntu.com trustyRelease.gpg [933 B]  
Get:4 http://archive.ubuntu.com trustyRelease [58.5 kB]  
Get:5 http://archive.ubuntu.comtrusty-updates/main Sources [485 kB]  
…

下面运行21cnbao/myubuntu 14.04这个镜像:

docker run -it --rm 21cnbao/myubuntu:14.04 bash

发现GCC和Vim都有了:

$ docker run -it --rm 21cnbao/myubuntu:14.04 bash  
[email protected]:/#gcc  
gcc: fatal error: no input files  
compilation terminated.  
[email protected]:/#

4. 通过docker push把image提交到仓库

在Docker Hub上面创建一个仓库myubuntu,该仓库创建后,全名将为21cnbao/myubuntu。

下面push这个image到Docker Hub,之前我们需要登录到Docker Hub:

$ docker login --username=21cnbao [email protected]  
Flag--email has been deprecated, will be removed in 1.14.  
Password:  
Login Succeeded

下面开始push:

$ docker push 21cnbao/myubuntu  
time="2017-02-21T07:17:59+08:00"level=info msg="Unable to use system certificate pool: crypto/x509: systemroot pool is not available on Windows"  
The pushrefers to a repository [docker.io/21cnbao/myubuntu]  
87157b68b121:Pushing [>                                                 ] 1.109 MB/134.7 MB  
c9fc7024b484:Pushing [==================================================>] 3.072 kB  
ca893d4b83a6:Pushing [==================================================>] 4.608 kB  
153bd22a8e96:Pushing 7.168 kB  
83b575865dd1:Pushing [==================================================>] 209.9 kB  
918b1e79e358:Waiting  
…

通过Docker Hub进哥的仓库看一眼,发现大功告成了。

2小时结束,相信你已经爱上Docker。相爱容易相处难,痛苦才刚刚开始。人生若只如初见,何事秋风悲画扇。等闲变却故人心,却道故人心易变。

时间: 2024-10-02 07:02:11

一次完整的Docker实作的相关文章

完整的docker打包到生成容器的过程

1. 将容器变为镜像 docker commit 261314c94305 imagexxx ''' 可用参数 -a :提交的镜像作者: -c :使用Dockerfile指令来创建镜像: -m :提交时的说明文字: -p :在commit时,将容器暂停. imagexxx是新创建的镜像的名字 ''' 2. 将镜像打包成tar包 docker  save  -o xxx.tar  imagexxx # 当前路径下会生成一个xxx.tar 例如:docker save -o electric_kno

宋宝华:Docker 最初的2小时(Docker从入门到入门)

最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学习高级用法,深层原理,一轮轮迭代.坚决反对一上来就搞几百页厚的东西把人脑子弄乱. Docker是什么? KVM, Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器:而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔

60、Docker 学习笔记(CentOS 7.1)

基本概念 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository)理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 Docker 镜像就是一个只读的模板.例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序.镜像可以用来创建 Docker 容器.Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好

解决Docker容器时区及时间不同步问题

今天在系统集成测试时由测试人员提交了一个测试bug,原因是提交业务数据时间与实际时间(北京时间)有偏差,导致统计异常.由于我们集成测试是向测试人员直接提供完整的Docker镜像作为测试环境,原因应该是出在容器时间设置上. 拿到交付的docker镜像后,启动后进入容器控制台,使用date命令查看果然时间不正确.再查看宿主机时间是正确,这样肯定是容器启动时未将时区与宿主机保持同步了,由于测试镜像是由dockfile直接构建,因此问题基本了定准在dockerfile文件上了. 打开dockerfile

Docker 学习笔记(CentOS 7.1)

基本概念 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository)理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 Docker 镜像就是一个只读的模板.例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序.镜像可以用来创建 Docker 容器.Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好

安装docker

docker 环境: centos 6.5 64位 默认装完系统的话centos内核是 [[email protected] ~]# uname -aLinux localhost.localdomain 2.6.32-431.el6.x86_64 docker支持的内核是3.xx以上版本 系统必须是64位的 一.首先先升级自己本身的内核等级2.6->3.xx 步骤: [[email protected] ~]# rpm -ivh http://dl.Fedoraproject.org/pub/

Docker EE/Docker CE简介与版本规划

近日,Docker发布了Docker 17.03.进入Docker 17时代后,Docker分成了两个版本:Docker EE和Docker CE,即:企业版(EE)和社区版(CE).那么这两个版本有什么区别呢?不仅如此,Docker进入17.03后,版本命名方式跟之前完全不同,以后Docker又会有怎样的版本迭代计划呢?本文将为您一一解答. 版本区别 Docker EE Docker EE由公司支持,可在经过认证的操作系统和云提供商中使用,并可运行来自Docker Store的.经过认证的容器

用harbor实现docker registry用于kolla部署openstack

一,     准备docker环境 (一)docker 版本介绍 随着Docker的不断流行与发展,docker公司(或称为组织)也开启了商业化之路,Docker 从        17.03版本之后分为 CE(CommunityEdition)和 EE(EnterpriseEdition). 主要区别:Docker EE由公司支持,可在经过认证的操作系统和云提供商中使用,并可运行来自Docker Store        的.经过认证的容器和插件:Docker CE是免费的Docker产品的新

Docker暴露2375端口,引起安全漏洞

作者:廖煜,电子科技大学计算机和金融学双硕士,负责Ghostcloud的产品运营.曾任EMC西南区架构师.国内顶级Docker技术专家,Docker开源项目贡献者.拥有丰富的虚拟化.云计算和企业级软件经验. 今天有小伙伴发现docker暴露出2375端口,引起了安全漏洞.我现在给大家介绍整个事情的来龙去脉,并告诉小伙伴们,怎么修复这个漏洞. 为了实现集群管理,Docker提供了远程管理接口.Docker Daemon作为守护进程,运行在后台,可以执行发送到管理接口上的Docker命令.正是因为错