零基础无文档啃读纯实操摸索学会Docker全过程

零基础无文档啃读,纯实操摸索学会Docker全过程

全程没有翻阅官方指南和教程文档,靠着实际操作踩坑、遇到问题当场解决,一步步吃透镜像、容器、端口、环境部署、镜像打包迁移整套常用能力。本文复盘个人摸索学习思路与实操心得,适合零基础新手参考。

文章目录


一、入门起步:直接上手常用命令

最开始没有先学概念,直接从日常高频命令切入,先把能用的操作跑通。

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                 # 清理所有未使用的镜像/容器/网络

六、个人摸索学习总结

  1. 学习模式:纯问题驱动,不提前啃理论文档,实操遇坑再解决问题,记忆牢固且贴合实际使用场景
  2. 学习顺序:基础命令 → 容器系统认知 → 网络端口访问 → 业务环境部署 → 镜像离线迁移
  3. 核心收获:熟练掌握Docker全套日常实操命令;分清容器与虚拟机、空镜像与轻量镜像;掌握端口排查、环境搭建、离线迁移核心技能;能够独立搭建Java运行容器,打包自定义环境跨服务器使用

七、后续进阶方向

  1. 学习 Dockerfile 规范构建镜像,不再依赖 docker commit 手动打包
  2. 学习 数据卷挂载(-v),避免容器删除后数据丢失
  3. 了解 多容器网络与 docker-compose 编排
  4. 了解基础的 K8s 概念,进一步提升容器化运维熟练度

结语

学Docker不需要先读300页文档。先跑通一条完整链路------拉镜像、启动容器、改环境、打包迁移到另一台机器------这条链路通了,Docker最核心的实用能力就掌握了。其余的高级功能(Dockerfile、compose、编排)是锦上添花,不是入门必修。

相关推荐
IT19951 小时前
踩坑实录:CentOS 默认 Fail2Ban 挡不住高频并发攻击,漏洞修复一步到位
linux·运维·centos
江湖有缘1 小时前
零门槛搭建个人微社区:Docker部署 Paopao-ce 完整教程
运维·docker·容器
摇滚侠1 小时前
VMvare 安装 Linux CentOS 7
linux·运维·centos
吉星9527ABC1 小时前
在centos9stream上离线安装mysql5.7客户端的过程
运维·centos9steam
CingSyuan1 小时前
服务器现场排障:在 Windows 下使用 Linux reader 直接查看 Linux 系统 U 盘中的日志文件与文件结构
linux·运维·服务器·网络·windows
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 07:Messaging Gateway,让 Agent 从终端走向多平台入口
运维·服务器·数据库
qq_356408661 小时前
GitLab 单机私有化部署文档(基于 Docker 环境)
docker·gitlab
艾莉丝努力练剑1 小时前
【Linux网络】多路转接select
java·linux·运维·服务器·网络·tcp/ip
Cx330❀1 小时前
【Linux网络】从零定制应用层协议:黏包问题、全双工缓冲区与 Jsoncpp 序列化深度解析
linux·运维·服务器·开发语言·网络·c++·人工智能