docker的使用

一、Docker概述:

Docker: 本意是码头工人,言外之意是集装箱;

Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码;

Docker是:“一次封装,到处运行”,因为docker决绝了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。

一句话 应用打包工具

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器 [2]

Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,
源代码托管在 Github 上, 遵从Apache2.0协议开源。Docker的目标是实现轻量级的操作系统虚拟化解决方案。

学习Docker首先要了解几个概念:

镜像—Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息;

容器—容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在“Docker”上;

仓库—仓库是存放镜像的地方,有类似git的版本控制,同样分为公开仓库(Public)和私有仓库(Private)两种形式;

Docker支持大部分的Linux发行版,通过使用Docker容器,就可以在不同的操作系统,

不同的机器上运行自己的应用,不用关心硬件、运行环境之类的配置,应用程序的迁移变得非常简单。

二、Docker和传统虚拟化技术的对比

相比传统虚拟机技术,Docker资源占用少,启动更快,很大的方便了项目的部署和运维。
Docker是在操作系统层面上实现虚拟化,复用本地主机的操作系统,传统方式是在硬件的基础上,虚拟出多个操作系统,然后在系统上部署相关的应用。

下面的这张图片参考相关博文,很形象的说明了Docker和VM之类的传统虚拟化技术的区别:

vs

就像一个集装箱一样,不管需要运送服装还是化工产品,还是汽车,只需要放在集装箱里面,不管到那个船上,也不管到那个铁路上,我直接机械化的搬运就行了。很简单

Docker的优点:
Docker五大优势:持续集成、版本控制、可移植性、隔离性和安全性

【编者的话】 随着Docker技术的不断成熟,越来越多的企业开始考虑使用Docker。Docker有很多的优势,本文主要讲述了Docker的五个最重要优势,即持续集成、版本控制、可移植性、隔离性和安全性。

对于Docker,应该不需要进行详细的介绍了。它是最火热的开源项目之一,通过在容器中增加一个抽象层(a layer of abstraction),就可以将应用程序部署到容器中。在看似稳定而成熟的场景下,使用Docker的好处越来越多。在这篇文章中,我不谈论Docker是什么或者Docker是怎么工作的,取而代之,我会提出使用这个不断成长的平台的五大好处。

持续部署与测试
Docker在开发与运维的世界中具有极大的吸引力,因为它能保持跨环境的一致性。在开发与发布的生命周期中,不同的环境具有细微的不同,这些差异可能是由于不同安装包的版本和依赖关系引起的。然而,Docker可以通过确保从开发到产品发布整个过程环境的一致性来解决这个问题*Docker容器通过相关配置,保持容器内部所有的配置和依赖关系始终不变。最终,你可以在开发到产品发布的整个过程中使用相同的容器来确保没有任何差异或者人工干预。

使用Docker,你还可以确保开发者不需要配置完全相同的产品环境,他们可以在他们自己的系统上通过VirtualBox建立虚拟机来运行Docker容器。Docker的魅力在于它同样可以让你在亚马逊EC2实例上运行相同的容器。如果你需要在一个产品发布周期中完成一次升级,你可以很容易地将需要变更的东西放到Docker容器中,测试它们,并且使你已经存在的容器执行相同的变更。这种灵活性就是使用Docker的一个主要好处。和标准部署与集成过程一样,Docker可以让你构建、测试和发布镜像,这个镜像可以跨多个服务器进行部署。哪怕安装一个新的安全补丁,整个过程也是一样的。你可以安装补丁,然后测试它,并且将这个补丁发布到产品中。

多云平台
Docker最大的好处之一就是可移植性。在过去的几年里,所有主流的云计算提供商,包括亚马逊AWS和谷歌的GCP,都将Docker融入到他们的平台并增加了各自的支持。Docker容器能运行在亚马逊的EC2实例、谷歌的GCP实例、Rackspace服务器或者VirtualBox这些提供主机操作系统的平台上。举例来说,如果运行在亚马逊EC2实例上的Docker容器能够很容易地移植到其他几个平台上,比如说VirtualBox,并且达到类似的一致性和功能性,那这将允许你从基础设施层中抽象出来。除了AWS和GCP,Docker在其他不同的IaaS提供商也运行的非常好,例如微软的Azure、OpenStack和可以被具有不同配置的管理者所使用的Chef、Puppet、Ansible等。

环境标准化和版本控制
通过上面的讨论,Docker容器可以在不同的开发与产品发布生命周期中确保一致性,进而标准化你的环境。除此之外,Docker容器还可以像git仓库一样,可以让你提交变更到Docker镜像中并通过不同的版本来管理它们。设想如果你因为完成了一个组件的升级而导致你整个环境都损坏了,Docker可以让你轻松地回滚到这个镜像的前一个版本。这整个过程可以在几分钟内完成,如果和虚拟机的备份或者镜像创建流程对比,那Docker算相当快的,它可以让你快速地进行复制和实现冗余。此外,启动Docker就和运行一个进程一样快。

隔离性
Docker可以确保你的应用程序与资源是分隔开的。几个月前,Gartner发表了一篇报告,这份报告说明了运行Docker 容器进行资源隔离的效果和虚拟机(VM)管理程序一样的好,但是管理与控制方面还需要进行完善。

我们考虑这样一个场景,你在你的虚拟机中运行了很多应用程序,这些应用程序包括团队协作软件(例如Confluence)、问题追踪软件(例如JIRA)、集中身份管理系统(例如Crowd)等等。由于这些软件运行在不同的端口上,所以你必须使用Apache或者Nginx来做反向代理。到目前为止,一切都很正常,但是随着你的环境向前推进,你需要在你现有的环境中配置一个内容管理系统(例如Alfresco)。这时候有个问题发生了,这个软件需要一个不同版本的Apache Tomcat,为了满足这个需求,你只能将你现有的软件迁移到另一个版本的Tomcat上,或者找到适合你现有Tomcat的内容管理系统(Alfresco)版本。

对于上述场景,使用Docker就不用做这些事情了。Docker能够确保每个容器都拥有自己的资源,并且和其他容器是隔离的。你可以用不同的容器来运行使用不同堆栈的应用程序。除此之外,如果你想在服务器上直接删除一些应用程序是比较困难的,因为这样可能引发依赖关系冲突。而Docker可以帮你确保应用程序被完全清除,因为不同的应用程序运行在不同的容器上,如果你不在需要一款应用程序,那你可以简单地通过删除容器来删除这个应用程序,并且在你的宿主机操作系统上不会留下任何的临时文件或者配置文件。

除了上述好处,Docker还能确保每个应用程序只使用分配给它的资源(包括CPU、内存和磁盘空间)。一个特殊的软件将不会使用你全部的可用资源,要不然这将导致性能降低,甚至让其他应用程序完全停止工作。

安全性
如上所述,Gartner也承认Docker正在快速地发展。从安全角度来看,Docker确保运行在容器中的应用程序和其他容器中的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker容器不能窥视运行在其他容器中的进程。从体系结构角度来看,每个容器只使用着自己的资源(从进程到网络堆栈)。

作为紧固安全的一种手段,Docker将宿主机操作系统上的敏感挂载点(例如/proc和/sys)作为只读挂载点,并且使用一种写时复制系统来确保容器不能读取其他容器的数据。Docker也限制了宿主机操作系统上的一些系统调用,并且和SELinux与AppArmor一起运行的很好。此外,在Docker Hub上可以使用的Docker镜像都通过数字签名来确保其可靠性。由于Docker容器是隔离的,并且资源是受限制的,所以即使你其中一个应用程序被黑,也不会影响运行在其它Docker容器上的应用程序。

结语
将云计算一起考虑,上面提到的这些好处能够清楚地证明Docker是一个有效的开源平台。使用Docker的好处越来越多,今天我只想强调这前五大好处。如果你使用了Docker,欢迎分享你的使用案例或者任何你觉得使用Docker带来的好处。

查看镜像
在docker环境安装完成之后,对docker的使用主要集中在docker镜像的管理与使用。首先是docker镜像的管理,查看本地有哪些镜像可以使用命令:

docker images

运行镜像
查看到本地有哪些镜像后,就可以来运行已有的镜像了,使用命令:
docker run -t -i ubuntu:15.10 /bin/bash
如果该镜像不存在,会自动尝试下载对应的镜像,只要远程镜像库中有同名的镜像。远程镜像库默认地址为:https://hub.docker.com/。

搜索/下载镜像
当然我们也可以主动的先把镜像下载到本地,再运行。而下载之前还可以进行下搜索,命令如下:

docker search selenium/hub
搜索之后如果有镜像存在,就可以拉取镜像了。命令如下:
docker pull selenium/hub
最后运行镜像:
docker run -it selenium/hub

创建镜像
我们从镜像仓库下载的,都是别人事先做好的。如果我们需要一个定制的镜像,就必须得自己动手了。自己创建一个镜像有2种方式:
基于一个现有的镜像来修改
基于dockerfile来创建

镜像修改
镜像修改的方式是先运行一个现有的镜像,然后在运行的容器中进行软件的更新操作。比如:安装软件、服务之类。

docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/# apt-get update
root@e218edb10161:/# apt-get install wget
root@e218edb10161:/# exit
在完成软件安装/更新/升级之后,需要对该镜像进行提交操作,即做一个保存操作。
docker commit -m=“with wget” -a=“five3” e218edb10161 five3/ubuntu:v2
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:容器ID,在容器执行时可以在命令行开头查看。比如:root@e218edb10161中@之后的内容。此外还可以通过docker ps来查看
five3/ubuntu:v2:指定要创建的目标镜像名

接着,我们就可以使用新定制的镜像了。
docker run -t -i five3/ubuntu:v2 /bin/bash
目前为止,你保存的新镜像还只是在本地。如果你希望把它更新到docker仓库,可以使用如下命令:

docker push five3/ubuntu:v2
使用上述命令的前提是你已经在https://hub.docker.com/上注册了账户

dockerfile
使用dockerfile的方式其实是相当于从零开始创建一个新的镜像,具体步骤是先写好一个dockerfile文件。然后使用docker build命令来构建镜像,构建时会从网上下载及更新基础镜像与相关软件。

通常一个dockerfile的文件格式如下:
FROM centos:6.7
MAINTAINER Macy “five3@163.com”

RUN /bin/echo ‘root:123456’ |chpasswd
RUN useradd five3
RUN /bin/echo ‘five3:123456’ |chpasswd
RUN /bin/echo -e "LANG=“en_US.UTF-8"” >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
它与shell脚本类似,是一个批处理的过程,但是它具有自己的命令和语法。dockerfile的命令都是大写的,比如:FROM、RUN等。从上面的dockerfile我们可以大概知道,构建的新镜像都做了什么。

首先,它是基于centos6.7版本来构建的【所有的docker镜像都是基于一个linux系统来的,因为首先它得具备一个完整的运行生态,当然也可以是一个非常精简的linux系统,比如:boot2docker】

其次,它的维护者是Macy,邮箱:five3@163.com
然后,在基础的centos之上,会运行几条RUN后面的命令。包括修改root密码,添加一个five3用户,设置系统的默认编码为utf-8
接着,通过EXPOSE命令对外开发了22和80端口。即ssh端口与WEB端口
最后,CMD命令用于设置镜像运行后的启动命令。这里是默认会启动ssh服务。这样当镜像运行之后我们就可以通过ssh连接该容器了

这里需要注意的是,22、80是容器内部的软件端口,虽然对外部开放了,但是外部需要有一个端口映射;在容器之外要连接这2个端口需要连接外部的映射端口。关于查看外部映射端口可以使用如下命令:
docker port <container ID|container Name> 22
docker port <container ID|container Name> 80

在dockerfile完成之后,我们就可以build自定义的镜像了。具体命令如下:
docker build -t five3/centos:6.7 /path/to/dockerfile
-t :指定要创建的目标镜像名,注意名称只能是小写字母

构建完成之后,可以通过docker images来查看镜像文件,还可以直接运行该镜像:
docker run -t -i five3/centos:6.7 /bin/bash
启动后通过id命令来检查用户five3是否创建成功
id five3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值