+
+### Docker参数说明
+
+```bash
+-d, --detach: 以守护进程方式运行容器
+-p, --publish: 映射容器端口到宿主机端口
+格式: `-p [hostPort]:[containerPort]`
+
+-P(大写):随机端口映射
+
+-v, --volume: 挂载数据卷
+格式: `-v [hostPath]:[containerPath]`
+
+-e, --env: 设置环境变量
+--name: 为容器指定名称
+--network: 指定容器所属网络
+--restart: 容器退出时的重启策略
+可选值: `no`, `on-failure`, `unless-stopped`, `always`
+
+-i, --interactive: 保持标准输入打开
+-t, --tty: 分配一个伪终端
+-u, --user: 指定运行容器的用户
+--entrypoint: 覆盖容器的默认入口点
+--rm: 容器退出后自动删除
+--hostname: 设置容器主机名
+--add-host: 添加自定义主机名到 IP 的映射
+--link: 添加到另一个容器的链接
+--expose: 暴露容器端口
+--volume-driver: 指定数据卷驱动程序
+--cpu-shares: 设置 CPU 权重
+--memory: 设置容器内存限制
+```
+
+# Docker核心技术
+
+## Linux namespace技术
+
+如果一个宿主机运行了N个容器,多个容器带来的以下问题怎么解决:
+
+1. 怎么样保证每个容器都有不同的文件系统并且能互不影响?
+2. 一个docker主进程内的各个容器都是其子进程,那么如何实现同一个主进程下不同类型的子进程?各个子进程间通信能相互访问吗?
+3. 每个容器怎么解决IP以及端口分配的问题?
+4. 多个容器的主机名能一样吗?
+5. 每个容器都要不要有root用户?怎么解决账户重名问题呢?
+
+以上问题怎么解决
+
+Docker 的 Namespace 技术是实现容器隔离的核心机制之一。它通过 Linux Namespace 提供的隔离功能,为每个容器创建独立的资源视图,从而实现容器之间的隔离
+
+**namespace**是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间都部署在核内,**各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核**,各个docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相**互隔离的运行空间**,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:
+
+| 隔离类型 | 功能 | 系统调用参数 | 内核 |
+| -------------------------------------------- | ---------------------------------- | ------------- | ------ |
+| MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
+| IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力 | CLONE_NEWIPC | 2.6.19 |
+| UTS Namespace(UNIX Timesharing System) | 提供主机名隔离能力 | CLONE_NEWUTS | 2.6.19 |
+| PID Namespace(Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
+| Net Namespace(network) | 提供网络隔离能力 | CLONE_NEWNET | 2.6.29 |
+| User Namespace(user) | 提供用户隔离能力 | CLONE_NEWUSER | 3.8 |
+
+### MNT Namespace
+
+每个容器都要有独立的根文件系统有独立的用户空间,以实现容器里面启动服务并且使用容器的运行环境。
+
+- 启动三个容器
+
+```bash
+[root@localhost ~]# docker run -d --name nginx-1 -p 80:80 nginx
+0e72f06bba417073d1d4b2cb53e62c45b75edc699b737e46a157a3249f3a803e
+[root@localhost ~]# docker run -d --name nginx-2 -p 81:80 nginx
+c8ce6a0630b66e260eef16d8ecf48049eed7b893b87459888b634bf0e9e40f23
+[root@localhost ~]# docker run -d --name nginx-3 -p 82:80 nginx
+1cddbd412b5997f8935815c2f588431e100b752595ceaa92b95758ca45179096
+[root@localhost ~]# docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+b42378a51c40 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:82->80/tcp, [::]:82->80/tcp nginx-3
+d30f033c2f29 nginx "/docker-entrypoint.…" 5 seconds ago Up 5 seconds 0.0.0.0:81->80/tcp, [::]:81->80/tcp nginx-2
+d34a012dcebc nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp nginx-1
+```
+
+- 连接进入某一个容器中,并创建一个文件
+
+```bash
+[root@localhost ~]# docker exec -it nginx-1 bash
+root@d34a012dcebc:/# echo 'hello world test!' > /opt/test_nginx-1
+root@d34a012dcebc:/# exit
+```
+
+- 宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里
+
+```bash
+[root@localhost ~]# find / -name test_nginx-1
+/var/lib/docker/overlay2/075b51fb5d33011d4b449fde8c14199c1e30f86224862f68a6116b1cb1dacfdf/diff/opt/test_nginx-1
+/var/lib/docker/overlay2/075b51fb5d33011d4b449fde8c14199c1e30f86224862f68a6116b1cb1dacfdf/merged/opt/test_nginx-1
+```
+
+在 Docker 中,文件系统是通过分层存储机制实现的,这与 Docker 的镜像和容器的架构有关。看到的两个文件路径反映了 Docker 的存储驱动(如 Overlay2)的工作原理。
+
+#### Docker 的存储架构
+
+1. **镜像层(Read-Only)**:
+ - Docker 镜像是由多个只读层组成的。每一层代表了镜像的某个状态或修改。
+ - 这些层是不可变的,一旦创建,不会被修改。
+2. **容器层(Read-Write)**:
+ - 当你运行一个容器时,Docker 会在镜像层之上添加一个可写层。
+ - 容器的所有写操作(如创建文件、修改文件等)都会在这个可写层中进行,而不会影响下面的镜像层。
+
+#### Overlay2 存储驱动
+
+Docker 默认使用 Overlay2 存储驱动(在支持的系统上)。Overlay2 的工作机制如下:
+
+- **`merged` 目录**:
+ - 这是容器的根文件系统,是镜像层和容器层的联合视图。
+ - 当你在容器中访问文件时,看到的是 `merged` 目录中的内容。
+ - 例如,你在容器中创建的文件 `/opt/test_nginx-1`,在宿主机上可以通过 `/var/lib/docker/overlay2/fF+S8vpaS7QnsBh>`wLYtb<6sAKZF*HP3V-FwO8~HZnSke
zfBw~2c6kK4=Z7bM00hap&M~iEljja8Kr2h{5`F-cFb7*@TeE4FiR}~=Ej)yVz yE%Jbu=?KW*KD$hKFmHEo{Q{!_>a!_I&0B4O7#*)pD_?!c V5BNr|%OKhdE&y_t|+-O6V1A4r%~(R>3;6O%{p 07oQNd6w=`#YKfK7y%v9CTiyqLdSgAkRa5$dizBrqGm3gy=6fYanRDK9lpO#LQI@q(>WAu}#g899@IXL8
z853hnbZ{~!AS9$E2yfsh2W9D@0EN68Oy|XX^ym>N;~>ko<;+jE7N-0T1~=kr;hm51
z@jEpXO%`BOdqygXic+s%KRP}+X DX#DEPPH0ikj7nG5QxT5?~ylb^-hZCa%=!u(r$^HeopTrEGD)KNH+b^%{q+BCNMPiW>is>tT
zkM*aIk7(35h+#%}N;G^E2J}ZE?BMC(WDulbs<4g80S4qS36gU2S^B{f#-rG0zMRr@
zPFS=lJCyZ;K}(19O%m!QG270Zro09(%H%`i^=F@p@BtEUeO;i4^-jR~yE}^g_i1gQ
zVL}3kii_(wbJ2(-gQi-KA2Gb$Usp$uyd#1$%E)1qja@?42r4HuI&15+u8|fyVZP&2
zm*?Kuj>UiFL~T8Hv466Bd65bGz6$mm^M(yq$wWMn@E{gNA{K-cMwdDJ#ZiCZ&(@D$
zWToXZhpVDF;v5mo$k!zyf<@YGT8sw`XJ|&DG3`Q$Sws5)wYvKdHZE`VPzhYieGTY`
zoogpXrN9kxaij$qPscA==P8J;33&CS!Fh#~GQBpuO*`><#C8KP%z`vy#ygK}mhd|C
z4RV4@O!NywvZ_#HAP3x%_h7{&Sv-
eg`;B9c=fWZjvT4F#%%Yd
zeFRPr3UfevMMc4@6SU}Q$SqiqqnFn`fV+jds}hM@ZH#Xn{nu|Ov+52u?mom`vUqWs
zxP0_vASBOUD6s1GQ=yb8
>1&ObJgM~V5YElh*u&Gqj;_!>gW-IgUnc8oYYqlMG1S7AFNEZZ)#=#T
zaYjc+Kf=-#R8$WBa`2HyhwK>9=U1fjS`nY;retTw{Qj+&Ur<0xM;Fj+m6nl#nIs=9
z>;<%MPQ8k55Snot@RKenSXp$S~c*-cc`BkCUY*_CnHW
ze%_12u=mUUG6rk-z)s&o5Xp|UUWmN#m89CadeKIT0YXJFzQBFQ5S4)gS<5%Z&6^O{
z=Q!WmaQL>BWTrsr?*23`!&R7tJUla5nb%an#KFr;L>G^Cd3pKKt_U2{)z#HcMx>@6
zKGe=gyD@nLoyt6a{v3Qb