docker overview

214 阅读4分钟

1. 安装,卸载

2. 概念

2.1 Docker concepts

Docker 是一个供开发者和系统管理员使用容器build, run, and share 应用程序的平台。使用容器来部署应用程序被称为容器化。容器并不是新事物,但其用于轻松部署应用程序却是新事物。

容器化越来越流行是因为:

  • 灵活:即使是最复杂的应用也可以被容器化。
  • 轻量级:容器利用和共享主机内核,使其在系统资源方面比虚拟机更有效。
  • 便携性:本地构建,部署到云端,并在任何地方运行。
  • 松散耦合:容器是高度自给自足和封装的,允许在不影响其他容器的情况下替换或升级一个容器。
  • 可扩展性:可以在整个数据中心内增加并自动分发容器副本。
  • 安全性高:容器对进程施加积极的约束和隔离,用户无需进行任何配置。

2.2 Images and containers

An image is a read-only template with instructions for creating a Docker container; A container is a runnable instance of an image.

从根本上说,容器不过是一个正在运行的进程,为了使它与主机和其他容器隔离,对它施加了一些附加的封装功能。容器隔离最重要的一个方面是,每个容器与自己的私有文件系统交互(这个文件系统由 Docker 镜像提供)。一个镜像包括运行应用程序所需的一切:代码或二进制文件、runtimes、依赖项以及任何其他所需的文件系统对象。

2.3 Containers and virtual machines

容器在 Linux 上原生运行,与其他容器共享主机的内核。它运行的是一个离散的进程,不比任何其他可执行文件占用更多的内存,因此它是轻量级的。

相比之下,虚拟机 (VM) 运行的是一个完整的 "guest" 操作系统,通过管理程序对主机资源进行虚拟访问。一般来说,虚拟机会产生大量的开销,超出你的应用逻辑所消耗的范围。

2.4 Docker architecture

Docker 使用客户端-服务器架构。Docker client 与 Docker daemon 对话,后者负责构建、运行和分发 Docker 容器的重任。Docker 客户端和守护进程可以运行在同一个系统上,或者你可以将 Docker client 连接到远程 Docker daemon。Docker client 和 daemon 使用 REST API,通过 UNIX 套接字或网络接口进行通信。

architecture

2.4.1 The Docker daemon

Docker daemon (dockerd)监听 Docker API 请求,并管理 Docker 对象,如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信,管理Docker服务。

2.4.2 The Docker client

Docker client(docker)是许多 Docker 用户与 Docker 交互的主要方式。当你使用 docker run 等命令时,客户端将这些命令发送给 dockerd 执行。docker 命令使用的是 Docker API,Docker 客户端可以与多个守护进程进行通信。

2.5 Network drivers

  • blog.csdn.net/huanongying…
    docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
      - bridge模式:使用–net =bridge指定,默认设置;
      - host模式:使用–net =host指定;
      - none模式:使用–net =none指定;
      - container模式:使用–net =container:NAMEorID指定。
    

3. 命令

  • docker inspect 查看容器的IP地址

    • 指定容器
      docker inspect 容器名或容器ID | grep IPAddress
      
    • 所有容器
      • docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
        
        或者
      • docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
        

4. 底层技术

Docker 是用 Go 编写的,并利用Linux内核的一些特性来实现其功能。

4.1 Namespaces

Docker 使用 namespaces 来提供名为容器的隔离工作空间,当运行一个容器时,Docker 会为该容器创建一组命名空间。这些命名空间提供了一层隔离。容器的每个方面都运行在一个单独的命名空间中,其访问仅限于该命名空间。

Docker 引擎在 Linux 上使用的命名空间如下:

  • pid namespace: Process isolation (PID: Process ID).
  • net namespace: Managing network interfaces (NET: Networking).
  • ipc namespace: Managing access to IPC resources (IPC: InterProcess Communication).
  • mnt namespace: Managing filesystem mount points (MNT: Mount).
  • uts namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).

4.2 Control groups

Linux 上的 Docker Engine 还依赖于另一种名为控制组(cgroups)的技术。一个 cgroup 将一个应用程序限制在一组特定的资源中。控制组允许 Docker Engine 将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如可限制特定容器的可用内存。

4.3 Union file systems

Union 文件系统,即 UnionFS,是通过创建层来运行的文件系统,使其非常轻量级和快速。Docker Engine 使用 UnionFS 为容器提供构建模块。Docker Engine 可以使用多种 UnionFS 变体,包括 AUFS、btrfs、vfs 和 DeviceMapper。

4.4 Container format

Cocker Engine 将命名空间、控制组和 UnionFS 结合到一个叫做容器格式的封装器中。默认的容器格式是 libcontainer。未来,Docker 可能会通过集成 BSD Jails 或 Solaris Zones 等技术来支持其他容器格式。

5. 参考