Docker 入门

什么是Docker?

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker通常用于如下场景:

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

Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

查看Docker的版本信息

$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Feb 23 10:40:59 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 Experimental: true

$ docker -v
Docker version 17.03.0-ce, build 60ccb22

Docker镜像

要理解Docker镜像和Docker容器之间的区别,确实不容易。假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。

一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。

Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。要列出本地所有有效的镜像,可以使用命令:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           latest              2d81af9ee904        2 days ago          401 MB

搜索镜像信息

$ docker search wordpress

下载镜像

$ docker pull wordpress

发布镜像

$ docker push yourimage

Docker容器

Docker容器可以使用命令创建:

$ docker run imagename

它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。

当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。

我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。

如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则我们可能会导致损失容器中所有数据的后果。

64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便。

Docker 会为所有已经运行(包括已经停止)的容器随机分配一个唯一的名字和一个唯一的 ID,docker命令可以识别 ID,也可以识别这个名字。

$ docker ps -a
CONTAINER ID                IMAGE               COMMAND                  CREATED             
STATUS                      PORTS               NAMES

9314fc4a3a06                wordpress           "docker-entrypoint..."   14 minutes ago
Exited (0) 14 minutes ago                       nostalgic_williams

ca53613e82df                wordpress           "docker-entrypoint..."   15 minutes ago
Exited (0) 15 minutes ago                       elastic_bhabha

Docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

#docker run有两个参数,第一个是镜像的名称,第二个是要在镜像中运行的命令
$ docker run wordpress echo "hello world!"

在容器中安装新的程序

#使用ubuntu的apt-get命令来安装ping程序
$ docker run learn/tutorial apt-get install -y ping

保存对容器的修改

当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。

  • 运行docker commit,可以查看该命令的参数列表。
  • 你需要指定要提交保存容器的ID。(通过docker ps -l 命令获得)
  • 无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分。
#执行完docker commit命令之后,会返回新版本镜像的id号。
$ docker commit 698 learn/ping

检查运行中的容器

#查看所有正在运行中的容器列表
$ docker ps

#查看更详细的关于某一个容器的信息
$ docker inspect id

Docker清理

删除容器和镜像

images相当于一个模版,而container则是images运行时的的状态。docker对于运行过的image都保留一个状态(container)。可以使用命令docker ps来查看正在运行的container,对于已经退出的container,则可以使用docker ps -a来查看。 如果你退出了一个container而忘记保存其中的数据,你可以使用docker ps -a来找到对应的运行过的container。使用docker commit命令将其保存为image然后运行。

由于image被某个container引用,如果不将这个引用的container销毁(删除),那image肯定是不能被删除。所以想要删除运行过的images必须首先删除它的container。

#删除容器
$ docker rm id

#删除镜像
$ docker rmi id

移除所有的容器和镜像

$ docker kill $(docker ps -q)
$ docker rm $(docker ps -a -q)
$ dockerrmi $(docker images -a -q)

注:shell 中的 $() 和 `` 类似,会先执行这里面的内容,上面的脚本会出现如下 docker kill "pids" ;

docker kill 在 docker 中用于停止容器,docker rm 删除容器, docker rmi 删除镜像

当没有运行的容器或者是根本没有容器的时候,这只会提示一个警告信息。当你想尝试的时候,这就是个非常好的单行命令。如果你仅仅想删除所有的容器,你可以运行如下命令:

$ docker kill $(docker ps -q)
$ docker rm $(docker ps -a -q)

阿里云镜像仓库

阿里云镜像仓库地址:https://dev.aliyun.com/search.html 。登录后进入我的管理中心(triple2002);

我的镜像加速器:https://msopky92.mirror.aliyuncs.com 。账号同aliyun,密码CSDN;

启动 Docker ,设置首选项,添加 Registry Mirrors:「 https://msopky92.mirror.aliyuncs.com

#登录加速器
$ docker login https://msopky92.mirror.aliyuncs.com
Username: triple2002
Password: *********

#获取wordpress镜像
$ docker pull wordpress

#查看本地镜像仓库
$ docker images
#Docker镜像缺省存放位置:Mac OS:/Users/username/.docker/machine/cache?

你需要知道的一些事项

1. Docker 是一种打包和分发软件的方式

一个现代的软件系统包括许多部分,包括二进制文件、库文件、配置文件和依赖性。将这些不同的组件装成一台机器可不是一件容易的事情,但你“出货”这款软件的时候就更加复杂了。一旦你出货了你的软件,你就需要找到一种方式,将所有这些东西打包到一起、把它们放到需要运行的地方。Docker 就是这样一种容器技术,让打包软件以及所有组件之间的依赖性、提供给开发者、分期或者生产、或者发送到需要运行的地方,所有这些变得非常轻松。

2. Docker并不是特别新的技术

Docker 问世只有短短几年时间,但是容器技术已经伴随我们有几十年了。虽然容器在大型机时代很有用处,但是 Docker 现在发挥才能是受很多因素影响的,包括 Linux 日益突出、虚拟化技术的普及、以及云对操作系统重要性的侵蚀。

3. 几乎每个人都提供了 Docker

不管你选择的厂商恰好是谁,几乎这些厂商100%都支持 Docker。从 Amazon Web Services 到 Red Hat,再到 Google,人人都爱 Docker。

4. Docker 并不只是面向 Linux

Docker 扎根于 Docker,但是微软把它发扬光大。或者它一定会如此。Docker 依赖于像 Linux Containers(LXC)这样的 Linux 技术,以及 cgroups 和命名空间功能,这些在 Windows 尚不存在。因此微软正在奋力构建这之间的挂接,使得 Docker 容器也能够运行在 Windows Server 上。微软在 Windows 上运行自己的容器技术已经有多年时间了,但是微软正在扩大范围,也支持 Docker 这个社区标准。

5. Docker 让你分配特定量的 CPU、内存和磁盘资源给每个进程,就像虚拟机

在 Docker 的核心是 Linux cgroups(控制组),提供计算和限制容器使用 CPU、内存、网络、磁盘资源数量的方法。这提供了一些虚拟化的好处,例如能够分配出一台计算机给少量的资源,这样你就不用让一个进程占用所有计算机让其他进程没有资源可用——但是这并不会带来 VMware 那样沉重的开销或者成本。

6. Docker 比启动一个虚拟机快(微秒对分钟)

如果你想要在一台服务器上运行多个任务,那么传统的方法是将其划分为多个虚拟机,使用每个虚拟机来运行一个任务。但是虚拟机启动很慢,因为它们必须启动整个操作系统,这要花上几分钟的时间。而且这会占用大量资源,因为每个虚拟机都需要运行一个完整的操作系统实例。容器则提供了某种类似的行为,但是速度更快一些,因为启动一个容器就像启动一个进程。Docker 的开销也更少——实际上不会多过一个进程。

7. 但是 Docker 不消灭掉虚拟机

Docker 并不是虚拟机的对等替代物,因为它要求你所有的容器共享相同的底层操作系统。这意味着,例如你不能在同一台服务器上同时运行 Windows 和 Linux 应用。而且,随着 Docker 容器脱颖而出,它的安全隔离要弱于虚拟机,这也使得它成为某种多租户的不恰当的选择。

8. Docker 的开发速度相当迅猛

登上 Docker 这趟列车可不像是乘坐蒸汽机,而更像是跳上了日本子弹头火车,它以 250 MPH 的速度向你呼啸而来。考虑到 Docker 只有一年半的 API 已经有了15个修订版本,你会知道它变化地有多快。虽然 Docker“已经成熟,因为它正在成长为一款稳定的、企业值得使用的软件”,但是它仍然没有能持续10年的支持承诺,这通常是企业对他们的软件的期望。

9. Docker 正面临日益激烈的竞争

随着 Docker 越来越受欢迎,它不可避免地要面临竞争。例如,CoreOS 最近发布了一个与之竞争的Docker 运行时间,Rocket 和 Linux 青睐的 Ubuntu 也有自己的 LXD 容器项目。这些和其他竞争似乎都在指责 Docker 封闭的生态系统。在 Docker 的世界,所有都依赖于 Docker 注册。你必须依赖公司的注册表,在你自己的数据中心运行一个 Docker 拷贝,这不是免费的。

10. 你应该谨慎行事

正如对待任何新技术,你可能会在使用 Docker 之间考虑考虑。从技术的角度来看,你应该在逐渐熟悉在 Docker 容器中运行应用的同时考虑哪些该做哪些不该做。但这不仅仅是代码。正如正面所说,Docker 的社区可能并不适合你。你应该加入社区——参加聚会、阅读、并加入到邮件列表中,等等——并决定你是否希望在 Docker 上投入你的时间。

results matching ""

    No results matching ""