作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况
Docker基本命令
Dockerfile
Docker镜像
Docker仓库
Docker原理
Docker网络&存储&日志
Docker-Compose
Docker番外篇(本小节属于)
经过上小节的介绍,我们知道在docker里面同时存在docker进程和containerd进程,那他们之间的关系是咋样的呢?这个在不同的版本里面是否有区别呢?
版本:1.13.1
containerd是作为docker进程的子进程存在的。
root 9800 1 0 09:30 ? 00:00:12 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
root 9805 9800 0 09:30 ? 00:00:07 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
版本:26.1.4
docker的进程和containerd的进程完全独立。
#docker进程
root 3685 1 0 Dec16 ? 00:00:08 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#containerd进程
root 1217 1 0 Nov18 ? 00:22:05 /usr/bin/containerd
也就是早期的版本创建容器是属于进程内部通信,也就无法实现docker和containerd拆分,后期的版本进程独立,是可以进行拆分的。
修改日志级别
vi /usr/lib/systemd/system/docker.service
#启动参数里面添加一个-D 就等于打开debug模式
/usr/bin/dockerd -D
#重启docker服务
systemctl daemon-reload
systemctl restart docker
vi /usr/lib/systemd/system/containerd.service
#启动参数里面添加一个-l debug
/usr/bin/containerd -l debug
#重启containerd
systemctl daemon-reload
systemctl restart containerd
创建容器日志
Dec 17 21:07:05 localhost.localdomain dockerd[5897]: time="2024-12-17T21:07:05.006119085+08:00" level=debug msg="Calling POST /v1.45/containers/create" spanID=cf4c8f28ee2e1af0 traceID=e4e0a173a0f18d229da43966bed8eabd
Dec 17 21:07:05 localhost.localdomain dockerd[5897]: time="2024-12-17T21:07:05.006239380+08:00" level=debug msg="form data: {\"AttachStderr\":false,\"AttachStdin\":false,\"AttachStdout\":false,\"Cmd\":null,\"Domainname\":\"\",\"Entrypoint\":null,\"Env\":null,\"HostConfig\":{\"AutoRemove\":false,\"Binds\":null,\"BlkioDeviceReadBps\":[],\"BlkioDeviceReadIOps\":[],\"BlkioDeviceWriteBps\":[],\"BlkioDeviceWriteIOps\":[],\"BlkioWeight\":0,\"BlkioWeightDevice\":[],\"CapAdd\":null,\"CapDrop\":null,\"Cgroup\":\"\",\"CgroupParent\":\"\",\"CgroupnsMode\":\"\",\"ConsoleSize\":[26,142],\"ContainerIDFile\":\"\",\"CpuCount\":0,\"CpuPercent\":0,\"CpuPeriod\":0,\"CpuQuota\":0,\"CpuRealtimePeriod\":0,\"CpuRealtimeRuntime\":0,\"CpuShares\":0,\"CpusetCpus\":\"\",\"CpusetMems\":\"\",\"DeviceCgroupRules\":null,\"DeviceRequests\":null,\"Devices\":[],\"Dns\":[],\"DnsOptions\":[],\"DnsSearch\":[],\"ExtraHosts\":null,\"GroupAdd\":null,\"IOMaximumBandwidth\":0,\"IOMaximumIOps\":0,\"IpcMode\":\"\",\"Isolation\":\"\",\"Links\":null,\"LogConfig\":{\"Config\":{},\"Type\":\"\"},\"MaskedPaths\":null,\"Memory\":0,\"MemoryReservation\":0,\"MemorySwap\":0,\"MemorySwappiness\":-1,\"NanoCpus\":0,\"NetworkMode\":\"default\",\"OomKillDisable\":false,\"OomScoreAdj\":0,\"PidMode\":\"\",\"PidsLimit\":0,\"PortBindings\":{},\"Privileged\":false,\"PublishAllPorts\":false,\"ReadonlyPaths\":null,\"ReadonlyRootfs\":false,\"RestartPolicy\":{\"MaximumRetryCount\":0,\"Name\":\"no\"},\"SecurityOpt\":null,\"ShmSize\":0,\"UTSMode\":\"\",\"Ulimits\":[],\"UsernsMode\":\"\",\"VolumeDriver\":\"\",\"VolumesFrom\":null},\"Hostname\":\"\",\"Image\":\"192.168.31.43:5000/nginx\",\"Labels\":{},\"NetworkingConfig\":{\"EndpointsConfig\":{\"default\":{\"Aliases\":null,\"DNSNames\":null,\"DriverOpts\":null,\"EndpointID\":\"\",\"Gateway\":\"\",\"GlobalIPv6Address\":\"\",\"GlobalIPv6PrefixLen\":0,\"IPAMConfig\":null,\"IPAddress\":\"\",\"IPPrefixLen\":0,\"IPv6Gateway\":\"\",\"Links\":null,\"MacAddress\":\"\",\"NetworkID\":\"\"}}},\"OnBuild\":null,\"OpenStdin\":false,\"StdinOnce\":false,\"Tty\":false,\"User\":\"\",\"Volumes\":{},\"WorkingDir\":\"\"}" spanID=cf4c8f28ee2e1af0 traceID=e4e0a173a0f18d229da43966bed8eabd
#先创建后启动
Dec 17 21:07:05 localhost.localdomain dockerd[5897]: time="2024-12-17T21:07:05.137182808+08:00" level=debug msg=event module=libcontainerd namespace=moby topic=/tasks/create
Dec 17 21:07:05 localhost.localdomain dockerd[5897]: time="2024-12-17T21:07:05.144851289+08:00" level=debug msg=event module=libcontainerd namespace=moby topic=/tasks/start
Dec 17 21:15:09 localhost.localdomain containerd[6708]: time="2024-12-17T15:15:09.186546049+08:00" level=info msg="starting signal loop" namespace=moby path=/run/containerd/io.containerd.runtime.v2.task/moby/cfd40170fb295e15abbbb84c4e4997974f0b573049efa0856cfcaa8e07e01869 pid=6832 runtime=io.containerd.runc.v2
每个容器的都是一个独立/usr/bin/containerd-shim-runc-v2 进程,这个进程同docker和containerd进程都没有从属关系。
每个容器的真实业务进程就是/usr/bin/containerd-shim-runc-v2进程的子进程。
管理进程和业务进程各自独立,这样我们就可以操作在不影响业务容器的情况下对上层控制组件进行升级。
创建容器流程
1.docker命令-->dockerd进程-->containerd进程-->runc命令
2.runc将容器创建成功以后,就会退出,然后由shim-runc来负责接管。
Dec 17 23:57:16 localhost.localdomain containerd[7337]: time="2024-12-17T23:57:16.797745220+08:00" level=info msg="loading plugin \"io.containerd.event.v1.publisher\"..." runtime=io.containerd.runc.v2 type=io.containerd.event.v1
Dec 17 23:57:16 localhost.localdomain containerd[7337]: time="2024-12-17T23:57:16.797825711+08:00" level=info msg="loading plugin \"io.containerd.internal.v1.shutdown\"..." runtime=io.containerd.runc.v2 type=io.containerd.internal.v1
Dec 17 23:57:16 localhost.localdomain containerd[7337]: time="2024-12-17T23:57:16.797840238+08:00" level=info msg="loading plugin \"io.containerd.ttrpc.v1.task\"..." runtime=io.containerd.runc.v2 type=io.containerd.ttrpc.v1
Dec 17 23:57:16 localhost.localdomain containerd[7337]: time="2024-12-17T23:57:16.797890713+08:00" level=debug msg="registering ttrpc service" id=io.containerd.ttrpc.v1.task
Dec 17 23:57:16 localhost.localdomain containerd[7337]: time="2024-12-17T23:57:16.797969870+08:00" level=debug msg="serving api on socket" socket="[inherited from parent]"
Dec 17 23:57:16 localhost.localdomain containerd[7337]: time="2024-12-17T23:57:16.797983085+08:00" level=info msg="starting signal loop" namespace=moby path=/run/containerd/io.containerd.runtime.v2.task/moby/9ab56f84f70ede4d5a4bc8a11a39d90eae0b2c7573689248af170bda4d6b164e pid=7471 runtime=io.containerd.runc.v2
3.删除停止容器也是一样的道理。