零基础无文档啃读,纯实操摸索学会Docker全过程
全程没有翻阅官方指南和教程文档,靠着实际操作踩坑、遇到问题当场解决,一步步吃透镜像、容器、端口、环境部署、镜像打包迁移整套常用能力。本文复盘个人摸索学习思路与实操心得,适合零基础新手参考。
文章目录
- 零基础无文档啃读,纯实操摸索学会Docker全过程
-
- 一、入门起步:直接上手常用命令
-
- [1.1 镜像操作](#1.1 镜像操作)
- [1.2 容器操作](#1.2 容器操作)
- [1.3 日常监控](#1.3 日常监控)
- 二、踩坑解惑:搞懂容器本质系统特性
-
- [2.1 容器是独立Linux系统吗?](#2.1 容器是独立Linux系统吗?)
- [2.2 容器内缺少常用命令](#2.2 容器内缺少常用命令)
- [2.3 空镜像 vs 轻量容器](#2.3 空镜像 vs 轻量容器)
- 三、网络踩坑:吃透端口映射访问规则
-
- [3.1 不加-p参数,容器无法被外部访问](#3.1 不加-p参数,容器无法被外部访问)
- [3.2 端口映射规则](#3.2 端口映射规则)
- [3.3 排查端口不通](#3.3 排查端口不通)
- [四、业务落地:搭建Java Tomcat运行环境](#四、业务落地:搭建Java Tomcat运行环境)
-
- [4.1 直接使用自带JDK的Tomcat镜像](#4.1 直接使用自带JDK的Tomcat镜像)
- [4.2 项目部署](#4.2 项目部署)
- [4.3 自定义环境打包迁移](#4.3 自定义环境打包迁移)
- 五、常用命令速查表
- 六、个人摸索学习总结
- 七、后续进阶方向
- 结语
一、入门起步:直接上手常用命令
最开始没有先学概念,直接从日常高频命令切入,先把能用的操作跑通。
1.1 镜像操作
bash
# 拉取官方镜像
docker pull nginx
docker pull mysql:8.0
docker pull tomcat:9.0-jdk8
# 配置国内镜像加速(解决下载慢的问题)
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看本地已有镜像
docker images
# 删除镜像
docker rmi nginx
# 给镜像打标签
docker tag nginx:latest my-nginx:v1.0
# 导出镜像为tar文件
docker save -o my-nginx.tar my-nginx:v1.0
# 从tar文件导入镜像
docker load -i my-nginx.tar
1.2 容器操作
bash
# 启动容器(前台运行,Ctrl+C退出容器会停止)
docker run nginx
# 后台运行,并命名
docker run -d --name my-nginx nginx
# 进入容器内部
docker exec -it my-nginx /bin/bash
# 退出容器(不停止容器)
# 在容器内按 Ctrl+P 然后 Ctrl+Q
# 停止/启动/重启容器
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
# 删除容器(先停止再删除,或强制删除)
docker stop my-nginx && docker rm my-nginx
docker rm -f my-nginx # 强制删除运行中的容器
1.3 日常监控
bash
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 实时监控资源占用
docker stats
# 查看容器日志
docker logs my-nginx
# 查看最近10行日志并持续输出
docker logs --tail 10 -f my-nginx
# 查看容器详细信息(IP、挂载、网络等)
docker inspect my-nginx
全程没有死记命令语法,都是用到啥查啥、敲一遍记住用法,先保证功能正常运行。
二、踩坑解惑:搞懂容器本质系统特性
实操过程中接连遇到疑问,顺着问题弄懂容器底层逻辑。
2.1 容器是独立Linux系统吗?
bash
# 进入容器查看系统信息
docker exec -it my-nginx /bin/bash
# 容器内执行
cat /etc/os-release # 查看发行版信息
uname -r # 查看内核版本------与宿主机完全相同
hostname # 容器有自己的主机名
ip addr # 容器有独立的IP地址
结论 :容器共享宿主机Linux内核,内部拥有独立文件系统、进程空间、网络空间。目录结构和常规Linux一致,但本质上是进程级别的隔离,不是完整的虚拟机。
2.2 容器内缺少常用命令
bash
# 进入Tomcat容器后
docker exec -it my-tomcat /bin/bash
# 发现常用命令都不在
ifconfig # command not found
ping # command not found
vim # command not found
wget # command not found
# 按需安装(根据容器内的Linux发行版选择包管理器)
apt update && apt install -y net-tools iputils-ping vim wget # Debian/Ubuntu系
yum install -y net-tools iputils vim wget # CentOS/RHEL系
# 如果只需要临时用一次,可以不进容器,在宿主机直接执行
docker exec my-tomcat apt update
docker exec my-tomcat apt install -y vim
Docker基础镜像为了体积轻量化,默认精简裁剪了大量工具。理解了这点,就知道别指望容器带全套Linux工具。
2.3 空镜像 vs 轻量容器
bash
# scratch空镜像------什么都没,不能进入终端,只能运行静态编译的二进制
# FROM scratch 一般只在Dockerfile里出现
# alpine------极精简Linux,仅5MB,但能通过apk安装各种工具
docker run -it alpine /bin/sh
# alpine内安装工具
apk add curl vim
# 查看镜像体积对比
docker images | grep -E "alpine|ubuntu|centos"
# alpine ~5MB
# ubuntu ~77MB
# centos ~230MB
区分 :scratch无任何文件命令,仅能运行静态程序;alpine可以进入终端、安装环境、执行Linux指令。
三、网络踩坑:吃透端口映射访问规则
端口访问是实操高频问题。通过访问失败踩坑,彻底理解Docker网络隔离机制。
3.1 不加-p参数,容器无法被外部访问
bash
# 错误:启动Nginx不加-p,容器端口和宿主机完全隔离
docker run -d --name bad-nginx nginx
# 宿主机上curl容器内部端口------不通
curl http://localhost:80 # 失败:Connection refused
# 正确:带端口映射启动
docker rm -f bad-nginx
docker run -d --name good-nginx -p 8080:80 nginx
# 现在可以通过宿主机8080端口访问
curl http://localhost:8080 # 成功:返回Nginx欢迎页
3.2 端口映射规则
bash
# 格式:-p 宿主机端口:容器端口
docker run -d -p 9090:8080 tomcat:9.0-jdk8 # 宿主机9090→容器8080
docker run -d -p 3307:3306 mysql:8.0 # 宿主机3307→容器3306
# 多端口映射
docker run -d -p 80:80 -p 443:443 nginx
# 查看容器的端口映射
docker port good-nginx
# 输出: 80/tcp -> 0.0.0.0:8080
3.3 排查端口不通
bash
# 查看所有容器的端口映射
docker ps --format "table {{.Names}}\t{{.Ports}}"
# 宿主机上检查端口监听
netstat -tlnp | grep docker
ss -tlnp | grep docker
# 宿主机上查看iptables转发规则
iptables -t nat -L DOCKER -n
# 如果可以进入容器,检查容器内服务是否真的在监听
docker exec good-nginx netstat -tlnp
四、业务落地:搭建Java Tomcat运行环境
4.1 直接使用自带JDK的Tomcat镜像
bash
# 拉取镜像
docker pull tomcat:9.0-jdk8
# 启动(端口映射+后台运行)
docker run -d --name my-tomcat -p 8080:8080 tomcat:9.0-jdk8
# 验证------访问http://宿主机IP:8080
curl http://localhost:8080
4.2 项目部署
bash
# 将本地war包复制到Tomcat容器
docker cp /home/myapp.war my-tomcat:/usr/local/tomcat/webapps/
# 进入容器确认部署
docker exec -it my-tomcat /bin/bash
ls /usr/local/tomcat/webapps/ # 应该能看到myapp目录自动解压
# 检查日志确认启动成功
docker logs -f my-tomcat
# 访问验证
curl http://localhost:8080/myapp/
4.3 自定义环境打包迁移
bash
# 1. 在容器内配置完整环境
docker exec -it my-tomcat /bin/bash
apt update && apt install -y vim net-tools
# 配置jdk环境、数据库连接参数等...
# 2. 将运行的容器提交为本地镜像
docker commit -m "Tomcat9+JDK8+项目环境" my-tomcat my-tomcat:v1.0
# 3. 现在本地有了新镜像
docker images | grep my-tomcat
# 4. 导出镜像为tar文件
docker save -o my-tomcat-v1.tar my-tomcat:v1.0
# 5. 拷贝到其他服务器
scp my-tomcat-v1.tar user@192.168.1.100:/home/user/
# 6. 在新服务器上导入
# 在新服务器上执行:
docker load -i /home/user/my-tomcat-v1.tar
docker run -d --name my-app -p 8080:8080 my-tomcat:v1.0
一键启动相同环境,实现跨机器无缝复用。
五、常用命令速查表
bash
# ===== 镜像操作 =====
docker pull 镜像名:标签 # 拉取镜像
docker images # 查看本地镜像
docker rmi 镜像ID # 删除镜像
docker save -o 文件.tar 镜像名 # 导出镜像
docker load -i 文件.tar # 导入镜像
# ===== 容器操作 =====
docker run -d --name 名字 -p 宿主机端口:容器端口 镜像名 # 后台启动
docker exec -it 容器名 /bin/bash # 进入容器
docker stop/start/restart 容器名 # 停止/启动/重启
docker rm -f 容器名 # 强制删除
# ===== 文件与日志 =====
docker cp 宿主机文件 容器名:容器路径 # 复制文件到容器
docker cp 容器名:容器路径 宿主机文件 # 复制文件到宿主机
docker logs --tail 50 -f 容器名 # 查看日志
# ===== 进阶 =====
docker commit 容器名 新镜像名:标签 # 容器提交为镜像
docker stats # 监控资源
docker inspect 容器名 # 查看详细信息
docker system prune -a # 清理所有未使用的镜像/容器/网络
六、个人摸索学习总结
- 学习模式:纯问题驱动,不提前啃理论文档,实操遇坑再解决问题,记忆牢固且贴合实际使用场景
- 学习顺序:基础命令 → 容器系统认知 → 网络端口访问 → 业务环境部署 → 镜像离线迁移
- 核心收获:熟练掌握Docker全套日常实操命令;分清容器与虚拟机、空镜像与轻量镜像;掌握端口排查、环境搭建、离线迁移核心技能;能够独立搭建Java运行容器,打包自定义环境跨服务器使用
七、后续进阶方向
- 学习 Dockerfile 规范构建镜像,不再依赖
docker commit手动打包 - 学习 数据卷挂载(-v),避免容器删除后数据丢失
- 了解 多容器网络与 docker-compose 编排
- 了解基础的 K8s 概念,进一步提升容器化运维熟练度
结语
学Docker不需要先读300页文档。先跑通一条完整链路------拉镜像、启动容器、改环境、打包迁移到另一台机器------这条链路通了,Docker最核心的实用能力就掌握了。其余的高级功能(Dockerfile、compose、编排)是锦上添花,不是入门必修。