Docker 简介

Docker简介

首先说明一些特性:一个容器中只有一个主进程,遵循单一原则,否则一个容器挂了会导致多个进程挂掉;容器其实就是一个进程,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时间限制

posted @ 2024-09-03 23:10  LemHou  阅读(11)  评论(0编辑  收藏  举报