Docker 使用学习笔记

Docker - Build, Ship, and Run Any App, Anywhere

Docker 是什么

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议 开源。

Docker 基于 Linux 内核的 cgroup, namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。

由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker 的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。

Docker 的优点

相比传统的虚拟机(Virtual Machine),Docker 具有以下优点

  • 系统资源占用少
  • 启动速度快
  • 简化配置运行环境
  • 保持运行环境的一致性
  • 更轻松的迁移
  • 更轻松的维护和拓展

Docker 基本概念

Docker 使用客户端 - 服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

镜像(Image)

Docker 镜像是用于创建 Docker 容器的模板。

容器(Container)

容器是独立运行的一个或一组应用。

仓库(Repository)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub 提供了庞大的镜像集合供使用。

或通过国内的镜像仓库下载。

客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。

主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 的安装

Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。

其中企业版包含了一些收费服务,普通开发者一般用不到。使用社区版即可。

Docker CE 的安装请参考官方文档。

安装完成后,运行以下命令,检查是否安装成功

1
2
$ docker --version
Docker version 17.12.0-ce, build c97c6d6

Hello, World

使用 docker run [image] 命令来在容器内运行一个应用程序。

简单实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:97ce6fa4b6cdc0790cda65fe7290b74cfebd9fa0c9b8c38e979330d547d22ce1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu sh

Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

查看镜像与容器

  1. 列出下载到本地的hello-world镜像:

    1
    $ docker image ls
  2. 列出已创建的容器

    1
    2
    3
    $ docker container ls --all
    CONTAINER ID IMAGE COMMAND CREATED STATUS
    9c3729544f4e hello-world "/hello" 10 seconds ago Exited (0) 9 seconds ago

运行说明

  1. Docker run hello-world包含了以下步骤:
    1. 检查本地是否有镜像文件(Image)