序
本文大多数是新手知识,旨在快速带过一些基础概念。
什么是docker,docker的各个常用命令参数含义
docker help 查看所有docker指令参数含义
docker xxx命令 --help --查看该命令的帮助提示
docker version --查看docker版本
docker info --查看docker信息docker run 镜像 --运行镜像
docker run -it centos /bin/bash --使用bash命令来运行centos镜像
docker run -d 镜像 --后台启动镜像(默认最新版)
docker run logs -tf --tail m 容器ID --打印该容器的后m行日志(包括时间) -f 实时监控 -t 显示日志时间
docker run -d --name 自定义容器名 -p 宿主机端口号:容器内端口号 镜像名 --后台启动容器并映射该容器端口至宿主机端口(自定义容器名可以替代容器ID使用)
docker run -it --rm 镜像 --创建运行对应的镜像容器,用完就将该容器删除(镜像还在)
docker run -d -p 9000:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name dev-portainer portainer/portainer --安装运行portainer
docker run -v 宿主机路径:容器内路径 镜像 --将宿主机路径挂载到容器内路径(数据同步)初始挂载时文件目录和宿主机目录同步,所以注意容器的文件丢失
docker exec -it CentOS容器ID /bin/bash --以交互方式进入正在运行的CentOS容器(通过exit退出后容器依然运行)
docker attach 容器ID --进入正在运行的容器(通过exit退出后容器停止运行)
docker run -d -P --name 自定义容器名 -v 容器路径 镜像名 --匿名挂载example :docker run -d -P --name nginx01 -v /etc/nginx nginx
docker run -d -P --name 自定义容器名 -v 具名:容器路径 镜像名 --具名挂载(具体卷名) example :docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
-P(大写)随机端口映射 :ro 容器内只读(宿主机依然可写可读) :rw 容器内可写可读
docker images --查看最近使用的本地镜像
docker images -a --列出所有的本地镜像的信息
docker images -q --只列出所有的本地镜像的ID
docker image inspect 镜像 --查看该镜像的具体信息docker ps --查看正在运行的镜像
docker ps -a --查看正在运行和历史运行过的镜像(已被卸载的镜像也会显示)或者说是查看目前已安装的所有容器,其实就是本地上的容器
docker ps -n=m --查看正在运行和历史运行过的m个镜像(已被卸载的镜像也会显示)
docker ps -aq | xargs docker rm -f --强制删除所有容器
docker top 容器ID --查看容器中进程信息
docker inspect 容器ID --查看容器具体信息(JSON格式显示)
docker stats --查看容器运行状态(CPU、内存占用情况)docker search 镜像 --在远程仓库中搜索镜像
docker search --filter=STARS=3000 --搜索收藏量大于等于3000的镜像(STARS可以小写)docker pull 镜像 --拉取下载镜像
docker pull 镜像:版本号 --下载对应版本的镜像docker rmi -f 镜像ID --强制删除对应镜像(正在运行的镜像也强制删除)
docker rmi -f $(docker images -aq) --删除所有镜像
docker rmi -f 镜像ID 镜像ID 镜像ID …… --删除指定的多个镜像
docker rm 容器ID --删除指定容器(不能删除正在运行的容器)
docker rm -f $(docker ps -aq) --删除所有容器(包括正在运行的容器)docker start 容器ID --启动该容器
docker restart 容器ID --重新启动该容器
docker stop 容器ID --优雅退出
docker kill 容器ID --强制退出docker volume ls --列出所有挂卷
docker build -f 脚本镜像 -t 镜像名:版本tag 生成镜像的存放路径 --构建镜像
--volumes-from 数据卷容器 --使该容器和该数据卷容器的挂载源目录相同
docker history 镜像名或镜像ID --查看该镜像的历史构建信息
docker login -u dockerhub的用户名 --登录dockerhub
docker tag 源镜像名 用户名/镜像名:版本号 --给该镜像添加标签
docker logout --退出dockerhub登录
docker network ls --列出所有docker网络
docker network create --driver 网络模式 --subnet CIDR地址块 --gateway 网关地址 自定义网络名称 --自定义网络(bridge[默认]、none、host) 注意子网不能和集群内的子网相冲突 example :docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 nettest
docker network inspect 网络名称 --查看对应网络信息
docker network connect 网络名 容器名 --将该容器加入到对应的网络中(一个容器可以有多个IP[网卡])
Ctrl + p + q --容器不停止退出(注意先后顺序)
exit --直接退出容器且容器停止
docker cp 容器ID:容器内的路径 宿主机路径 --将容器内指定路径的文件拷贝到宿主机上
容器间的隔离和命名空间
这里就需要说一个概念,每一个容器其实都是一个进程,不同进程之间拥有隔离和各自的环境。然后与此同时,容器中也运行着大量的进程,想要这些进程和宿主机或者其他容器,就需要进行隔离。
首先是AppArmor
apparmor可以通过定义不同的配置文件来实施控制,这些配置文件可以应用于在主机上运行的进程。这些配置文件可以限制对多种资源的访问,包括文件、网络和 Linux 功能等。
AppArmor 的工作原理是通过为每个受保护的应用程序定义一个特定的安全策略文件(也称为配置文件或配置文件集合),该策略文件描述了应用程序允许的操作和访问权限。这些策略文件通常包括文件系统路径、文件访问权限、网络访问权限等规则。
我们在正常安装了apparmor的机器上输入aa-status即可查看当前apparmor所加载的模块以及载入的配置文件。
aa-status
Cgroups
Cgroups,全称为 Control Groups,是 Linux 内核中的一个功能,用于限制、控制和监视进程组的系统资源使用。Cgroups 允许系统管理员将一组进程(通常是相关的进程,例如同一应用程序的进程)组织在一起,并为这些组中的进程分配特定的资源限制。
使用 Cgroups,管理员可以限制进程组能够使用的 CPU、内存、磁盘、网络带宽等资源量,并监视它们的资源使用情况。这有助于确保系统资源的公平分配,防止某些进程耗尽系统资源导致系统性能下降或崩溃。
命名空间
命名空间是 Linux 内核提供的一种机制,用于隔离系统资源和进程之间的视图,使它们看起来像是在不同的环境中运行,从而实现进程间的隔离和资源的隔离管理。命名空间可以创建多个隔离的环境,每个环境都拥有独立的资源命名空间,使得在同一系统上的不同环境之间的进程、网络、文件系统等资源不会相互干扰。
PID命名空间
它隔离了进程ID也就是PID,在不同PID命名空间中同一个进程可能拥有不同的PID。
Network 命名空间
允许每个命名空间拥有独立的网络设备、IP 地址、路由表、端口等网络资源,使得不同命名空间中的网络配置可以相互隔离。
Mount 命名空间
允许每个命名空间拥有独立的文件系统挂载点和挂载表,使得不同命名空间中的文件系统挂载不会相互影响
IPC命名空间
允许每个命名空间拥有独立的 System V IPC 和 POSIX 消息队列,使得不同命名空间中的进程间通信不会相互干扰。
User 命名空间
允许每个命名空间拥有独立的用户和用户组映射,使得不同命名空间中的用户 ID 和用户组 ID 可以相互隔离。
UTS 命名空间
隔离了主机名,允许不同的 UTS namespace 拥有不同的系统标识。
我们通常可以在机器上输入lsns来查看命名空间
其中NPROCS字段代表目前有多少进程使用这个命名空间
这是我的灯塔nginx服务,可以看到前面type代表不同的命名空间,一般来说会默认使用mnt,uts,ipc,pid,net这几个命名空间
Mount 命名空间
mnt命名空间提供文件系统的隔离,确保进程不会干扰主机或者其他容器的文件。
可以通过ps -fC 进程名 获取进程PID
然后查看mountinfo
ps -fC nginx
cat /proc/$PID/mountinfo
其实还可以看/etc/mtab这个文件,这个文件中也是记录挂载信息的。
cat /etc/mtab
PID命名空间
PID 命名空间允许进程具有主机上运行的其他进程的隔离视图,换句话说可以同一个进程在不同地方拥有不同的标识。
每个 PID 命名空间都会创建一个独立的 PID 树,使得在不同的 PID 命名空间中的进程可以有相同的 PID,但实际上代表的是不同的进程。
比如我们可以输入命令
unshare --pid --fork --mount-proc /bin/bash
这个命令会为我们提供一个新的PID命名空间的bash shell
新旧对比如下:
旧
新
可以看到进程非常少,因为这是新的命名空间,和上面旧的互相隔离。
IPC命名空间
IPC 命名空间,可以将不同容器中的进程组织成独立的通信空间,使得它们之间的 IPC 资源不会发生冲突。这对于容器化环境中的应用程序来说非常重要,因为它们可能会使用 IPC 机制进行进程间通信,如共享内存和消息队列等。
Network命名空间
简单地说就是通过ifconfig工具,查看网络信息。容器与宿主机网络完全是两个独立的网络栈。
UTS命名空间
UTS命名空间就是使相同的进程拥有独立的标识,使主机名,域名互不影响。
就好比假如我们有两个环境
# 在 "docker1" 环境中执行命令
sudo unshare --uts -- sh -c 'hostname docker1; exec bash'
# 在 "docker2" 环境中执行命令
sudo unshare --uts -- sh -c 'hostname docker2; exec bash'
然后此时我通过--uts参数,告诉unshare创建一个新的uts命名空间,此时他们虽然是运行同一个东西,但是互相所在的主机名与域名各不相同。
下一篇:浅谈云安全之docker
参考文章:
https://zhuanlan.zhihu.com/p/622052777
原文始发于微信公众号(Crystal Equation):浅谈云安全之基础知识概览
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论