Docker 初次见面

什么是Docker

Docker没有官方中文文档(至少目前为止没有,2018/1/1),所以只能通过搜索引擎加上我自己的了解来说一下。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

上面内容来自百度百科,但是我印象中,Docker好像已经支持了Mac和Windows,所以,应该是可以部署在任何机器上了吧。

其实简而言之,从功能来说的话,Docker是为了解决开发环境/运维环境不同,发布以及多平台移植不方便等问题而推出的一个虚拟化技术。(个人拙见,不一定正确)

那么Docker常用于哪些场景呢?

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShiftCloud Foundry平台来搭建自己的PaaS环境。

So What?

说了一堆,还是不知道什么是Docker,暂时先抛开Docker具体使用了什么技术,有什么指令可以使用,先来介绍几个概念。

Docker最重要的两个概念是镜像容器,除此之外呢,链接数据卷也很重要。

镜像

用过虚拟机的应该都听说过镜像,没用过虚拟机,装系统的话,也应该知道这个词汇。其实Docker的镜像就和虚拟机的快照类似,但是更轻量级,非常非常轻量。

创建Dcoker镜像有很多方式,最常用的是在一个现有的镜像下创建一个新的镜像,因为基本上我们需要的东西都有了公共镜像。每个镜像都有唯一的ID,作为标识符存在。

容器

说完镜像,来说下容器。同样是虚拟机的例子,注意,这里一直是子啊那虚拟机作类比,为什么了,因为Docker并不是真正意义上的虚拟机。

从镜像中创建容器,等同于使用快照创建虚拟机,而不同的呢?是前者更轻量。相同的呢?应用都是有容器运行的,就像虚拟机一样。

For example!你可以下载一个Ubuntu的镜像,公共安装Django等应用及其依赖来完成对它的修改,然后从该镜像中创建一个容器,在它启动后运行应用。

容器和虚拟机一样,是隔离的,拥有唯一的识别ID和名称,同时,容器也语序公开特定的端口,以便于对外公开服务。

与虚拟机相比,容器有个很大的差异,就在于它们被设计用来运行单进程,无法很好的模拟一个完整的环境,虽然可以通过相关的实例来启动多个进程,但我觉得这样真的没有必要。

容器是设计来运行一个应用的,而非一台机器,这就是它的意义所在。

数据卷

数据卷可以不受容器生命周期影响进行数据持久化。它们在表面上是容器内的空间,但实际上保存在容器外,从而允许在不影响数据的情况下对容器进行操作。

Docker运行开发者定义应用部分和数据部分,并提供工具将其分开。使用Docker时需要做到的思维变化之一是,容器应该是短暂和一次性的

卷,是针对容器的,可以使用同一个镜像创造多个容器并定义不同的卷。卷保存在运行Docker的宿主文件系统中,同时可以用来在容器间共享数据。

链接

容器在启动时,将分配一个随机的私有IP,其他的容器可以使用这个IP与其通讯。所以说,一,链接提供了容器间的相互通讯的渠道;二,容器将共享一个本地网络。

可移植性

这一点并不在刚才列举的几个概念之中,但也很重要,这是Docker最重要的特点之一。

说白了,Docker不允许不可移植的镜像。

How ?

Docker是如何实现这些功能和需求的呢?这里就要说到两个名词:

Cgroups

这是Linux内核功能,它让两件事情变成可能:

  • 限制Linux进程组的资源占用(内存,CPU)
  • 为进程组制作PID,UTS,IPC,网络,用户及装载命名空间

最为关键的,是命名空间。一个PID命名空间运行它使用隔离的PID,并与主PID命名空间独立开来,因此你可以在一个PID的命名空间里拥有自己的PID为1的初始化进程。其他的命名空间于此类似,然后你可以使用Cgroups创建一个环境,进程可以在其中运行,并于操作系统的其他应用隔离开来,但这里的关键点是,这个环境上的进程使用的是已经加载和运行的内核,因此额外支出与运行其他进程是一样的。

Union文件系统

在Union文件系统里,文件系统可以被装载在其他文件系统之上,其结果就是一个分层的积累变化。每个装载的文件系统表示前一个文件系统之后的变化集合,就像是一个diff

所以,当你下载一个镜像,修改它,然后保存成新版本,实际上只是创建了加载在包裹基础镜像的初始层上的一个新的Union文件系统。这也是Docker镜像轻量级的原因所在,通常来说,你的DB,Nginx和Syslog镜像都可以共享同一个Ubuntu基础,每一个镜像保存的只是它们需要的功能的基础上的变化。

Just do it!

Fist of all! 安装Docker

这里以Ubuntu服务器为例,记得先更新下apt源*(apt-get update)

安装

检查curl包有没有安装。

$ which curl

返回 curl路径,直接执行获取最新的docker安装包

如果curl没有安装的话,更新apt源之后,安装curl包。

$ sudo apt-get update $ sudo apt-get install curl

获得最新的docker安装包。

$ sudo curl -sSL https://get.docker.com/ | sh 

安装时间较长,耐心等待 or drink a cup of coffer!

确认Docker是否安装成功。

$ sudo docker run hello-world

这个命令会下载一个测试用的镜像并启动一个容器运行它。

hello.png

使用命令从公共registery下载一个镜像

$ docker pull ubuntu:latest
ubuntu

这个公共registry中有几乎所有的镜像,ubuntu,Mysql,Redis等等。Docker开发人员在这个公共registry里维护者数个镜像,也可以获取用户发布的镜像。

同样,也可以创建私有的registry。

列出镜像

$ docker images
images

从镜像创建容器

$ docker run --rm -ti ubuntu /bin/bash
demo

说明:

  • --rm 告诉Docker一旦运行的进程推出就删除容器,常用于测试时使用,可免除杂乱。
  • -ti 告诉Docker分配一个伪终端并进入交互模式。
  • ubuntu 容器基于的镜像
  • /bin/bash 要运行的命令

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

一、反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然...

3808
来自专栏生信技能树

从黑暗走向光明:Python包安装进阶之路

想当初刚学习Python的时候,就会用书本里面自带的一些package,用sys,os也用得很开心。后来接触到biopython项目,发现原来Python有这么...

2897
来自专栏Rainbond开源「容器云平台」

初学Node.js并部署到好雨云

1866
来自专栏黄Java的地盘

WebSocket系列之如何建立和维护可靠的连接

通过前四篇博客,相信读者对于WebSocket的使用和数据(不论是ArrayBuffer还是String)传输都有了一个深刻的了解。现在我们来介绍下,我在使用W...

1381
来自专栏互联网杂技

Docker在PHP项目开发环境中的应用

环境部署是所有团队都必须面对的问题,随着系统越来越大,依赖的服务也越来越多,比如我们目前的一个项目就会用到: - Web服务器:Nginx - Web程序:P...

34010
来自专栏Linyb极客之路

深入浅出Nginx

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

1416
来自专栏北京马哥教育

给小白的 Nginx 30分钟入门指南

运维行业正在变革,推荐阅读:30万年薪Linux运维工程师成长魔法 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服...

4017
来自专栏技术专栏

Acmen-helper一键生成springboot-api基本项目骨架!Easy Coding,Enjoy life!

还在为繁琐的配置工作和重复的基础Coding而烦恼吗?Acmen-helper一键搞定 。Easy Coding,Enjoy life!

892
来自专栏信安之路

一步一步带你体验 openvas

openvas 是 nessus 项目的一个开源分支,用于对目标系统进行漏洞评估和管理,openvas 的配置使用相较于 nessus 更加复杂,扫描速度也不如...

700
来自专栏高性能服务器开发

(七)开源一款即时通讯软件的源码

在我的《服务器端编程心得》这个系列的第一篇至第六篇都是讲了一些零散的不成体系的网络编程细节。今天,在这篇文章中,我将介绍一款我自主开发的即时通讯软件flamin...

5074

扫码关注云+社区