文档章节

如何创建属于你自己的 docker 镜像库

Aimer1027
 Aimer1027
发布于 2015/11/28 22:04
字数 2171
阅读 68
收藏 1
点赞 0
评论 0

出于工作和学习的目的常用虚拟机来搭建部署 linux 的环境,也经常在于别人合作的时候收到同事发来的虚拟机镜像;

在感受虚拟机带来便利的同时, 也不得不忍受着传输镜像缓慢以及跑多个虚拟机造成主机卡死的尴尬,

更有甚者,还会因为硬件方面的种种原因而造成无法导入导出镜像的窘境。我相信这些问题并不是我一个人遇到过。

而 docker 这个虚拟平台在某种程度上可以很好的弥补虚拟机的一些缺陷,

docker 的工作原理和概念在网上有很多很好的博客都有介绍,在这里就不多介绍了;


说一下个人理解 docker 为虚拟机提供了一个运行的平台,在它的上面你可以使用镜像文件来保存虚拟机,

通过镜像文件来生成容器(可以运行的虚拟机实例) 。

你可以在 docker 上面同时运行多个由一个镜像创建的容器,而这多个容器可以进一步配置创建一个集群 

docker 的工作方式类似于 github , 如果你将虚拟机镜像文件等价于项目,

你可以通过 pull 方式来将项目(虚拟机镜像)下载到本地(本地必须要有 docker 平台才可以),

然后运行 docker 命令将虚拟机镜像文件生成容器对象,通过访问容器对象来修改容器的状态,

并将容器的状态改变这一变化同步(commit)到虚拟机镜像中,

最后,如果这一改变是你希望保留的,那么为了保存该虚拟机镜像,你可以通过 push 的方式将该镜像

上传到你自己的镜像库中进行保存; ---> 这样就无需虚拟机镜像随身携带咯,

如果是创建虚拟机的话,或是保存到移动硬盘中或是上传到云盘中下载传输起来也麻烦

有了 docker , 即便是换了开发环境,只需要安装docker 然后直接将虚拟机镜像从你的 docker 库中 pull

下来生成容器对象,直接就可以运行咯 ~


在这篇博客中,就简单介绍一下,如何从官方 docker 库中pull 下来 centos docker 镜像文件,

运行镜像文件生成容器,修改容器(安装我们需要的软件),将容器变动同步到镜像文件中,

再将本地的 docker 镜像文件同步到网上的镜像库中。

这样一番折腾,docker 的基本使用方法就差不多入门咯~

0. 启动 Boot2DockerStart 来启动 docker ,

   通过 ssh 来远程连接到 docker

   ip : 192.168.59.103

   port: 22

   user-name:docker

   psword:tcuser

1. 从官方 docker 镜像库中 pull 下来 centos 镜像文件,

这个是 ubuntu 官方 docker 镜像的网址


在该链接下可以看到,docker pull ubuntu 命令便是获取官方 centos docker 镜像的命令;

如果对版本有要求的话,可以在后面添加 centos 的版本信息

在这里,我们希望下载ubuntu , 执行命令如下:

docker pull ubuntu:14.04

在这里不得不说一下 docker 的 tag, tag 也就是打标签的意思,可以为一个 docker 镜像文件设置多个 tag


也可以为不同的版本的docker 镜像设置不同的 tag  , 就像连接中展示的一样,

centos7 有多个标签 , lastest , centos7 , 7 都是他的标签

这也就是说

docker pull ubuntu:14.04.3 | ubuntu:14.04 | trusty-20151028 ...

将 ubuntu 的镜像文件拉倒本地来,显示信息如下:

docker@boot2docker:~$ docker pull ubuntu:14.04
Pulling repository ubuntu
docker@boot2docker:~$ docker pull ubuntu:14.04
Pulling repository ubuntu
ca4d7b1b9a51: Download complete 
2332d8973c93: Download complete 
ea358092da77: Download complete 
a467a7c6794f: Download complete

这个过程比较花时间,毕竟下载的是一个镜像,就算它是最小配置的,但是照比普通文件还是要大得多

输入命令 docker images ---> 该命令会将当前 docker 平台上面的所有镜像文件显示出来

镜像名称   标签名称        镜像 ID                       何时创建/下载            镜像文件的大小

ubuntu   latest   ca4d7b1b9a51        2 weeks ago         187.9 M


2. 运行镜像,然后远程访问容器内部,运行之前建议打开一个新的 docker ssh 连接,这样可以获取到运行容器的 id 号码

docker run -it ubuntu:14.04

进入到 ubuntu 镜像生成的容器之后,用户名称会从 docker 编程 root

3. 换另一个 ssh ,输入如下命令来查询docker 容器的 ID 号码

docker ps  


我的是

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f0a9c134bfaa        ubuntu:14.04        "/bin/bash"         8 seconds ago       Up 8 seconds                            compassionate_wright


4. 在容器内部下载需要的软件


    安装 wget (挑个简单的)

apt-get install wget    


5. 将当前容器的状态同步到 ubuntu 镜像文件中(在这里既可以重新起一个镜像文件名称: 如果你不想覆盖原有的镜像的话)

docker commit [容器 ID] [要被覆盖的/新建的镜像名称]
docker commit f0a9c134bfaa aimer_ubuntu_1128 ----> 这个数字串就是上面通过 docker ps 命令查看到的



可以看到这里因为我没有选择覆盖,所以会重新生成一个新的 docker 镜像,

该 docker 镜像的名称可以通过 docker images 命令来查看,输入命令,显示信息如下:

docker@boot2docker:~$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
aimer_ubuntu_1128      latest              c142866b2238        58 seconds ago      194.3 MB


6. 将刚刚创建好的 ubuntu 镜像文件上传到自己的 docker 镜像库中[就像面向对象编程的前提是你必须要有个对象,在这里你要有一个 docker hub 账号]


   6.1 远程登录 docker.hub 网站

        命令如下:

docker@boot2docker:~$ docker login
docker@boot2docker:~$ docker login
Username: aimer
Password: 
Email: aimer1027@hotmail.com
Login Succeeded



        我的登录名称是 aimer , 这个登录名称对应的就是众多镜像库的主路径,我们若想把刚刚创建的镜像文件上传上去,

        那么这个镜像的名称的定义一定要符合

[登录名称]/[自定义的库名称]       


       可以通过为docker 镜像文件重新打标签的方式(类似 linux 下面的软连接)来替代重新创建一个镜像文件并将其按照规范命名

   6.2 停止 docker 的运行

        /如果上传 docker 镜像没有将生成镜像的容器停止,上传会出错,而且出错不会显示

       通过 docker ps 命令来找到该容器 ID

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f0a9c134bfaa        ubuntu:14.04        "/bin/bash"         16 minutes ago      Up 16 minutes                           compassionate_wright



  输入如下命令来停止容器----> Ps: 备份或是创建镜像文件的时候,一定是要是容器运行的时候, 因为容器就是镜像文件动态加载到内存的对象实例; 上传镜像的时候,一定要是容器停止的时候

docker@boot2docker:~$ docker stop f0a9c134bfaa 
f0a9c134bfaa



   6.3 为你本地的 docker 镜像增加合适你远程docker 库的标签

docker tag [镜像原名] [镜像原名:tag 名称]
  
  docker tag aimer_ubuntu_1128 aimer/ub_aimer:1128



  结束之后,可以输入 docker images 来查看一下,虽然 aimer_ubuntu_1128 和 aimer/ub_aimer:1128 的名称不同(tag 也不同,可以选择名称相同,但是 tag 不同的打标签方式),

  但是,这两个名称的镜像文件实质上是同一个; 看 IMAGE ID 就知道咯~

docker@boot2docker:~$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
aimer_ubuntu_1128      latest              c142866b2238        12 minutes ago      194.3 MB
aimer/ub_aimer         1128                c142866b2238        12 minutes ago      194.3 MB


  6.4 将镜像文件上传到你远程的镜像库中

       执行如下的命令, 不像是 github 中先要 commit 在push , 镜像文件在本地的话,直接上传就行了

docker@boot2docker:~$ docker push aimer/ub_aimer:1128
The push refers to a repository [aimer/ub_aimer] (len: 1)
Sending image list
Pushing repository aimer/ub_aimer (1 tags)
2332d8973c93: Pushing



7. 从自己的远程镜像库中将刚刚上传的 docker pull 下来,生成容器在运行 (可选操作)

   现将本地同名标签的镜像文件给删除

docker@boot2docker:~$ docker rmi  aimer/ub_aimer:1128
Untagged: aimer/ub_aimer:1128


  是的,没有错,这个名称其实就是一个标签, 所以删除标签所指向的 docker 镜像的话,本身仅仅是将这个标签从docker 镜像文件上面移除,


  而这个镜像文件本身还是存在于本地的

© 著作权归作者所有

共有 人打赏支持
Aimer1027
粉丝 0
博文 8
码字总数 7353
作品 0
杭州
搜索&运行whalesay镜像

目录 开始使用Docker 在OS X安装Docker 理解镜像(images)和容器(containers) 搜索&运行whalesay镜像 构建你自己的镜像 创建Docker Hub账号(account)&库(repository) 标记(Tag),推送(Push),拉...

暗之幻影 ⋅ 2016/12/10 ⋅ 0

开始使用Docker

在学习Docker的过程中仔细的阅读了官方的入门教程, 为加深学习的印象, 翻译此教程, 也同时方便他人学习使用. 目录 开始使用Docker 在OS X安装Docker 理解镜像(images)和容器(containers) 搜索...

暗之幻影 ⋅ 2016/12/10 ⋅ 0

Docker初体验

最近的项目中用到了Docker,感觉超级好用。写下这篇文章作为自己学习的一个小结,也作为一篇Docker的入门介绍。 本文由以下内容组成: 什么是Docker Docker基本概念 容器和传统VM的区别 安装...

强哥 ⋅ 2017/11/27 ⋅ 0

Docker 构建统一的前端开发环境

往事 15年刚来运满满,那个时候的前端团队还只有2个人,还没有用到打包的相关工具,我们重构了前端的开发流程,引入了vue做基础开发框架,使用了fis3做项目打包,由于项目快速迭代,公共库的...

运满满前端团队 ⋅ 06/02 ⋅ 0

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

之前已经总结了Docker容器学习梳理--基础知识(1),但是不够详细,下面再完整补充下Docker学习的一些基础。 Docker是个什么东西 Docker是一个程序运行、测试、交付的开放平台,Docker被设计...

dengaosky ⋅ 2017/12/27 ⋅ 0

标记(Tag),推送(Push),拉取(Pull)你自己的镜像

目录 开始使用Docker 在OS X安装Docker 理解镜像(images)和容器(containers) 搜索&运行whalesay镜像 构建你自己的镜像 创建Docker Hub账号(account)&库(repository) 标记(Tag),推送(Push),拉...

暗之幻影 ⋅ 2016/12/10 ⋅ 0

Docker入门教程 Part 1 基础概念 - 镜像、容器、仓库

前言 第一篇笔记,先总体介绍Docker,及它与虚拟机技术的区别,最后再介绍Docker的最基础的三大组件概念。 本文内容主要参考Docker官方网站以及中文书籍Docker — 从入门到实践。 我正在学习...

iotisan ⋅ 2017/10/19 ⋅ 0

理解镜像(images)和容器(containers)

目录 开始使用Docker 在OS X安装Docker 理解镜像(images)和容器(containers) 搜索&运行whalesay镜像 构建你自己的镜像 创建Docker Hub账号(account)&库(repository) 标记(Tag),推送(Push),拉...

暗之幻影 ⋅ 2016/12/10 ⋅ 0

虚拟化之容器docker基本操作

docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制。 Docker 支持三种不同的镜像层次存储的 drivers: aufs、devicemapper、btrfs ; Aufs:...

知微不知更 ⋅ 2017/05/09 ⋅ 0

10分钟上手 AWS ECS

你在用 docker 么?你是否感觉在国内更新 docker 经常失败?下载 docker image 速度缓慢? 如果你想解决这个问题,可以尝试使用 AWS 提供的 Elastic Container Service(简称 ECS)把你的 do...

刘思宁 ⋅ 2017/12/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 7分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 11分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 16分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 17分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 27分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 49分钟前 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 52分钟前 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 54分钟前 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部