回音壁


一切爆发都有片刻的宁静/一切死亡都有冗长的回声


dockerAPI

docker api 是直接通过请求docker darmon来与docker交互,即docker命令的底层实现

https://blog.csdn.net/qq_29999343/article/details/78294604

docker 配置文件位置 /etc/docker/daemon.json

启动daemon
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:5678

1 获取镜像列表

docker命令 docker images
endpoint get /images/json
curl -XGET http://localhost:5678/images/json | python -mjson.tool

2 拷贝容器中的文件

docker命令 docker cp
endpoint post /containers/containerid/copy
curl -k -X POST http://localhost:5678/containers/3dede0a58623/copy -H “Content-Type: application/json” -d ‘{“Resource”:”/dockerapifile”}’ > cpfile

3 使用Dockerfile构建镜像

docker命令 docker build
endpoint post /build
curl -v -XPOST -H “Content-Type: application/tar” –data-binary @Dockerfile.tar http://localhost:5678/build?t=myimage:mytag

4 重新给镜像命名

docker命令 docker tag
endpoint post /images/name/tag
curl -XPOST http://localhost:5678/images/myimage:mytag/tag?repo=myimage

删除容器 docker rm containerid
删除镜像 docker rmi image

5 创建容器

docker命令 docker create
endpoint post /containers/create
curl -XPOPST -H “Content-Type: application/json” http://localhost:5678/containers/create -d ‘{
“Hostname”:”cybertan”,
“User”:”root”,
“Image”:”myimage”}’

6 运行容器

docker命令 docker start
endpoint post /containers/id/start
curl -XPOST http://localhost:5678/containers/9ba220effbb4/start

7 查看容器

docker命令 docker inspect
endpoint get /containers/id/json
curl -s -XGET http://localhost:5678/containers/9ba220effbb4/json | python -mjson.tool

8 打开容器log

docker命令 docker logs
endppoint get /containers/id/logs
curl -XGET http://localhost:5678/containers/9ba220effbb4/logs?stderr=1&stdout=1

namespace 6项隔离

UTS CLONE_NEWUTS 主机名与域名
IPC CLONE_NEWIPC 共享内存
PID CLONE_NEWPID 进程号
NETWORK 网络
MOUNT CLONE_NEWNS 挂载点
USER CLONE_NEWUSER 用户与用户组

namespce API

clone()在创建新进程的同时创建namespace
setns()加入一个已存在的namespace
unshare()在原先进程上进行namespace隔离
fork()调用

docker daemon的server启动和初始化在1.6版本之前使用了一种复杂的job机制并依赖专门的docker engine来管理和运行这些job 1.7版本之后使用新的server初始化流程,server会与daemon对象绑定来接收并处理完成client请求

1
2
3
4
5
6
7
8
9
10
11
12
/var/lib/docker/
\-aufs #aufs驱动工作的目录
\-diff #aufs文件系统的所有层的存储目录
\-layer #存储aufs层之间关系等元数据
\-mnt #aufs文件系统挂载点
\-containers #容器配置文件目录
\-image/aufs #存储镜像和镜像层信息
\-imagedb #存储所有镜像的元数据
\-layerdb #存储镜像层和容器层的元数据
\-repositories.json #镜像仓库中所有镜像的源和tag
\-distribution
\-volumes #存放volumes数据和元数据

UFS创建容器文件系统的过程

启动容器的时候:
1创建只读层(busybox)
2创建容器读写层(writeLayer)
3创建挂载点(mnt)并把只读层和读写层挂载到挂载点
4将挂载点作为容器根目录

容器退出的时候:
1卸载挂载点(mnt)的文件系统
2删除挂载点
3删除读写层(writeLayer)

docker exec 进入容器实现

基于setns系统调用可以根据提供的PID再次进入指定Namespace
go每启动一个程序都会进入多线程状态这使得Mount Namespace无法使用setns
使用Cgo调用C
go标准库中没有c的包,Cgo会创建一个特殊的命名空间与C命名空间交流
使用构造函数导入C模块在go运行环境启动之前执行

Deamon命令

Deamon网络配置:
Deamon有三种途径实现监听:

  • 通过socket文件 /var/runDocker.socket
  • 通过tcp协议
  • 通过fd文件

Deamon存储驱动配置:

  • AUFS,Devicemapper,btrfs,zfs,overlay

Deamon执行驱动配置:

  • cgroups,systemd

获取容器内部信息有三个参数:attach logs enevts

docker三剑客

docker-machine用于在多节点安装docker服务
docker-compose用于自动部署容器
docker-swarm用于管理集群

golang官方提供的flag.Parse()包可以完成参数解析
docker attach挂载命令行到容器中主要实现IO流共享绑定