docker安装及使用

来源:互联网 发布:小型货车出租软件 编辑:程序博客网 时间:2024/06/05 10:07

Docker —— 从入门到实践

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone App)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

Docker 是个伟大的项目,它彻底释放了虚拟化的威力,极大降低了云计算资源供应的成本,同时让应用的分发、测试、部署和分发都变得前所未有的高效和轻松!

适用人群

本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。

学习前提

学习本书前,需要你对 Linux 系统有一定的了解,此外,本书注重实践,所以需要读者能够自己搭建 Linux 环境。

docker简介

什么是 Docker

Docker 是一个开源项目,诞生于 2013年初,最初是 dotCloud公司内部的一个业余项目。它基于 Google公司推出的 Go语言实现。 项目后来加入了 Linux基金会,遵从了 Apache 2.0协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud公司后来都改名为 Docker IncRedhat已经在其 RHEL6.5中集中支持 DockerGoogle也在其 PaaS产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker的基础是 Linux容器(LXC)等技术。

LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

为什么要使用 Docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10个不同的应用就要起 10个虚拟机,而Docker只需要启动 10个隔离的应用即可。

具体说来,Docker 在如下几个方面具有较大的优势。

更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

对比传统虚拟机总结

特性

容器

虚拟机

启动

秒级

分钟级

硬盘使用

一般为 MB

一般为 GB

性能

接近原生

弱于

系统支持量

单机支持上千个容器

一般几十个

Docker基本概念

镜像

Docker 包括三个基本概念

· 镜像(Image

· 容器(Container

· 仓库(Repository

理解了这三个概念,就理解了 Docker 的整个生命周期。

Docker 镜像

Docker 镜像就是一个只读的模板。

例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

镜像可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

Docker 容器

Docker 利用容器来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。

当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull下来就可以了。

Docker安装

Ubuntu 系列安装 Docker

通过系统自带包安装

Ubuntu 14.04 版本系统中已经自带了 Docker包,可以直接安装。

$ sudo apt-get update

$ sudo apt-get install -y docker.io

$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

如果使用操作系统自带包安装 Docker,目前安装的版本是比较旧的0.9.1。 要安装更新的版本,可以通过使用Docker 源的方式。

通过Docker源安装最新版本

要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。

$ sudo apt-get install apt-transport-https

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"

$ sudo apt-get update

$ sudo apt-get install lxc-docker

14.04 之前版本

如果是较低版本的 Ubuntu 系统,需要先更新内核。

$ sudo apt-get update

$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring

$ sudo reboot

然后重复上面的步骤即可。

安装之后启动 Docker 服务。

$ sudo service docker start

CentOS 系列安装 Docker

Docker 支持 CentOS6及以后的版本。

 

CentOS6

对于 CentOS6,可以使用EPEL 库安装 Docker,命令如下

$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

$ sudo yum install docker-io

 

CentOS7

CentOS7 系统 CentOS-Extras库中已带 Docker,可以直接安装:

$ sudo yum install docker

安装之后启动 Docker 服务,并让它随系统启动自动加载。

$ sudo service docker start

$ sudo chkconfig docker on

Docker镜像

获取镜像

在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。

Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会从镜像仓库下载(默认是 Docker Hub公共注册服务器中的仓库)。

本章将介绍更多关于镜像的内容,包括:

· 从仓库获取镜像;

· 管理本地主机上的镜像;

· 介绍镜像实现的基本原理。

可以使用 docker pull 命令来从仓库获取所需要的镜像。

下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。

$ sudo docker pull ubuntu:12.04

Pulling repository ubuntu

ab8e2728644c: Pulling dependent layers

511136ea3c5a: Download complete

5f0ffaa9455e: Download complete

a300658979be: Download complete

904483ae0c30: Download complete

ffdaafd1ca50: Download complete

d047ae21eeaf: Download complete

下载过程中,会输出获取镜像的每一层信息。

该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。

有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。从其它仓库下载时需要指定完整的仓库注册服务器地址。例如

$ docker pull daocloud.io/java:8 /bin/bash

$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

Pulling dl.dockerpool.com:5000/ubuntu

ab8e2728644c: Pulling dependent layers

511136ea3c5a: Download complete

5f0ffaa9455e: Download complete

a300658979be: Download complete

904483ae0c30: Download complete

ffdaafd1ca50: Download complete

d047ae21eeaf: Download complete

完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash应用。

$ sudo docker run -t -i ubuntu:12.04 /bin/bash

root@fe7fc4bd8fc9:/#

退出容器:

Ctrl+d

镜像列表

$ docker images

创建

下载最新的tomcat

$ sudo docker pull daocloud.io/tomcat:latest /bin/bash

存出和载入镜像

存出镜像

如果要导出镜像到本地文件,可以使用 docker save 命令。

$ sudo docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

ubuntu              14.04               c4ff7513909d        5 weeks ago         225.4 MB

...

$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

载入镜像

可以使用 docker load 从导出的本地文件中再导入到本地镜像库,例如

$ sudo docker load --input ubuntu_14.04.tar

$ sudo docker load < ubuntu_14.04.tar

移除

如果要移除本地的镜像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。

$ sudo docker rmi training/sinatra

Untagged: training/sinatra:latest

Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d

Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f

Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

 

 

Docker容器

启动

容器是 Docker 又一核心概念。

简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

新建并启动

所需要的命令主要为 docker run

例如,下面的命令输出一个 “Hello World”,之后终止容器。

$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'

Hello world

这跟在本地直接执行 /bin/echo 'hello world' 几乎感觉不出任何区别。

下面的命令则启动一个 bash 终端,允许用户进行交互。

$ sudo docker run -t -i ubuntu:14.04 /bin/bash

root@af8bae53bdd3:/#

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开。

在交互模式下,用户可以通过所创建的终端来输入命令,例如

root@af8bae53bdd3:/# pwd

/

root@af8bae53bdd3:/# ls

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

当利用 docker run 来创建容器时,Docker在后台运行的标准操作包括:

· 检查本地是否存在指定的镜像,不存在就从公有仓库下载

· 利用镜像创建并启动一个容器

· 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

· 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

· 从地址池配置一个 ip 地址给容器

· 执行用户指定的应用程序

· 执行完毕后容器被终止

启动已终止容器

可以利用 docker start 命令,直接将一个已经终止的容器启动运行。

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps  top 来查看进程信息。

root@ba267838cc1b:/# ps

  PID TTY          TIME CMD

    1 ?        00:00:00 bash

   11 ?        00:00:00 ps

可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。

守护态运行

$ docker ps

进入容器

$ docker run -it tomcat:8 /bin/bash

 

删除

$sudo docker rm  -f 4343214214a

 

 

Docker常用命令

 

下载镜像:# docker pull daocloud.io/tomcat:8 /bin/bash

镜像列表:#docker images

镜像存出:#docker save -o /home/youedata/java_8.tar daocloude.io/java:8

载入镜像:#docker load --input /home/youedata/java_8.tar

删除镜像:# docker rmi  123213sdad

容器列表:#docker ps -a

启动容器:使用文件启动 docker-compose up -d  

               手动启动单个容器 docker run -it daocloud.io/tomcat:8 /bin/bash

           进入某个容器 docker exec -it 83999a388340 /bin/bash

删除容器:docker rm 83999a388340

容器项目日志:docker logs -f 83999a388340