通信流程
1.docker通过grpc和containerd模块通信(runc)交换,dockerd和containerd通信的socker文件:/run/containerd/containerd.sock
2.containerd在dockerd启动时被启动,然后containerd启动grpc请求监听,containerd处理grpc请求,根据请求做相应动作。
3.若是创建容器,containerd拉起一个container-shim容器进程,并进行相应的创建操作。
4.container-shim被拉起后,start/exec/create拉起runC进程,通过exit、control文件和containerd通信,通过父子进程关系和SIGCHLD(信号)监控容器中进程状态。
在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件。
镜像下载:
1.从docker仓库将井下下载到本地,命令
#docker pull 仓库服务器:端口/项目名称/镜像名称:tag(版本)号
2.查看镜像名称
#docker images
repository #镜像所属的仓库名称
tag #镜像版本号(标识符),默认为latest
image id #镜像唯一ID标识
CREATED #镜像创建时间
VIRTUAL SIZE #镜像的大小
3.镜像导出
1.#docker save centos -o /opt/centos.tar.gz
2.#docker save centos > /opt/centos.tar.gz
4.镜像导入
1.#docker load -i centos.tar.gz
2.#docker load < centos.tar.gz
5.删除容器
#docker rm -fv <CONTAINER ID>
-f :强制删除
-v:删除数据目录
6:删除镜像
#docker rmi <IMAGE ID>
容器操作的基本命令
#docker run [选项] [镜像名] [shell命令] [参数]
1.容器里面必须有个一长久执行的进程
在容器里面默认不能使用systemd作为PID唯一的守护进程,因为容器里面没有内核(keenel)
在容器里面必须有一个进程可以一直运行下去,这个进程就会被封装为PID为1的守护进程
1.以服务类型的命令
需要镜像有相关的服务,且服务支持前台运行
比如Nginx,daemon off
2.shell命令
tail 命令
3.执行脚本
主要是可以在容器启动的时候执行比较多的操作
可以修改配置文件
可以启动其他服务
在同一个宿主机上,容器的名称是独一无二的不能重复的,而且端口映射也不能重复
2.镜像名称必须在所有的选项后面
-i:标准输入,保持各种输入
-t:分配一个TTY
3.显示正在运行的容器
docker ps
显示所有容器,包括已经关闭的
docker ps -a
容器状态:
1.up:正在运行的容器
2.created:被创建之后由于启动参数错误而没有启动成功的
3.exited:已经推出的或者注销的
4.pause:暂停的容器
4.删除运行中的容器
docker rm -f <CONTAINER ID>
5.随机映射端口:
docker run -P docker.io/nginx #前台启动并随机映射本地端口到容器的80
6.固定端口映射
1.本地端口81映射到容器80端口
docker run -p 81:80 --name nginx-test-port1 nginx
2.本地IP:本地端口:容器端口
docker run -p 192.168.10.205:82:80 --name nginx-test-port2 docker.io/nginx
3.本地IP:本地随机端口:容器端口
docker run -p 192.168.101.205::80 --name nginx-test-port3 docker.io/nginx
4.本地IP:本地端口:容器端口/协议,默认协议为TCP协议
docker run -p 192.168.101.205:83:80/udp --name nginx-test-port4 docker.op/nginx
5.一次性映射多个端口+协议
docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx
7.进入一个容器
1.docker exec -it <容器ID> /bin/bash
2.nsenter方式进入
1.使用inspect工具查询出容器的进程号
docker inspect -f "{{.State.Pid}}" <容器ID>
2.使用nsenter进入容器
nsenter -t <获取到的进程号> -m -u -i -p
3.脚本方式
cat docker-in.sh
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}"${NAME_ID})
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1
8.容器的启动、停止和重启:
在虚拟机里面,我们可以通过重启服务或者重启虚拟机的方式进行配置变更和代码发布,但是,在k8s环境,是禁止通过重启服务或者重启容器来实现配置变更和代码发布。
9.指定容器DNS:
DNS服务默认采用宿主主机的dns地址,一是将dns地址配置在宿主机,二是将参数配置在docker启动脚本里面 -dns=1.1.1.1
docker run -it --rm --dns 223.6.6.6 centos bash
来源:oschina
链接:https://my.oschina.net/u/4363296/blog/4300706