• 容器底层实现技术

  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