版权声明:本文由田飞雨原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/98
来源:腾云阁 https://www.qcloud.com/community

Docker 是一个能够把开发应用程序自动部署到容器的开源引擎。它由Docker公司的团队编写,基于Apache 2.0开源协议授权。它提供了一个简单、轻量的建模方式,使开发生命周期更高效快速,鼓励了面向服务的架构设计。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker 的特点:

  1. 更快速的交付和部署
  2. 更高效的虚拟化
  3. 更轻松的迁移和扩展
  4. 更简单的管理
  • 容器技术与传统虚拟机性能对比

  • Docker与虚拟机建构对比

Docker 容器本质上是宿主机上的一个进程。Docker 通过 namespace 实现了资源隔离,通过 cgroups 实现了资源的限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。

Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,Docker运用Namespace将进程隔离,为进程或进程组创建已隔离的运行空间,为进程提供不同的命名空间视图。这样,每一个隔离出来的进程组,对外就表现为一个container(容器)。需要注意的是,Docker让用户误以为自己占据了全部资源,但这并不是”虚拟机”。

Docker 中的三个概念:镜像,容器,仓库

  1. 镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
    镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:index.docker.io

  2. 容器( Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

  3. 仓库:仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。

Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

一.安装 Docker

本次实验环境:腾讯云服务器 CentOS 6.7 x86_64

前提条件:
Docker运行对内核要求比较高,因此一般建议直接在Ubuntu这样的平台运行。但作为一个容器标准,Docker也是支持其他如CentOS, Mac OS X, Windows等平台。目前Docker支持以下版本CentOS:

  • CentOS 7(64位)
  • CentOS 6.5(64位)及以后
  • 在运行CentOS 6.5及以后版本时,需要内核版本>=2.6.32-431,因为这些内核包含了运行Docker的一些特定修改。

Docker默认使用AUFS作为存储驱动,但是AUFS并没有被包括在Linux的主线内核中。CentOS中可以使用Device Mapper作为存储驱动,这是在2.6.9内核版本引入的新功能。我们需要先确认是否启用该功能:

CentOS 7

Docker RPM包已经包含在CentOS-Extra仓库中,所以我们可以直接使用Yum安装:

# yum install docker

CentOS 6.6

需要注意的是,CentOS6.6中,已经有一个同名docker的可执行系统程序包。所以Docker RPM包命名为docker-io,我们先卸掉docker。

# yum -y remove docker

第三步 Install Docker-IO

# yum -y install docker-io

这样完成了Docker的安装。

# /etc/init.d/docker start #启动docker
# docker info #查看 docker 基本信息

二. Docker 基本操作

# docker run -d --name mynginx nginx   #启动nginx镜像,没有会自动pull
# docker stop bfd094233f96 #停止一个容器,根据容器 id 进行删除
# docker rm bfd094233f96 #删除一个容器
# docker attach d20f3dc6cd92 #进入一个正在运行的容器

-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
–name 使用一个自定义的名字

此命令不太好用,建议使用以下命令进入容器:

[root@localhost docker] docker inspect --format "{{.State.Pid}}" mynginx  #获取容器pid 19769
[root@localhost docker] nsenter --target 19769 --mount --uts --ipc --net --pid #进入容器(推荐方法)
docker run -d -p 91:80 --name mynginx2 nginx # -p 指定端口映射,将80映射为host的91

存储镜像:

# docker save -o ubuntu_14.04.tar ubuntu:14.04

载入镜像:

# docker load < ubuntu_14.04.tar  或者使用
# cat ubuntu.tar | docker import - test/ubuntu:v1.0

移除本地镜像:

# docker rmi training/sinatra
清理所有未打过标签的本地镜像:

# docker rmi $(docker images -q -f "dangling=true")
其中 -q 和 -f 是 quiet,–filter 的缩写, 完整的命令其实可以写着下面这样,是不是更容易理解一点?

# docker rmi $(docker images --quiet --filter "dangling=true")
注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。

要获取容器的输出信息,可以通过 docker logs 命令。
# docker logs [container ID or NAMES]

删除容器:
# docker rm 默认并不会删除运行中的容器

有关容器和镜像的底层信息:
# docker inspect container/image

可以查看:
容器实例的IP地址
端口绑定列表
特定端口映射的搜索
收集配置的详细信息

从容器内复制文件到指定的路径上:
# docker cp container:path hostpath

使用Dockerfile来构建镜像:
# docker build [options] PATH | URL

–rm=true表示构建成功后,移除所有中间容器
–no-cache=false表示在构建过程中不使用缓存

最新文章

  1. javascript排序
  2. acdream1233 Royal Federation (构造?)
  3. php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组
  4. alibaba的FastJson(高性能JSON开发包),fastjson 使用demo
  5. Show in Finder OC代码
  6. 世界上最小的发行版之一Tiny Core
  7. 第二部分 Mongodb增删改查
  8. Windows 2008 IIS7.0安装FTP教程 IIS7.5 配置多用户FTP
  9. MVC产生验证码
  10. SQL SERVER 分页方法
  11. github三大步骤
  12. vs 2013打开vs 2008解决方案问题解决
  13. inout口在modelsim仿真的方法
  14. Python Numpy-基础教程
  15. Java使用RabbitMQ之整合Spring(生产者)
  16. Python常用内置函数介绍
  17. java中的数据结构[copy]
  18. Android Studio使用Gradle引入包
  19. python中时间差中seconds和total_seconds
  20. sigint sigterm 有什么区别啊

热门文章

  1. MUI 个推
  2. 区分一下dpkg,rpm和yum以及apt-get
  3. 我的android学习经历24
  4. C#占位符与格式化字符串
  5. C#For循环
  6. javascript/jquery判断是否为undefined或是null!
  7. UE4编程之C++创建一个FPS工程(二)角色网格、动画、HUD、子弹类
  8. CentOS 7 (无盘安装)PXE服务器的搭建(失败求助版)
  9. Java_GC详解
  10. 07.常用的SQL语句