Docker:容器、镜像、网络、仓库完整教程
-
- 前言
- [一、Docker HelloWorld验证(容器运行底层流程)](#一、Docker HelloWorld验证(容器运行底层流程))
-
- [1. 最简输出示例](#1. 最简输出示例)
- [2. 交互式容器(进入终端调试)](#2. 交互式容器(进入终端调试))
- [3. 后台常驻容器(服务标准运行方式)](#3. 后台常驻容器(服务标准运行方式))
- [4. 容器7种状态](#4. 容器7种状态)
- 二、容器全生命周期操作
-
- [2.1 基础核心概念区分](#2.1 基础核心概念区分)
- [2.2 容器启动多方式](#2.2 容器启动多方式)
- [2.3 进入运行中容器两种方案(重点区分)](#2.3 进入运行中容器两种方案(重点区分))
- [2.4 容器查看、日志、资源监控](#2.4 容器查看、日志、资源监控)
- [2.5 容器导入导出、删除清理](#2.5 容器导入导出、删除清理)
- [2.6 Web服务容器实战(端口映射基础)](#2.6 Web服务容器实战(端口映射基础))
- 三、Docker镜像完整管理操作
-
- [3.1 查看本地镜像列表](#3.1 查看本地镜像列表)
- [3.2 搜索、拉取远程镜像](#3.2 搜索、拉取远程镜像)
- [3.3 删除本地镜像](#3.3 删除本地镜像)
- [3.4 两种自定义镜像构建方式](#3.4 两种自定义镜像构建方式)
- [3.5 镜像重命名打tag](#3.5 镜像重命名打tag)
- 四、Docker容器网络:端口映射与容器互联
-
- [4.1 端口映射两种参数详解](#4.1 端口映射两种参数详解)
- [4.2 自定义网桥实现容器互通](#4.2 自定义网桥实现容器互通)
- [4.3 全局/单容器DNS配置](#4.3 全局/单容器DNS配置)
- [五、Docker仓库(Docker Hub)镜像管理](#五、Docker仓库(Docker Hub)镜像管理)
-
- [5.1 仓库基础概念](#5.1 仓库基础概念)
- [5.2 账号登录/登出](#5.2 账号登录/登出)
- [5.3 完整镜像推送流程](#5.3 完整镜像推送流程)
- 六、高频命令汇总
- 七、总结
前言
验证HelloWorld、容器全生命周期管理、镜像增删构建、端口映射与容器互联、Docker Hub镜像仓库全套实操内容。
一、Docker HelloWorld验证(容器运行底层流程)
1. 最简输出示例
bash
docker run ubuntu:15.10 /bin/echo "Hello world"
参数完整拆解:
docker:Docker客户端执行程序;run:创建并启动容器核心指令;ubuntu:15.10:指定镜像名称+标签,本地无则自动从Docker Hub拉取;/bin/echo "Hello world":容器内执行的前台命令,执行完毕容器直接销毁。
执行逻辑:客户端发送请求→Docker守护进程检查本地镜像→无则拉取→基于镜像创建容器→运行指定输出命令→输出后容器退出。
2. 交互式容器(进入终端调试)
bash
docker run -i -t ubuntu:15.10 /bin/bash
-t:分配伪终端,提供命令行交互界面;-i:保持标准输入开启,持续接收键盘输入;
进入后可执行ls、cat /proc/version查看容器系统信息,输入exit或快捷键Ctrl+D退出终端,容器同步停止。
3. 后台常驻容器(服务标准运行方式)
bash
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
-d:后台守护进程运行,返回唯一长字符串容器ID;- 查看后台容器输出日志:
docker logs 容器ID/容器名称; - 查看当前运行容器:
docker ps; - 停止后台容器:
docker stop 容器ID/容器名称。
4. 容器7种状态
created(已创建未启动)、restarting(重启中)、running(运行中)、removing(删除迁移)、paused(暂停)、exited(正常停止)、dead(异常崩溃)。
二、容器全生命周期操作
2.1 基础核心概念区分
- 镜像Image:静态只读模板,存储系统、依赖、代码;
- 容器Container:镜像动态运行实例,拥有独立进程、文件系统;
- 类比:镜像=类,容器=实例对象。
2.2 容器启动多方式
- 一次性交互式(调试用)
bash
docker run -it --name ubuntu-test ubuntu /bin/bash
--name自定义容器名称,替代随机命名,方便管理。
- 后台常驻服务(生产标准)
bash
docker run -itd --name web-demo nginx
- 启动已停止容器
bash
docker start 容器ID/名称
# 重启运行中容器
docker restart 容器ID/名称
2.3 进入运行中容器两种方案(重点区分)
docker attach
bash
docker attach ubuntu-test
缺点:执行exit退出终端会直接关闭容器,仅临时调试使用。
docker exec(生产推荐)
bash
docker exec -it ubuntu-test /bin/bash
优势:退出终端不会停止容器,线上服务排查日志、操作文件首选。
2.4 容器查看、日志、资源监控
bash
# 仅查看运行容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 查看容器实时输出日志(-f持续打印)
docker logs -f 容器名
# 查看容器内部进程
docker top 容器名
# 查看容器完整JSON配置信息(IP、挂载、端口、环境变量)
docker inspect 容器名
# 实时查看CPU/内存/磁盘资源占用
docker stats
2.5 容器导入导出、删除清理
- 导出容器快照为本地tar包
bash
docker export ubuntu-test > ubuntu.tar
- 从快照文件导入新镜像
bash
cat ubuntu.tar | docker import - test/ubuntu:v1
- 删除容器(运行中需加-f强制)
bash
# 删除已停止容器
docker rm 容器ID
# 强制删除运行容器
docker rm -f 容器ID
# 一键清理所有停止状态容器
docker container prune
2.6 Web服务容器实战(端口映射基础)
bash
# -P 随机映射容器所有暴露端口
docker run -d -P training/webapp python app.py
# -p 指定固定端口映射 宿主机端口:容器端口
docker run -d -p 5000:5000 training/webapp
# 查看容器端口对应关系
docker port 容器名
三、Docker镜像完整管理操作
3.1 查看本地镜像列表
bash
docker images
字段说明:
- REPOSITORY:镜像仓库名称;
- TAG:版本标签,默认latest代表最新;
- IMAGE ID:镜像唯一ID;
- CREATION:镜像构建时间;
- SIZE:镜像占用磁盘大小。
使用规则:镜像名:标签唯一标识镜像,仅写镜像名默认拉取latest。
3.2 搜索、拉取远程镜像
- 在线搜索Docker Hub镜像
bash
docker search httpd
返回字段:NAME镜像名、DESCRIPTION描述、STARS收藏量、OFFICIAL是否官方镜像。
- 拉取指定版本镜像
bash
# 拉取最新ubuntu
docker pull ubuntu
# 拉取指定18.04版本
docker pull ubuntu:18.04
3.3 删除本地镜像
bash
# 通过名称删除
docker r hello-world
# 通过镜像ID删除
docker rmi 镜像ID
注意:镜像被容器占用时无法直接删除,需先删除对应容器。
3.4 两种自定义镜像构建方式
方式1:基于运行容器提交镜像(临时修改)
- 启动容器并修改内部环境(如apt更新、安装软件);
- exit退出容器;
- commit提交生成新镜像
bash
docker commit -m "系统更新" -a "作者名" 容器ID 自定义镜像名:v2
参数:-m提交备注,-a标注作者。
方式2:Dockerfile标准化构建(生产主流)
- 新建Dockerfile文本,示例模板:
dockerfile
FROM centos:6.7
MAINTAINER test <test@shturl.>
RUN echo 'root:123456' | chpasswd
EXPOSE 80
CMD /usr/sbin/sshd -D
- 当前目录构建镜像
bash
docker build -t runoob/centos:6.7 .
-t指定镜像名称标签,.代表Dockerfile所在目录。
3.5 镜像重命名打tag
bash
docker tag 镜像ID 新镜像仓库名:版本
同一镜像ID可绑定多个不同标签,用于推送私有仓库。
四、Docker容器网络:端口映射与容器互联
4.1 端口映射两种参数详解
-P(大写):自动将容器EXPOSE声明端口随机映射宿主机高位端口(32768起);-p(小写):精准自定义端口,支持多种格式:
bash
# 绑定本机所有网卡 宿主机5000=容器5000
docker run -d -p 5000:5000 webapp
# 仅绑定本地回环地址,外部无法访问
docker run -d -p 127.0.0.1:5001:5000 webapp
# 指定UDP协议端口
docker run -d -p 5000:5000/udp webapp
4.2 自定义网桥实现容器互通
默认bridge网桥仅支持IP互访,自定义网桥支持容器名称DNS解析,推荐多服务使用:
- 创建自定义bridge网络
bash
docker network create -d bridge test-net
- 两个容器挂载同一网络
bash
docker run -itd --name test1 --network test-net ubuntu
docker run -itd --name test2 --network test-net
- 进入容器ping对方容器名可直接连通,无需IP
4.3 全局/单容器DNS配置
- 全局DNS(所有容器生效,修改daemon.json)
json
{
"dns": ["114.114.114.114","8.8.8.8"]
}
修改后执行systemctl daemon-reload && systemctl restart docker重启引擎。
- 启动容器单独指定DNS、主机名
bash
docker run -it --rm -h myhost --dns=114.114.114 ubuntu
--rm容器退出自动销毁,适合临时测试。
五、Docker仓库(Docker Hub)镜像管理
5.1 仓库基础概念
Registry:镜像仓库服务(Docker Hub/Harbor);
Repository:单个镜像仓库(如ubuntu、nginx);
Tag:镜像版本标签。
5.2 账号登录/登出
bash
# 登录Docker Hub,输入用户名密码
docker login
# 退出登录
docker logout
5.3 完整镜像推送流程
- 搜索并拉取基础镜像
bash
docker search ubuntu
docker pull ubuntu:18.04
- 打标签匹配个人仓库用户名
bash
docker tag ubuntu:18.04 你的用户名/ubuntu:18.04
- 推送至远程Docker Hub
bash
docker push 你的用户名/ubuntu:18.04
推送后可在个人Docker Hub仓库查看共享镜像,其他设备可直接拉取使用。
六、高频命令汇总
容器操作
bash
docker run [-it/-d/-p/--name] 镜像 # 创建启动容器
docker ps / docker ps -a # 查看容器
docker start/stop/restart 容器 # 启停重启
docker exec -it 容器 /bin/bash # 进入容器
docker rm [-f] 容器 # 删除容器
docker logs -f 容器 # 实时日志
docker stats # 资源监控
docker export / docker import # 容器快照导入导出
镜像操作
bash
docker images # 本地镜像列表
docker search 关键词 # Hub搜索镜像
docker pull 镜像:tag # 拉取镜像
docker rmi 镜像ID/名称 # 删除镜像
docker commit # 容器提交镜像
docker build -t 名称 . # Dockerfile构建
docker tag # 镜像重打标签
网络&仓库
bash
docker network create bridge名称 # 自定义网桥
docker port 容器 # 查看端口映射
docker login / logout # 仓库登录登出
docker push 镜像标签 # 推送镜像
七、总结
- 后台服务进入容器优先使用
docker exec,不要用attach,避免误退出停服务; - 线上生产禁止使用
-P随机端口,统一-p固定映射便于运维; - 多服务交互必须创建自定义bridge网络,支持容器名DNS解析;
- 推送镜像前必须使用
docker tag添加账号前缀,否则推送失败; - 国内环境务必配置镜像加速器,解决Docker Hub拉取超时;
- 清理磁盘定期执行
docker container prune、docker image prune删除无用资源。