Docker 底层技术与端口映射
- 容器底层实现技术
1.cgroup 实现了资源的限额:CPU,内存,硬盘
cgroup使用
docker run -d -m 100M httpd
2.namespace 实现了资源隔离
namespace 实现了容器间资源的隔离
3.unionfs 联合文件系统
- Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User
Mount namespace
Mount namespace 让容器拥有整个文件系统。
UTS namespace
简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。
IPC namespace
IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起
PID namespace
容器在 host 中以进程的形式运行。容器内进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的systemd进程。也就是说:容器拥有自己独立的 PID,这就是 PID namespace 提供的功能。
Network namespace
Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。
ser namespace
User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
- 端口映射
把容器的端口映射为宿主机的一个随机或者特定端口
端口映射实现了外部网络访问容器内部服务
本质是在底层做了ipables地址转发
1.容器端口映射为宿主机的一个随机端口
2.容器端口映射为宿主机的一个特定端口
3.容器端口映射为宿主机的一个特定网卡上的随机端口
4.容器端口映射为宿主机的一个特定网卡上的特定端口
选项: 端口映射 -p -P -P 随机映射端口 -p 指定特定端口
注意:启动一个容器时候可以使用多个 -p 映射多个端口
例子1:随机映射 -P #-P是把容器内的所有端口随机映射为宿主机的随机端口
docker run -d -P httpd
例子2:特定映射,映射为宿主机的特定端口
docker run -d -p 81:80 httpd #注意-p后面顺序 宿主机端口:容器端口
例子3:特定映射,映射为宿主机的特定网卡的随机端口
docker run -d -p 192.168.64.5::80 httpd
例子4:特定映射,映射为宿主机的特定网卡的特定端口 -p
docker run -d -p 192.168.64.5:82:80 httpd