Documentation ¶
Index ¶
- Constants
- Variables
- func DeleteContainerInfo(containerID string)
- func DeleteWorkSpace(containerID, volume string)
- func NewParentProcess(tty bool, cid, volume, image string, envs []string) (*exec.Cmd, *os.File)
- func NewPipe() (*os.File, *os.File, error)
- func NewWorkSpace(containerID, volume, image string)
- func RecordContainerInfo(cpid int, commandArr []string, id, name, volume string) (string, error)
- func RedirectContainerLog(containerID string) *os.File
- func RunContainerInitProcess() error
- type ContainerInfo
Constants ¶
const ( StatusRunning string = "running" StatusStopped string = "stopped" StatusExit string = "exit" )
const ( DefaultInfoLocation string = "/var/run/ddocker/" ConfigName string = "config.json" StdLogFileName string = "std.log" )
Variables ¶
var ( RootURL = "/root/" MntURL = "/root/mnt/%s" WriteLayerURL = "/root/writeLayer/%s" // overlay use it WorkDirURL = "/root/work" )
Functions ¶
func NewParentProcess ¶
NewParentProcess 这里是父进程(当前进程执行的内容) 1. 在/proc/self/exe的调用中, /proc/self/指的就是当前进程自己的环境, exec其实就是自己调用了自己。init和command参数是传递给本进程的。 2. 后面args是参数,其中init是传给本进程的第一个参数。简而言之, 先调用init, 即调用initCommand去执行一些环境和资源的初始化操作。
3. 下面指定了一些clone参数去fork新进程,并使用namespace隔离新创建的进程和外部环境。 4. 如果用指定了-it参数,就需要把进程的输入输出导入到标准的输入输出
func NewWorkSpace ¶
func NewWorkSpace(containerID, volume, image string)
NewWorkSpace creates a workspace
func RecordContainerInfo ¶
RecordContainerInfo
func RedirectContainerLog ¶
RedirectContainerLog
func RunContainerInitProcess ¶
func RunContainerInitProcess() error
RunContainerInitProcess 是在容器内部执行的,也就是说代码执行到这里后, 容器所在的进程其实就已经创建完成了,这是本容器执行的第一个进程。
syscall.Exec()最终调用了kernel的int execve(const char* filename, char* const argv[], char* const emvp[]) 这个系统调用完成了初始化动作并将用户进程运行起来的动作, 在前面的代码中,容器的第一个进程是init初始化的进程,我们希望是我们自己的进程。但是PID=1的进程是不能kill的, 这个系统调用的作用就是,将原来的init进程替换成用户自己的进程,这样当进入容器的时候,PID=1的程序就是我们指定的进程了。 容器 === 进程。这其实也是目前docker使用容器引擎runC的实现方式之一
Types ¶
type ContainerInfo ¶
type ContainerInfo struct { PID string `json:"pid"` // 容器的 init 进程在宿主机上的 PID ID string `json:"id"` // 容器 ID Name string `json:"name"` // 容器名 Command string `json:"command"` // 容器内 init 运行命令 CreatedTime string `json:"create_time"` // 创建时间 Status string `json:"status"` // 容器的状态 Volume string `json:"volume"` // 容器的数据卷 PortMapping []string `json:"portmapping"` // 容器的端口映射 }
ContainerInfo .