docker的容器与操作

目录

一,什么是docker的容器

[1.1、Docker 容器的核心定义与本质](#1.1、Docker 容器的核心定义与本质)

二,容器的操作

2.1创建容器

[2.2 启动容器(docker start)](#2.2 启动容器(docker start))

[启动交互式容器(如 CentOS)](#启动交互式容器(如 CentOS))

2.3、关键注意事项

2.4、验证容器状态

[2.5 停止容器](#2.5 停止容器)

三,容器的状态

3.1、容器核心状态及含义

3.2、状态转换流程及对应命令

3.3、操作注意事项

四,容器交互

[4.1、docker exec命令的核心解析](#4.1、docker exec命令的核心解析)

[4.2 容器文件的导出与导入](#4.2 容器文件的导出与导入)

[五,Docker 的网络模式](#五,Docker 的网络模式)

[5.1、Bridge 模式(默认桥接模式)](#5.1、Bridge 模式(默认桥接模式))

[5.2、Host 模式(共享宿主机网络)](#5.2、Host 模式(共享宿主机网络))

[5.3、None 模式(无网络)](#5.3、None 模式(无网络))

[5.4、Container 模式(共享其他容器网络)](#5.4、Container 模式(共享其他容器网络))

5.5,模式核心差异对比


一,什么是docker的容器

Docker 容器是 Docker 技术的核心运行时组件,是基于 Docker 镜像创建的可运行、隔离的应用执行环境,也是镜像的动态实例化载体,其设计核心是实现应用及其依赖的封装与隔离运行,以下从核心属性、本质特征、生命周期、隔离原理、与虚拟化的差异等维度展开讲解:

1.1、Docker 容器的核心定义与本质

  1. 镜像与容器的关系:镜像是静态的只读模板,包含应用运行所需的代码、依赖、配置等;容器是镜像的动态运行实例,在镜像的基础上添加了可写层,是实际承载应用运行的实体。
  2. 运行时本质 :容器并非独立的操作系统,而是依托宿主机内核运行的进程组,通过技术手段实现了与宿主机及其他容器的隔离,使其拥有独立的运行环境视图。

二,容器的操作

2.1创建容器

建和启动 Docker 容器主要有两种核心方式 :一种是先创建容器(docker create)再手动启动(docker start ,另一种是一步完成创建 + 启动(docker run(最常用)。以下从命令语法、核心参数、实操步骤和注意事项展开讲解,覆盖基础到常用配置。

复制代码
docker create [可选参数] 镜像名[:标签] [容器内执行的命令]

核心参数

参数 作用
--name 为容器指定自定义名称(避免系统自动生成随机名,方便管理)
-p 端口映射,格式宿主机端口:容器端口(如8080:80
-it 分配伪终端并开启交互模式(适用于需要终端操作的容器,如 CentOS、Ubuntu)

2.2 启动容器(docker start

复制代码
docker start [可选参数] 容器ID/容器名称

# 通过容器ID启动(替换为实际的容器ID)
docker start 17dd0f74be94
启动交互式容器(如 CentOS)

CentOS 容器启动后立即退出 的问题,需用-itd组合参数:

复制代码
# 后台交互运行CentOS,指定容器名,启动bash进程
docker run -itd --name my-centos centos:7 /bin/bash

验证 :通过docker exec -it my-centos /bin/bash可进入容器终端,容器不会退出。

2.3、关键注意事项

  1. 容器名称唯一性--name指定的名称不能重复,否则会报错Conflict. The container name "/xxx" is already in use,需删除原有容器或更换名称。
  2. 端口冲突-p映射的宿主机端口若已被占用,会启动失败,需更换端口(如8081:80)或释放占用端口。
  3. 容器主进程 :容器的生命周期与主进程绑定,若主进程退出(如交互式容器未加-d且终端关闭),容器会进入Exited状态。
  4. 镜像拉取 :若本地没有指定的镜像,docker create/docker run会自动从 Docker Hub 拉取镜像(需网络畅通)。

2.4、验证容器状态

复制代码
# 查看运行中的容器
docker ps

# 查看所有容器(包括已创建、已停止的)
docker ps -a

# 查看容器启动日志(排查启动失败问题)
docker logs 容器ID/容器名称

2.5 停止容器

docker stop 【id】

三,容器的状态

Docker 容器全生命周期的状态体系及状态转换逻辑,明确了各状态的定义、触发转换的命令,是容器运维的核心流程参考。

3.1、容器核心状态及含义

图中涵盖 Docker 容器的 5 类核心状态:

  1. created(已创建):基于镜像完成容器配置(如网络、存储),但主进程未启动,处于待运行状态。
  2. 运行中:容器主进程正常执行,应用在容器内提供服务,是容器的核心工作状态。
  3. paused(暂停):容器内所有进程被冻结,资源占用保持当前状态,可快速恢复运行。
  4. stopped(停止):容器主进程被主动终止,容器停止运行但配置、数据仍保留在宿主机中。
  5. dead(异常终止):容器因故障(如进程崩溃、资源耗尽)异常停止,无法直接恢复运行。

3.2、状态转换流程及对应命令

各状态间的转换需通过特定 Docker 命令触发,具体流转关系:

  1. 镜像到容器的初始化
    • 执行docker pull获取镜像后,通过docker create创建容器,进入created状态;
    • 直接执行docker run(等价于docker create + docker start),跳过created状态,直接进入 "运行中" 状态。
  2. created → 运行中 :执行docker start,启动容器主进程。
  3. 运行中 → 其他状态
    • 执行docker stop:容器主进程终止,进入stopped状态;
    • 执行docker pause:容器进程冻结,进入paused状态;
    • 进程异常崩溃:进入dead状态。
  4. paused → 运行中 :执行docker unpause,恢复容器进程的执行。
  5. stopped → 其他状态
    • 执行docker start:重新启动主进程,回到 "运行中" 状态;
    • 执行docker rm:删除容器(仅stopped状态支持此操作)。

3.3、操作注意事项

  1. dead 状态处理 :处于dead状态的容器无法通过docker start恢复,需先执行docker rm删除,再重新创建容器。
  2. 容器删除约束 :仅stopped状态的容器可被删除,运行中 / 暂停的容器需先执行docker stop(或docker unpause + docker stop),避免资源泄漏。
  3. pause 的适用场景pause仅冻结进程、不释放资源,适用于临时暂停容器操作(如调试),长期停止容器建议用docker stop(释放部分资源)。

四,容器交互

4.1、docker exec命令的核心解析

该命令用于进入运行中的容器执行命令,是容器调试的核心工具,关键信息如下:

  1. 作用 :在运行的容器内启动独立进程(如交互式 shell),不会影响容器主进程(区别于docker attach,后者直接连接主进程的输入输出)。
  2. 参数含义
    • -i:保持容器标准输入流打开,确保交互输入有效;
    • -t:为容器分配伪终端,使交互体验与本地终端一致。
  3. 操作逻辑
    • 需先通过docker start确保容器处于运行状态;
    • 执行exit退出容器后,容器仍保持运行(因exec启动的是独立进程,不关联主进程生命周期);
    • 若用docker run -it 镜像 bash且不加-d,退出容器会导致容器停止(此时容器主进程是 bash,主进程终止则容器退出)。

4.2 容器文件的导出与导入

导入。

导出

执行docker cp命令,把容器内/opt/test.txt复制到宿主机主目录,并重命名为abc123.txt

复制代码
docker cp 2592d3fad0fb:/opt/test.txt ~/abc123.txt


容器的导出与导入

导出格式: docker export 容器 ID/ 名称 > 文件名

docker export 2592d3fad0fb > centos7.tar

导入格式: cat 文件名 | docker import -- 镜像名称 : 标签

cat centos7.tar | docker import - centos7:test #导入后会生成镜像,但不会创建容器
删除容器
格式: docker rm [-f] 容器 ID/ 名称
docker rm $(docker ps -a -q) # 批量清理后台停止的容器

五,Docker****的网络模式

5.1、Bridge 模式(默认桥接模式)

Docker 自动创建虚拟网桥 docker0(默认 IP 段172.17.0.0/16),每个容器会分配独立的私有 IP(如172.17.0.2),并通过虚拟网卡连接到docker0;容器与外部网络通信依赖宿主机的 NAT 转发,容器之间可通过IP / 容器名互通(Docker 内置 DNS 解析容器名)。

  1. 启动容器(默认启用 Bridge)

    复制代码
    # 启动两个Nginx容器(默认Bridge模式)
    docker run -d --name nginx1 nginx
    docker run -d --name nginx2 nginx
  2. 验证网络

    • 查看容器 IP:

      复制代码
      docker inspect -f '{{.NetworkSettings.IPAddress}}' nginx1  # 输出如172.17.0.2
      docker inspect -f '{{.NetworkSettings.IPAddress}}' nginx2  # 输出如172.17.0.3
    • 容器间互通:进入nginx1,pingnginx2的 IP 或容器名

      复制代码
      docker exec -it nginx1 ping 172.17.0.3  # 通
      docker exec -it nginx1 ping nginx2     # 通(Docker DNS解析)
    • 容器访问外部网络:

      复制代码
      docker exec -it nginx1 ping www.baidu.com  # 通(宿主机NAT转发)

适用场景

大多数常规场景(如 Web 服务、应用容器),需容器独立网络、且容器间 / 容器与宿主机通信的场景。

5.2、Host 模式(共享宿主机网络)

容器直接共享宿主机的网络命名空间,无独立 IP、端口,容器使用的端口就是宿主机的端口(无 NAT 转发开销);容器的网络配置与宿主机完全一致。

  1. 启动容器(指定 Host 模式)

    复制代码
    # 容器共享宿主机网络,启动Nginx(占用宿主机80端口)
    docker run -d --net=host --name nginx-host nginx
  2. 验证网络

    • 容器无独立 IP:查看容器网络,与宿主机一致:

      复制代码
      docker exec -it nginx-host ifconfig  # 输出与宿主机ifconfig结果相同
    • 访问容器服务:直接访问宿主机 80 端口(无需端口映射):

      复制代码
      curl localhost:80  # 直接返回Nginx默认页面

注意事项

  • 容器端口与宿主机端口冲突会导致启动失败;
  • 无网络隔离,容器可直接访问宿主机所有网络资源。

适用场景

高网络性能需求的场景(如高并发 API、实时通信服务),追求零 NAT 转发开销的场景。

5.3、None 模式(无网络)

容器仅保留回环接口(lo),无外部网络连接,完全隔离网络环境;需手动配置网络才能通信。

  1. 启动容器(指定 None 模式)

    复制代码
    docker run -it --net=none --name centos-none centos:7
  2. 验证网络

    • 容器仅含 lo 接口:

      复制代码
      # 在容器内执行
      ifconfig  # 仅显示lo(127.0.0.1)
    • 无法访问外部 / 其他容器:

      复制代码
      # 在容器内执行
      ping www.baidu.com  # 不通
      ping 172.17.0.2     # 不通(其他容器IP)

适用场景

无需网络的容器(如本地文件处理、离线计算任务),或需完全自定义网络配置的特殊场景。

5.4、Container 模式(共享其他容器网络)

新容器共享另一个已运行容器的网络命名空间,与目标容器使用同一 IP、端口范围,网络完全互通(相当于 "网络层面的容器共享")。

  1. 启动基础容器(提供网络)

    复制代码
    # 启动一个Nginx容器(Bridge模式,作为网络提供方)
    docker run -d --name base-nginx nginx
  2. 启动新容器(共享 base-nginx 的网络)

    复制代码
    docker run -it --net=container:base-nginx --name share-container centos:7
  3. 验证网络

    • 新容器与 base-nginx 共享 IP:

      复制代码
      # 在share-container内执行
      ifconfig  # IP与base-nginx的IP完全一致
    • 新容器可直接访问 base-nginx 的服务(无需网络转发):

      复制代码
      # 在share-container内执行
      curl localhost:80  # 直接返回base-nginx的Nginx页面

适用场景

多容器共享网络的场景(如 "应用容器 + 日志采集容器",共享网络便于日志采集;"主程序容器 + 辅助工具容器",共享网络简化通信)。

5.5,模式核心差异对比

模式 独立 IP 网络隔离 与宿主机通信 容器间通信 性能
Bridge 容器级 是(NAT) 是(IP / 容器名) 一般
Host 是(直接共享) 最优
None 完全隔离 -
Container 共享 容器级 同目标容器 同目标容器
相关推荐
骂我的人都死了2 小时前
DevOps架构部署
运维·ubuntu·docker·k8s·github·devops·python3.11
AL3172 小时前
模拟实现NetDevOps全生命周期自动化网络运维
运维·docker·centos·ensp·netmiko
Alaaaaaaan2 小时前
[DevOps]使用github-action工具部署docker容器(实现提交代码一键推送部署到服务器)
服务器·前端·docker·容器·github
70asunflower2 小时前
Docker exec 命令完全解析
linux·ubuntu·docker
玉梅小洋5 小时前
Docker 镜像在节点间的高效拷贝的方案
运维·docker·容器
firstacui5 小时前
搭建harbor仓库
linux·docker
好好沉淀5 小时前
Docker 部署 Kibana:查 ES 版本 + 版本匹配 + 中文界面
linux·docker
啦啦啦小石头5 小时前
CVAT使用记录
docker·ai
BLUcoding5 小时前
使用 Docker Compose 安装常用中间件
docker·中间件·容器