2014年06月10日

Docker之容器管理


本文介绍docker对容器管理的实现

1 背景

本文中涉及的源码基于docker 1.0版本系统。 本文中涉及的测试环境基于ubuntu server 14.04及redhat6.5。

2 概述

容器管理是docker的主要功能之一,包括以下管理功能:

ContainerExport
ContainerCreate
ContainerStop
ContainerRestart
ContainerStart
ContainerKill
ContainerPause
ContainerUnpause
ContainerWait
ContainerResize
ContainerCommit
ContainerDestroy
ContainerCopy
ContainerAttach
ContainerLogs
ContainerChanges
ContainerTop

本文主要介绍一些重要的管理操作,向ContainerExport、ContainerRestart等这种不太重要的暂不介绍。

3 关键数据结构

3.1 Container

type Container struct {
    sync.Mutex
    root   string // Path to the "home" of the container, including metadata.
    basefs string // Path to the graphdriver mountpoint

    ID string

    Created time.Time

    Path string
    Args []string

    Config *runconfig.Config
    State  State
    Image  string

    NetworkSettings *NetworkSettings

    ResolvConfPath string
    HostnamePath   string
    HostsPath      string
    Name           string
    Driver         string
    ExecDriver     string

    command   *execdriver.Command
    stdout    *utils.WriteBroadcaster
    stderr    *utils.WriteBroadcaster
    stdin     io.ReadCloser
    stdinPipe io.WriteCloser

    daemon                   *Daemon
    MountLabel, ProcessLabel string

    waitLock chan struct{}
    Volumes  map[string]string
    // Store rw/ro in a separate structure to preserve reverse-compatibility on-disk.
    // Easier than migrating older container configs :)
    VolumesRW  map[string]bool
    hostConfig *runconfig.HostConfig

    activeLinks map[string]*links.Link
}

4 ContainerCreate

4.1 准备工作

4.2 创建容器

5 ContainerStart

5.1 准备工作

准备环境变量。

5.2 创建容器

6 ContainerStop

7 ContainerKill

8 ContainerParse

最终调用docker使用的execdriver的Parse函数来挂起容器中的进程。关于execdriver请参考Docker之execdriver

9 ContainerCommit

最终是通过cgroup的freezer控制的,即向freezer.state文件中接入FROZEN。