Docker第2天:容器、镜像、网络、仓库

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镜像完整管理操作
    • 四、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"

参数完整拆解:

  1. docker:Docker客户端执行程序;
  2. run:创建并启动容器核心指令;
  3. ubuntu:15.10:指定镜像名称+标签,本地无则自动从Docker Hub拉取;
  4. /bin/echo "Hello world":容器内执行的前台命令,执行完毕容器直接销毁。
    执行逻辑:客户端发送请求→Docker守护进程检查本地镜像→无则拉取→基于镜像创建容器→运行指定输出命令→输出后容器退出。

2. 交互式容器(进入终端调试)

bash 复制代码
docker run -i -t ubuntu:15.10 /bin/bash
  • -t:分配伪终端,提供命令行交互界面;
  • -i:保持标准输入开启,持续接收键盘输入;
    进入后可执行lscat /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 容器启动多方式

  1. 一次性交互式(调试用)
bash 复制代码
docker run -it --name ubuntu-test ubuntu /bin/bash

--name自定义容器名称,替代随机命名,方便管理。

  1. 后台常驻服务(生产标准)
bash 复制代码
docker run -itd --name web-demo nginx
  1. 启动已停止容器
bash 复制代码
docker start 容器ID/名称
# 重启运行中容器
docker restart 容器ID/名称

2.3 进入运行中容器两种方案(重点区分)

  1. docker attach
bash 复制代码
docker attach ubuntu-test

缺点:执行exit退出终端会直接关闭容器,仅临时调试使用。

  1. 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 容器导入导出、删除清理

  1. 导出容器快照为本地tar包
bash 复制代码
docker export ubuntu-test > ubuntu.tar
  1. 从快照文件导入新镜像
bash 复制代码
cat ubuntu.tar | docker import - test/ubuntu:v1
  1. 删除容器(运行中需加-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

字段说明:

  1. REPOSITORY:镜像仓库名称;
  2. TAG:版本标签,默认latest代表最新;
  3. IMAGE ID:镜像唯一ID;
  4. CREATION:镜像构建时间;
  5. SIZE:镜像占用磁盘大小。
    使用规则:镜像名:标签唯一标识镜像,仅写镜像名默认拉取latest。

3.2 搜索、拉取远程镜像

  1. 在线搜索Docker Hub镜像
bash 复制代码
docker search httpd

返回字段:NAME镜像名、DESCRIPTION描述、STARS收藏量、OFFICIAL是否官方镜像。

  1. 拉取指定版本镜像
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:基于运行容器提交镜像(临时修改)
  1. 启动容器并修改内部环境(如apt更新、安装软件);
  2. exit退出容器;
  3. commit提交生成新镜像
bash 复制代码
docker commit -m "系统更新" -a "作者名" 容器ID 自定义镜像名:v2

参数:-m提交备注,-a标注作者。

方式2:Dockerfile标准化构建(生产主流)
  1. 新建Dockerfile文本,示例模板:
dockerfile 复制代码
FROM centos:6.7
MAINTAINER test <test@shturl.>
RUN echo 'root:123456' | chpasswd
EXPOSE 80
CMD /usr/sbin/sshd -D
  1. 当前目录构建镜像
bash 复制代码
docker build -t runoob/centos:6.7 .

-t指定镜像名称标签,.代表Dockerfile所在目录。

3.5 镜像重命名打tag

bash 复制代码
docker tag 镜像ID 新镜像仓库名:版本

同一镜像ID可绑定多个不同标签,用于推送私有仓库。

四、Docker容器网络:端口映射与容器互联

4.1 端口映射两种参数详解

  1. -P(大写):自动将容器EXPOSE声明端口随机映射宿主机高位端口(32768起);
  2. -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解析,推荐多服务使用:

  1. 创建自定义bridge网络
bash 复制代码
docker network create -d bridge test-net
  1. 两个容器挂载同一网络
bash 复制代码
docker run -itd --name test1 --network test-net ubuntu
docker run -itd --name test2 --network test-net
  1. 进入容器ping对方容器名可直接连通,无需IP

4.3 全局/单容器DNS配置

  1. 全局DNS(所有容器生效,修改daemon.json)
json 复制代码
{
  "dns": ["114.114.114.114","8.8.8.8"]
}

修改后执行systemctl daemon-reload && systemctl restart docker重启引擎。

  1. 启动容器单独指定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 完整镜像推送流程

  1. 搜索并拉取基础镜像
bash 复制代码
docker search ubuntu
docker pull ubuntu:18.04
  1. 打标签匹配个人仓库用户名
bash 复制代码
docker tag ubuntu:18.04 你的用户名/ubuntu:18.04
  1. 推送至远程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 镜像标签              # 推送镜像

七、总结

  1. 后台服务进入容器优先使用docker exec,不要用attach,避免误退出停服务;
  2. 线上生产禁止使用-P随机端口,统一-p固定映射便于运维;
  3. 多服务交互必须创建自定义bridge网络,支持容器名DNS解析;
  4. 推送镜像前必须使用docker tag添加账号前缀,否则推送失败;
  5. 国内环境务必配置镜像加速器,解决Docker Hub拉取超时;
  6. 清理磁盘定期执行docker container prunedocker image prune删除无用资源。