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 共享 容器级 同目标容器 同目标容器
相关推荐
weixin_462446232 小时前
【实践原创】docker inspect --format 详解:Go 模板在 Docker 中的应用
docker·容器·golang
❀͜͡傀儡师2 小时前
基于docker一键部署 x86的cpu_mem_hog 用于生成CPU和内存负载,用于服务器cpu和内存使用不达标的
java·服务器·docker
星环处相逢2 小时前
Docker 场景化作业:生产环境容器操作实训
运维·docker·容器
Fortune_yangyang2 小时前
Docker 生产环境容器化
运维·docker·容器
youxiao_903 小时前
Docker 容器(二)
运维·docker·容器
爱宇阳3 小时前
使用 Docker 容器备份 GitLab 实例教程
docker·容器·gitlab
爱宇阳3 小时前
使用 Docker 容器备份与 Docker Compose 升级 GitLab 实例教程
docker·eureka·gitlab
木童6623 小时前
Docker 容器化 Web 服务全流程实践(含网络深度场景)
前端·网络·docker
Joren的学习记录14 小时前
【Linux运维大神系列】docker详解(四)
linux·运维·docker