container

package
v0.0.0-...-be3b871 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 7, 2021 License: MIT Imports: 12 Imported by: 0

Documentation

Index

Constants

View Source
const (
	StatusRunning string = "running"
	StatusStopped string = "stopped"
	StatusExit    string = "exit"
)
View Source
const (
	DefaultInfoLocation string = "/var/run/ddocker/"
	ConfigName          string = "config.json"
	StdLogFileName      string = "std.log"
)

Variables

View Source
var (
	RootURL       = "/root/"
	MntURL        = "/root/mnt/%s"
	WriteLayerURL = "/root/writeLayer/%s"

	// overlay use it
	WorkDirURL = "/root/work"
)

Functions

func DeleteContainerInfo

func DeleteContainerInfo(containerID string)

DeleteContainerInfo

func DeleteWorkSpace

func DeleteWorkSpace(containerID, volume string)

DeleteWorkSpace .

func NewParentProcess

func NewParentProcess(tty bool, cid, volume, image string, envs []string) (*exec.Cmd, *os.File)

NewParentProcess 这里是父进程(当前进程执行的内容) 1. 在/proc/self/exe的调用中, /proc/self/指的就是当前进程自己的环境, exec其实就是自己调用了自己。init和command参数是传递给本进程的。 2. 后面args是参数,其中init是传给本进程的第一个参数。简而言之, 先调用init, 即调用initCommand去执行一些环境和资源的初始化操作。

3. 下面指定了一些clone参数去fork新进程,并使用namespace隔离新创建的进程和外部环境。 4. 如果用指定了-it参数,就需要把进程的输入输出导入到标准的输入输出

func NewPipe

func NewPipe() (*os.File, *os.File, error)

NewPipe .

func NewWorkSpace

func NewWorkSpace(containerID, volume, image string)

NewWorkSpace creates a workspace

func RecordContainerInfo

func RecordContainerInfo(cpid int, commandArr []string, id, name, volume string) (string, error)

RecordContainerInfo

func RedirectContainerLog

func RedirectContainerLog(containerID string) *os.File

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 .

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL