一、CentOS Docker 安装和Docker 安装 CentOS的区别

1、CentOS Docker 安装 = 在 CentOS 系统上装 Docker 引擎(把 Docker 当软件装在 Linux 服务器上)
2、Docker 安装 CentOS = 在 Docker 里跑一个 CentOS 容器(把 CentOS 当 “迷你系统” 在 Docker 里运行)

总结:先在你的系统上装 Docker(CentOS/Windows Docker 安装)
→ 再用 Docker 跑各种软件 / 系统(Docker 安装 CentOS/Spark/MySQL)

二、docker run命令拆解

比如:

docker run centos:7 /bin/echo "Hello world"
1、检查本地有没有 centos:7镜像

Docker 执行:

docker images | findstr centos:7

如果本地有这个镜像 → 直接跳到步骤 3;
如果本地没有 → 自动执行步骤 2。

2、自动从 Docker Hub 拉取 ubuntu:15.10 镜像

Docker 执行:

docker pull centos:7

拉取完成后,镜像会存到本地。

3、用这个镜像创建一个容器

Docker 执行:

docker create centos:7 /bin/echo "Hello world"

给容器分配 ID、文件系统、网络等资源;
此时容器是 “已创建” 状态,还没运行。

4、启动这个容器

Docker 执行:docker start 容器ID
容器开始运行,执行你指定的命令 /bin/echo “Hello world”

5、执行完命令,容器自动停止

因为 /bin/echo 是 “一次性命令”,执行完就结束了,所以容器会自动退出(你用 docker ps -a 能看到这个已停止的容器)

三、docker exec和docker run的区别

1、是否创建新容器

1、docker run -it centos:7 /bin/bash = “从 0 到 1 造一台新电脑,开机并打开窗口”(用镜像创建一个新容器,然后启动它,再进入终端)
2.docker exec -it centos /bin/bash = “在已经开着的电脑上,打开一个新窗口操作”(在已有的、正在运行的容器里执行命令,不能创建新容器)

2、常用场景

run:第一次启动一个服务 / 练手容器
exec:进入后台运行的容器(如 Spark/MySQL)改配置、看日志

3、退出后容器状态

run:用 -it 时,exit 会停止容器
exec:exit 只退出终端,容器还在后台运行

四、参数-itd不同场景的使用细节

docker run -itd 镜像名 /bin/bash

= 「让容器后台一直跑(-d),同时保留交互终端的‘口子’(-it),容器内启动 /bin/bash 但不退出,之后你想用 exec 进去随时能进」这是一个非常实用的 “折中方案”,既解决了「容器要后台跑」的问题,又保留了「随时进去操作」的能力!
(1)-i:保持容器的输入打开(即使没连终端,让 /bin/bash 不会因为 “没输入” 而自动退出)
(2)-t:分配一个伪终端(准备交互窗口,为之后用 exec 进去预留终端能力)
(3)-d:让容器在后台运行,不占当前终端,但 /bin/bash 被 “放在后台有电话、有屏幕的房间里”。
结果:一直保持 Up,不会退出。虽然现在没人连,但电话和屏幕都在,我要一直等,直到有人进来(用 exec 连我)。

1、想进去改配置、跑任务时,用 exec 进去
docker exec -it centos /bin/bash

完美进入容器终端,用完 exit 退出,容器继续后台跑。

2、只用-it或-d情况对比

1、-it

docker run -it centos:7 /bin/bash

(1)-i(Keep stdin open):给 /bin/bash 打开了标准输入(相当于把你的键盘 “连” 到了容器里的 /bin/bash);
(2)-t(Allocate a pseudo-tty):给 /bin/bash 分配了伪终端(相当于把你的 CMD 窗口 “连” 到了容器里的 /bin/bash);
(3)前台运行:你的当前终端直接被 /bin/bash 占用,它能 “看到” 你的输入,也能 “输出” 到你的屏幕。exit 容器就停止,之后也不能再进了。
2、-d

docker run -d centos:7 /bin/bash

-d: 容器立刻 Exited,终端自由,之后也不能再进
原因:/bin/bash 是 “交互式命令”,没有输入就自动结束(启动命令结束,容器就结束)

没有输入就自动结束是什么意思?
/bin/bash 的 “交互式循环、等你输入”,有两个必须满足的前提:
① 它必须绑定一个 “打开的标准输入(stdin)”(比如你的键盘);
② 它必须绑定一个 “终端(tty)”(比如你的屏幕 / CMD 窗口)。
后台运行不加 -i:/bin/bash 的标准输入是关闭的(相当于 “键盘被拔了”,它收不到任何输入),不加-t :/bin/bash 的终端没有(相当于 “屏幕被关了”,它也不需要输出)。你的当前终端和容器完全断开,/bin/bash 被 “扔在后台空房间里”,结果就是没有输入,也没有终端,我不需要等任何人命令,那我执行完初始化就可以下班了。所以它立刻自动退出,容器也跟着 Exited。

3、-it,-itd,-d三种参数对比总结

把 /bin/bash 想象成一个客服:
① -it
= 你坐在客服对面(有 -t 终端),手里拿着话筒(有 -i 输入),客服会一直等你说话,你不说她就等,你说 exit 她才下班。
② -d
= 你把客服扔在一个空房间里,没有话筒(无 -i),没有电话(无 -t),客服喊了两声 “有人吗?”,没人理,她就直接下班了(/bin/bash 退出)。
③ -itd
= 你把客服放在一个有电话、有话筒的后台房间里(有 -it),虽然你现在没打电话,但客服会一直守在电话旁等你(一直 Up),你想找她时,打个电话(用 exec 连)就能说话。

4、只用-d也可以后台运行的原因

以下命令可以后台运行的原因是:因为 Spark 镜像的默认启动命令是「启动 Spark 服务」(长期运行的)

docker run -d bitnami/spark:3.5 -- 命令可以后台运行

(1)核心逻辑:容器的生命周期由什么决定?
容器的生命周期 = 容器启动命令的生命周期
① 启动命令一直跑(比如服务、sleep)→ 容器一直 Up;
② 启动命令执行完就结束(比如 /bin/bash、echo)→ 容器立刻 Exited;
③ -d 只是让容器 “在后台跑”,但不能 “让启动命令变长”。
(2) 容器会不会一直跑总结
① 镜像有没有默认的长期服务?
有(比如 Spark、MySQL、Redis)→ 直接 docker run -d 就能后台一直跑;
没有(比如 CentOS、Ubuntu)→ 必须给它一个 “长期启动命令”(比如 sleep 3600、或者用 -itd)。
② 你指定的启动命令是不是长期的?
是(比如服务、sleep、tail -f)→ 容器一直 Up;
否(比如 /bin/bash、echo)→ 容器立刻 Exited。

更多推荐