Ubuntu下安装Docker,及Docker的一些经常使用命令操做

1.什么是 Docker

        Docker 是一个开源项目,Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案。
        Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做 Docker 的容器就像操做一个快速轻量级的虚拟机同样简单。

2.为何要使用 Docker

        做为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具备众多的优点。首先,docker 容器的启动能够在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上能够同时运行数千个 Docker 容器。linux

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

       对比传统虚拟机总结docker

特性json

容器ubuntu

虚拟机bash

启动 秒级 分钟级
硬盘使用 通常为 MB 通常为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 通常几十个

3.在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
启动docker以后,在终端输入 docker --version 并回车,若是显示出了版本信息,则说明Docker已经安装成功。

4.Docker命令之镜像(image)篇

docker pull 获取镜像

sudo docker pull ubuntu                  这条命令将从docker官方镜像库中获取名为Ubuntu的镜像到本地,命令实际上至关于 $ sudo docker pull registry.hub.docker.com/ubuntu 命令,即从注册服务器registry.hub.docker.com 的仓库下载ubuntu镜像。$ sudo docker pull registry.hub.docker.com/ubunturegistry.hub.docker.com

有时候官方仓库注册服务器下载较慢,能够从其余仓库下载。 从其它仓库下载时须要指定完整的仓库注册服务器地址。例如

$ sudo docker pull dl.dockerpool.com:5000/ubuntu
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 /bin/bash
root@fe7fc4bd8fc9:/#

docker images 列出镜像

$ sudo docker images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB

在列出信息中,能够看到几个字段信息

  • 来自于哪一个仓库,好比 ubuntu
  • 镜像的标记,好比 14.04
  • 它的 ID 号(惟一)
  • 建立时间
  • 镜像大小

其中镜像的 ID 惟一标识了镜像,注意到 ubuntu:14.04 和 ubuntu:trusty 具备相同的镜像 ID,说明它们其实是同一镜像。

TAG 信息用来标记来自同一个仓库的不一样镜像。例如 ubuntu 仓库中有多个镜像,经过 TAG 信息来区分发行版本,例如 10.0412.0412.1013.0414.04 等。例以下面的命令指定使用镜像 ubuntu:14.04 来启动一个容器。

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

若是不指定具体的标记,则默认使用 latest 标记信息。

 

docker commit 建立镜像

先使用下载的镜像启动容器。

$ sudo docker run -t -i ubuntu /bin/bash
root@0b2616b0e5a8:/#

注意:记住容器的 ID,稍后还会用到。

在容器中添加 json 和 gem 两个应用。

root@0b2616b0e5a8:/# gem install json

当结束后,咱们使用 exit 来退出,如今咱们的容器已经被咱们改变了,使用 docker commit 命令来提交更新后的副本。

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 来指定提交的说明信息,跟咱们使用的版本控制工具同样;-a 能够指定更新的用户信息;以后是用来建立镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。建立成功后会返回这个镜像的 ID 信息。

使用 docker images 来查看新建立的镜像。

$ sudo docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
ubuntu              latest   99ec81b80c55  4 weeks ago   266 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB

以后,可使用新的镜像来启动容器

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

docker save 和docker load  导入导出镜像

若是要导出镜像到本地文件,可使用 docker save 命令。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              c4ff7513909d        5 weeks ago         225.4 MB
...
$sudo docker save -o ubuntu.tar ubuntu

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

$ sudo docker load --input ubuntu.tar

$ sudo docker load < ubuntu.tar

这将导入镜像以及其相关的元数据信息(包括标签等)。

docker rmi 移除镜像

$ sudo docker rmi ouruser/sinatra:v2
Untagged: ouruser/sinatra:v2
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

*注意:在删除镜像以前要先用 docker rm 删掉依赖于这个镜像的全部容器。


 

5.Docker命令之容器(container)篇

docker run 启动容器

 

 

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将在终止状态(stopped)的容器从新启动。

由于 Docker 的容器实在过轻量级了,不少时候用户都是随时删除和新建立容器。

新建并启动

所须要的命令主要为 docker run

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

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

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

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

$ sudo docker run -t -i ubuntu /bin/bash
root@af8bae53bdd3:/#

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

在交互模式下,用户能够经过所建立的终端来输入命令,例如

root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

 

更多的时候,须要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,能够经过添加 -d 参数来实现。

例以下面的命令会在后台运行容器。

$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

容器启动后会返回一个惟一的 id,也能够经过 docker ps 命令来查看容器信息。

$ sudo docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu        /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

要获取容器的输出信息,能够经过 docker logs 命令。

$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .

 

当利用 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 stop 来终止一个运行中的容器。

此外,当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容器,用户经过 exit 命令或 Ctrl+d 来退出终端时,所建立的容器马上终止。

终止状态的容器能够用 docker ps -a 命令看到。例如

sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                          PORTSNAMES
ba267838cc1b        ubuntu                   "/bin/bash"            30 minutes ago      Exited (0) About a minute ago   trusting_newton
1e5535038e28        ubuntu                    /bin/sh -c 'while tr  2 minutes ago       Up 1 minute                     insane_babbage

处于终止状态的容器,能够经过 docker start 命令来从新启动。

此外,docker restart 命令会将一个运行态的容器终止,而后再从新启动它。

在使用 -d 参数时,容器启动后会进入后台。 某些时候须要进入容器进行操做,有不少种方法,包括使用docker attach 命令或 nsenter 工具等。

 

docker attach 是Docker自带的命令。下面示例如何使用该命令。

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#

上文已给出实例。

 

docker import 和docker export  导入、导出容器

 

若是要导出本地某个容器,可使用 docker export 命令。

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ sudo docker export 7691a814370e > ubuntu.tar

这样将导出容器快照到本地文件。

可使用 docker import 从容器快照文件中再导入为镜像,例如

$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

此外,也能够经过指定 URL 或者某个目录来导入,例如

$sudo docker import http://example.com/exampleimage.tgz example/imagerepo

*注:用户既可使用 docker load 来导入镜像存储文件到本地镜像库,也可使用 docker import 来导入一个容器快照到本地镜像库。这二者的区别在于容器快照文件将丢弃全部的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时能够从新指定标签等元数据信息。

docker rm 删除容器

可使用 docker rm 来删除一个处于终止状态的容器。 例如

$sudo docker rm  trusting_newton
trusting_newton

若是要删除一个运行中的容器,能够添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

更多命令可在终端输入docker --help 查看。

相关文章
相关标签/搜索