首先说明一些特性:一个容器中只有一个主进程,遵循单一原则,否则一个容器挂了会导致多个进程挂掉;容器其实就是一个进程,docker可以管理这些进程。docker能够进行容器隔离,我们操作的其实是docker客户端,而不是server端。
docker info # 查看docker信息
docker基本概念
docker客户端可以操作本地服务器,也可以操纵远程服务器。服务器再去访问注册中心。注册中心有多个镜像仓库,也可以搭建私有镜像仓库。
-
镜像:用于创建docker容器的模板
-
容器:镜像运行的实体,独立运行的一个或多个应用
-
docker machine: 一个简化docker命令行安装的工具,通过一个简单的命令行即可运行。
docker解决的问题:本地环境和生产环境不一致的问题,方便应用快速迁移;应用程序资源使用问题;快速扩展、快速伸缩。容器技术严格上并不是虚拟化,没有客户机操作系统,是共享内核的。
直观感受client请求server
sudo apt install socat
# -v 提高可读性,unix-listen让socket在一个unix套接字上监听,unix-connect让socat连接到docker的unix套接字
socat -v UNIX-LISTEN:/tmp/dockerapi.sock UNIX-CONNECT:/var/run/docker.sock &
docker -H unix:///tmp/dockerapi.sock ps
docker容器隔离机制
Linux命名空间
namespace
用来是内核用来隔离资源的方式,linux
实现了六种不同类型的命名空间。
# fork新的进程,拥有新的命名空间
unshare --fork -m -u -i -n -p -U -C sleep 100
# 查看所有命名空间
lsn --output-all
容器进程命名空间
查看容器进程命名列表
# 启动一个nginx容器
docker run -d --name xsnginx nginx
# pull iamges完成之后
docker images ls # 显示当前安装的镜像
# 获取nginx主进程ID
docker top xsnginx
# 使用主进程ID查看其命名空间
sudo lsns -p <pid> --outpuy-all
可以看到命名空间维持在进程id下。
容器进程命名空间的体现
# 开启容器命名空间的配置
sudo vim /etc/docker/daemon.json
"userns-remap" : "default" # 或者使用"userns-remap" : "user:group"
sudo systemctl restart docker.service
# 查看docker生成的默认用户配置
cat /etc/subuid # 表示宿主机使用dockremap用户,容器使用从属ID,范围为0~65536,与之对应的宿主机ID范围为165536~165536+65536
id <user>
# 运行容器,指定私有cgroupsn,指定user
docker run -d --cgroupns private --user root --name mynginx1 nginx
# 重启容器
docker restart mynginx1
# 以伪终端模式运行一个bash shell -i交互模式运行,-t伪终端
docker exec -it mynginx1 bash
宿主机内查看容器命名空间
容器内查看命名空间
明显可以看出的是,容器有自己的私有命名空间。
UTS命名空间:启动新容器,设置hostname与domain
// -d 指明后台运行容器
docker run -d --domainname abc.nick.com --hostname abcdefg --userns host --name mynginx2 nginx# 进入交互界面
docker exec -it mynginx2 bash
# 查看主机名和域名
hostname
domainname
# 通过hostname和domainname访问应用
curl http://abcdefg
curl http://abcdefg.abc.nick.com
# 通过文件查看hostname和domainname
cat /proc/sys/kernel/hostname
cat /proc/sys/kernel/domainname
容器网络信息
# 运行一个工具容器
docker run -dit --name mycurl radial/busyboxplus:curl
docker exec -it mycurl sh
# mount命名空间
mount
# 网络信息
ifconfig
容器里查看
宿主机查看网络信息
容器控制组cgroup
cgroups
全称是control groups
,整合在了linux
内核当中,把进程放到组中,对组设置权限,对进程进行控制
linux
调度方式
- CFS完全公平调度,在cgropus间按比例分配CPU时间
- RT实时调度,对实时任务使用cpu时间限制