一、介绍
Docker 是一个开源平台,用于开发、传输和运行应用程序。它允许开发者将应用程序及其所有依赖打包到一个名为 容器(Container) 的轻量级、可移植的封装中。通过这种方式,应用程序可以在任何环境中一致地运行。
总结:开源容器平台,将应用程序和依赖打包,封装。使程序任何环境中一致性运行。
特点:轻量级、可移植、秒即启动

对比场景:
虚拟机:在一台物理服务器上同时运行 Windows 10 和 Ubuntu 20.04 两个虚拟机,每个系统需分配独立的 CPU、内存和存储资源。【硬件级虚拟化】硬盘,cpu、内存划分模拟为虚拟机一部分
docker:在同一台 Linux 服务器上运行 Nginx 和 MySQL 容器,两者共享宿主机的内核,但拥有独立的文件系统和网络配置【操作系统级虚拟化 】共享宿主机操作系统内核
| 维度 | 操作系统级虚拟化(Docker) | 硬件级虚拟化(VM) |
|---|---|---|
| 隔离层级 | 进程级隔离(共享内核) | 硬件级隔离(独立内核) |
| 资源占用 | 仅需应用依赖,MB 级存储 | 需完整 OS,GB 级存储 |
| 启动速度 | 秒级启动 | 分钟级启动 |
概念理解:
Docker 是一个容器化平台,容器本质上是一个轻量级的、可执行的应用程序包,它包含了运行某个应用所需的所有依赖、库、配置文件和环境。每个 Docker 容器都基于 Docker 镜像
- 镜像(Image) 是静态的,是创建容器的模板,包含了应用和它运行所需的所有内容。
- 容器(Container) 是镜像的一个实例,是一个运行中的应用。
Docker 是否需要安装 JDK、Tomcat、MySQL、Nginx 等?
Docker 的核心优势之一就是它的隔离性 和一致性 。因此,如果你已经有了一个容器化的环境(如一个用于 Web 项目的容器),你不需要在宿主机上安装 JDK、Tomcat、MySQL、Nginx 等这些工具或服务。相反,通常每个服务(例如,JDK、Tomcat、MySQL、Nginx 等)会被容器化,并在 Docker 容器中运行。
所以,你确实需要使用适当的 Docker 镜像来安装这些服务,但这些服务将运行在独立的容器中,而不是在宿主机上。
先查看Linux版本号,发行版名称等
cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
lsb_release -aLSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.9.2009 (Core)
Release: 7.9.2009
Codename: Core
uname -a 【内核版本信息以及硬件架构(如 32 位或 64 位)】Linux myhost 5.4.0-42-generic #46-Ubuntu SMP Tue Jun 23 10:34:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
5.4.0-42-generic是内核版本 ,x86_64表示 64 位架构
yum -y update 更新CentOs系统上 软件包的命令
rpm -q kernel 查看内核是否更新 【确实有新内核版本,你可以选择重启来使新内核生效】 或者 needs-restarting 【系统需要重启,会提示重启。】
reboot 重启系统 【确保保存所有工作,避免未保存工作丢失】 2 提示时才执行!!!
yum install docker -y 安装 docker CentOS作系统 |Docker 文档
查看docker是否安装成功 docker --version 或者 docker -v
注意:对于41.Linux要求内核3.0以上 2.CentOS 7
命令检测: hostnamectl 可以看到内核版本,系统发行版本
systemctl start docker.service 启动docker
systemctl status docker.service 查看docker状态 【active ------运行状态】
- 常用管理命令
systemctl stop docker.service
systemctl start docker.service
systemctl restart docker.service
systemctl status docker.service
二、运行程序
Docker使用前,习惯性安装协助工具
yum install iproute ftp bind-utils net-tools wget -y # 安装常用工具
其中:
iproute 用来执行 ip addr 查看本机地址
ftp 用来测试ftp 服务器
bind_utils 用来运行 nslookup
net-tools 用来执行 netstate
wget 既是执行 wget的
注意:yum安装时提示:This system is not registered with an entitlement server. You can use subscription-manager
因为你的系统没有与 Red Hat 的订阅管理器注册。这个消息通常出现在基于 RHEL(Red Hat Enterprise Linux)的系统上,而 CentOS 是一个开源的社区驱动的替代版本,不需要注册。
命令cat /etc/os-release 或 hostnamectl 或 lsb_release -a可看 版本,操作系统,内核
禁用即可
vim /etc/yum/pluginconf.d/subscription-manager.conf
enabled=0 #将它禁用掉 将1 改为 0
配置dns
nslookup www.baidu.com 查看配置的域名服务器地址
可见100 开头不在 私网中,还行。否则要改域名服务器地址
怎么修改呢?
vi /etc/resolv.conf 修改里面nameserver 对应的 ip地址
解释:公网和私网的区别:
特性 公网 IP 私网 IP 唯一性 全球唯一,互联网上唯一可访问的地址。 在局域网内唯一,不在全球范围内唯一。 访问方式 任何互联网设备都可以访问。 只能在同一局域网内访问,外部设备无法直接访问。 地址范围 由 IANA 和 ISP 分配,地址有限。 使用保留的地址范围,如 10.x.x.x、192.168.x.x。应用场景 用于公网通信,网站服务器、公共服务等。 用于局域网内部通信,家庭、企业网络中设备连接。 转换方式 不需要转换,直接与外部互联网通信。 需要通过 NAT(网络地址转换)才能与公网通信。
配置镜像加速
想想你学习的maven,干嘛配置连接地址?不都是为了加速,快捷,方便吗
1.vim /etc/docker/daemon.json # 原来 里面只有 {} 这对大括号
- sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"], # 你配置镜像加速地址
"insecure-registries": ["myregistry.example.com"] # Docker 只允许通过 HTTPS 与仓库通信。如果你有一个私有仓库只支持 HTTP 连接,可以通过
insecure-registries配置来让 Docker 允许 HTTP 协议的连接}
EOF
sudo systemctl daemon-reload # 加载新的配置文件
sudo systemctl restart docker # 重启docker
注意:系统级操作 你的账号权限不大,命令前加 sudo -- 以超级用户(root)身份执行命令
**5.**tail /etc/docker/daemon.json 查看是否生效
或者 用此命令
bashyum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
部署一个测试版本 简单模拟
假设镜像加速地址 你自己的阿里 或 腾讯云 、华为 地址,又或者 大部分公开加速器(如阿里云、网易云等)
常用的加速器有:
- 阿里云 :https://cr.console.aliyun.com/
- Docker 中国官方镜像 :https://www.docker-cn.com/registry-mirror
- 腾讯云: 腾讯云 产业智变·云启未来 - 腾讯
举个例子,假设你要部署一个简单的 Node.js 应用。【从拉取镜像开始,构建的过程往后讲】
该Node应用已经做成一个镜像 名为 node-app
1.拉取 docker pull node-app
2.运行 docker run -dit --privileged -p80:80 -p8080:8080 -p30000-30010:30000-30010 --name myNodeApp node-app:latest /usr/sbin/init
3.检查 netstat -anp|grep 8080 查看端口 docker ps 查看正在运行的容器
docker ps -a 查看包含已停止的容器
三、理解
三个主要概念:镜像、容器、仓库 docker命令干的就是它们三
Docker不像虚拟机 ,即不是模拟一个操作系统
| 组件 | 作用 | 类比(生活化理解) |
|---|---|---|
| 镜像(Image) | 只读的 "模板文件",包含运行应用所需的所有内容(代码、依赖、环境变量等) | 类似 "手机 App 的安装包(.apk/.ipa)" |
| 容器(Container) | 镜像的 "运行实例",是可读写的独立运行单元(镜像启动后才会生成容器) | 类似 "手机上已安装并正在运行的 App" |
| 仓库(Repository) | 存储镜像的 "远程仓库",用于分享 / 下载镜像(类似代码仓库 Git) | 类似 "应用商店(如苹果 App Store)" |
Docker引擎架构---cs架构
Client、Daemon、Registry


docker run -dit --privileged -p80:80 -p8080:8080 -p30000-30010:30000-30010 --name myNodeApp node-app:latest /usr/sbin/init
解释:
docker run
- 启动一个新的 Docker 容器并运行一个指定的命令(在这个例子中是
/usr/sbin/init)。这是用于创建和启动容器的基础命令。
-d(detached mode)
-d选项表示容器将以 "后台模式" 运行,即容器启动后会在后台运行,不会占用当前的终端会话。
-i(interactive)
-i选项表示保持标准输入流(stdin)打开,这样你可以与容器进行交互。
-t(tty)
-t选项会为容器分配一个伪终端(TTY),使容器具有交互式终端,适合执行需要交互的操作。
-dit的组合 表示容器将在后台运行,并且保持交互性和终端连接。
--privileged
- 这个选项使容器获得更多的系统权限,类似于管理员权限。它允许容器访问主机上的设备和执行一些低级操作(例如,加载内核模块、修改网络设置等)。这个选项通常用于需要更多操作权限的容器,比如模拟某些系统级操作。
-p(端口映射) 前面的端口是linux,后面的端口是容器
-p选项用于将宿主机的端口映射到容器的端口,允许外部访问容器内的服务。-p80:80:将宿主机的 80 端口映射到容器的 80 端口,通常用于 HTTP 服务。-p8080:8080:将宿主机的 8080 端口映射到容器的 8080 端口,用于其他 HTTP 服务或备用端口。-p30000-30010:30000-30010:将宿主机的 30000 到 30010 端口映射到容器的相应端口范围。通常这种范围用于多个连续端口的映射,可能是某些应用需要动态端口。
--name myNodeApp
- 这个选项指定了容器的名字为
myNodeApp,这样你可以通过这个名字来引用和管理容器。
node-app:latest
- 这是你要启动的容器镜像名称,
node-app是镜像的名称,latest是标签,表示拉取镜像的最新版本。如果未指定标签,Docker 默认会使用latest标签。
/usr/sbin/init
- 这是容器启动时执行的命令。
/usr/sbin/init是 Linux 系统的初始化程序,在容器启动时,它会被执行,通常用于【模拟一个完整的 Linux 系统环境】,启动必要的系统服务。总结
- 不指定
/usr/sbin/init通常不会影响容器运行,尤其是当镜像本身已经设置了默认的应用启动命令时。- 如果你需要容器像一个完整的操作系统一样启动,或者需要初始化系统级别的服务时,可以使用
/usr/sbin/init。
进入容器
node安装在linux中,会有文件夹,文件,使用docker容器化后,还想查看node相关文件夹,文件 怎么办?
docker exec -it myNodeApp /bin/sh
想退出怎么办?
Ctrl+D 或 exit
总结:
| Docker 术语 | Git 类比 | 解释 |
|---|---|---|
| 仓库 (Repository) | Git 仓库 | 存放"东西"的地方。Docker 仓库存放的是 镜像,Git 仓库存放的是 代码 。可以是远程的,也可以是本地的。 |
| 镜像 (Image) | Git 仓库里的代码快照 | 镜像是 静态的、只读的文件集合,就像 Git 仓库里的 commit。你可以从仓库拉取镜像,就像 git clone 或 git checkout。 |
| 容器 (Container) | 本地运行的代码实例 | 容器是镜像的运行时实例,可以理解为你把代码拉下来在本地运行。容器有自己的运行环境和状态,类似程序运行后生成的进程。 |
四、镜像管理
基础镜像管理操作
search:从远程仓库搜索镜像(如docker search nginx)需联网pull:拉取镜像到本地(如docker pull nginx:latest)images:查看本地所有镜像(docker images或docker image ls)rmi:删除本地镜像(如docker rmi nginx:latest,需先删除依赖容器)- 修改镜像名称 / 标签 :
tag(如docker tag nginx:latest mynginx:v1,本质是创建别名,不修改原镜像) push:推送本地镜像到远程仓库(如docker push username/mynginx:v1,需先登录仓库)
查、拉、看、删、改、传/推
高频操作
-
inspect:查看镜像详细信息(如分层、配置 等,docker inspect nginx:latest) -
history:查看镜像的构建历史(必指定镜像ID 或 仓库名:标签)bashdocker history mynginx:v1 # 指定标签v1 docker history abc12345 # 用IMAGE ID的前几位或完整ID -
prune:清理无用镜像(删除未被使用的镜像,docker image prune,加-a删除所有未运行容器依赖的镜像)
为了方便调试,需要珊瑚镜像,一个个太慢了,想删除所有镜像
docker rmi $(docker images -q) 【除非容器都停止,也有镜像备份,否则别用此命令】
五、容器管理
基础操作
-
创建并运行容器 docker run [选项] 镜像名 [命令]
docker run -dit -p8080:8080 --name myNodeApp node-app:latest
-
查看容器
docker ps:查看正在运行 的容器
docker ps -a:查看所有容器(包括已停止的)
容器生命周期管理
-
启动 / 停止 / 重启
docker start 容器名/ID:启动已停止的容器docker stop 容器名/ID:优雅停止容器(发送 SIGTERM 信号)docker kill 容器名/ID:强制停止容器(发送 SIGKILL 信号)docker restart 容器名/ID:重启容器
-
暂停 / 恢复
docker pause 容器名/ID:暂停容器(进程冻结)docker unpause 容器名/ID:恢复暂停的容器
容器交互与查看
-
进入容器
docker exec -it 容器名/ID /bin/bash:推荐,以交互模式进入容器(新进程,退出不影响容器运行)- docker attach 容器名/ID:进入容器的主进程(退出会导致容器停止,慎用)
-
查看容器详情
docker inspect 容器名/ID:查看容器完整配置(IP、挂载、网络等)docker logs 容器名/ID:查看容器日志(-f实时跟踪,--tail 100查看最后 100 行)
docker logs --tail -100f container_id 退出:ctrl+Cdocker top 容器名/ID:查看容器内运行的进程

容器删除与提交
-
删除容器
-
docker rm 容器名/ID:删除已停止的容器 -
docker rm -f 容器名/ID:强制删除正在运行的容器 -
docker container prune:清理所有已停止的容器docker rm `docker ps -a -q` -f
-
-
容器转镜像(提交修改)
docker commit [选项] 容器名/ID 新镜像名:标签(如docker commit mynginx mynginx:v2,将修改后的mynginx容器保存为新镜像)docker commit -m "修改nginx.conf配置" mynginx mynginx:v2 类似git。。
六、Linux 系统的 IPv4 转发功能。
什么是 IPv4 转发?
简单说,IPv4 转发是指:当一台 Linux 机器收到一个网络数据包,且该数据包的目标 IP 不是本机时,是否允许这台机器将数据包转发到目标 IP 所在的网络(类似路由器的 "转发" 功能)。
默认关闭 vi /etc/sysctl.conf ,加入 【 net.ipv4.ip_forward=1 】表示允许转发,机器可作为 "网关" 或 "路由器",在不同网络之间转发数据包
为什么在 Docker 中常用?
Docker 的网络功能(尤其是跨容器、容器与外部网络通信)依赖 IPv4 转发:
- Docker 会创建虚拟网络(如
bridge模式),容器通过虚拟网卡与主机通信。 - 当容器需要访问外部网络(如互联网),或不同主机上的容器需要通信时,主机需要开启 IPv4 转发,才能将容器的数据包转发到目标网络。





