Docker容器完全操控指南

news/2025/10/1 22:29:59/文章来源:https://www.cnblogs.com/lxjshuju/p/19122996

Docker容器完全操作指南

一、课程目标

本课程围绕Docker容器技术展开,旨在帮助学习者达成以下两大核心目标:

  1. 熟练掌握Docker容器的操作:全面理解容器的创建、启动、运行、暂停、恢复、停止、进入、删除、导入、导出等基础操作,以及端口映射、日志查看、文件复制等进阶操作,能够独立完成容器生命周期内的各类管理任务。
  2. 深入理解Docker容器的应用:以实际场景为导向,掌握基于Docker容器部署Web服务器(如Nginx、Apache HTTP Server)的完整流程,包括镜像查找与获取、容器配置与启动、数据卷挂载、自定义网页部署等,理解容器技术在实际应用中的价值与优势。

二、Docker容器核心概念

从本质上讲,一个Docker容器是一个正在运行的进程,但它通过Docker的封装技术,实现了与主机系统及其他容器的隔离。这种隔离性是容器技术的核心特性之一,其中最关键的隔离维度体现在文件系统层面——每个容器都会与一个专用的文件系统进行交互,而这个专用文件系统正是由Docker镜像提供的。

Docker镜像作为容器的“模板”,包含了运行应用程序所需的全部资源,具体包括:

  • 应用程序的代码或二进制文件(如Web服务器的可执行程序);
  • 应用运行时依赖的库文件、环境变量、配置文件(如Python的依赖包、Nginx的配置文件);
  • 操作系统层面的基础文件系统对象(如Linux系统的/lib、/bin等目录结构)。

简单来说,镜像与容器的关系,类似于面向对象程序设计中的“类”与“实例”:镜像是静态的、不可修改的定义(类),描述了容器的基础环境和应用配置;容器则是镜像运行时的动态实体(实例),可以被创建、启动、停止、删除、暂停等,每个容器都拥有独立的运行环境和资源空间。

三、Docker容器基础操作

(一)创建容器(docker create

docker create命令用于基于指定的Docker镜像创建一个容器,但创建后的容器处于停止状态,需通过后续命令启动。

1. 基本语法
docker create [选项] 镜像名称:标签
2. 常用选项说明
  • -i(interactive):让容器的标准输入(STDIN)保持打开状态,确保容器能接收外部输入(如命令行指令)。
  • -t(tty):为容器分配一个伪终端(Pseudo-TTY),并将其绑定到容器的标准输入上,使得用户可以通过终端与容器进行交互(如进入容器后执行命令)。
  • 通常会将-i-t组合使用(即-it),为容器创建一个可交互的终端环境。
3. 操作示例

基于centos:7镜像创建一个可交互的容器:

[root@docker ~]# docker create -it centos:7
8a6831bba185e5700bd94807e1e09471fd151dee09056d50ae18f89bc1688670

执行命令后,终端会返回创建的容器ID(8a6831bba185,完整ID较长,通常可使用前8位简化引用)。

4. 容器查看

创建容器后,可通过以下命令查看容器状态(包括停止状态的容器):

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS    PORTS     NAMES
8a6831bba185   centos:7   "/bin/bash"   12 seconds ago      Created             exciting_wilbur
  • docker ps:默认只显示运行中的容器。
  • docker ps -a:显示所有状态的容器(包括运行中、停止、暂停等)。
  • 输出结果中,STATUS列显示为Created,表示容器已创建但未启动;NAMES列为容器的默认名称(Docker自动生成,如exciting_wilbur),也可在创建时通过--name选项自定义名称。

(二)启动容器(docker start

docker start命令用于启动已创建但处于停止状态的容器,启动后容器进入运行状态

1. 基本语法
docker start 容器ID/容器名称

(可通过容器ID的前几位或完整容器名称指定目标容器,两种方式效果一致)

2. 操作示例

启动上述创建的8a6831bba185容器:

[root@docker ~]# docker start 8a6831bba185
8a6831bba185

启动成功后,终端会返回容器ID/名称。此时再次查看容器状态:

[root@docker ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS         PORTS     NAMES
8a6831bba185   centos:7   "/bin/bash"   3 minutes ago       Up 10 seconds            exciting_wilbur

STATUS列显示为Up 10 seconds,表示容器已运行10秒。

3. 注意事项

当通过交互终端(如-it创建的容器)进入容器并执行exit命令退出后,容器会自动停止。此时需再次使用docker start命令重启容器,或通过docker ps -a查看容器的Up/Down状态。

(三)运行容器(docker run

docker run命令是创建容器与启动容器的“合并操作”,等价于先执行docker create创建容器,再执行docker start启动容器。该命令可直接基于镜像创建并启动容器,是日常使用中最常用的容器启动方式。

1. 基本语法
docker run [选项] 镜像名称:标签 [容器内执行的命令]
2. 常用选项说明
  • -it:同docker create,创建可交互终端,支持用户与容器内的命令行进行交互。
  • -d(detach):以“后台模式”启动容器,容器启动后不会占用当前终端,而是在后台运行(常用于运行Web服务等长时间运行的应用)。
  • --name:自定义容器名称,避免Docker自动生成随机名称,便于后续管理(如--name my-centos)。
3. 操作示例(交互模式)

基于centos:7镜像创建并启动一个可交互的容器,进入容器的/bin/bash终端:

[root@docker ~]# docker run -it centos:7 /bin/bash
[root@7ab8edfe7f23 /]#

此时终端提示符变为容器内的路径([root@7ab8edfe7f23 /]#),表示已进入容器内部,可执行lspwd等Linux命令。

4. 容器退出行为

对于通过/bin/bash启动的交互容器,当用户执行exit命令退出终端时,容器内的bash进程会终止。由于容器的核心使命是运行指定应用(此处为bash),当应用退出后,容器会自动停止。退出后查看容器状态:

[root@7ab8edfe7f23 /]# exit
exit
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                     PORTS     NAMES
7ab8edfe7f23   centos:7   "/bin/bash"   3 minutes ago       Exited (0) 6 seconds ago             modest_brown

STATUS列显示为Exited (0) 6 seconds ago,表示容器已退出(退出码0表示正常退出)。

5. 操作示例(后台模式)

若需让容器在后台运行(如运行Web服务),可添加-d选项。例如,基于httpd(Apache HTTP Server)镜像启动一个后台容器:

[root@docker ~]# docker run -itd --name my-httpd httpd:latest /bin/bash
82aec4e96622f56c2daba16d7b51483e762194f8137bb9c8cfa6887cfe4d6f82

启动后,终端会返回容器ID,且当前终端不会被容器占用。通过docker ps可查看后台运行的容器:

[root@docker ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS      NAMES
82aec4e96622   httpd:latest   "/bin/bash"   2 seconds ago    Up 2 seconds    80/tcp     my-httpd

(四)容器状态管理(暂停、恢复、停止)

1. 暂停容器(docker pause

docker pause命令用于暂停运行中的容器,暂停后容器的进程会被冻结,资源占用保持当前状态,但不会释放。

2. 恢复容器(docker unpause

docker unpause命令用于恢复被暂停的容器,恢复后容器的进程会继续运行,状态回到“运行中”。

  • 基本语法:docker unpause 容器ID/容器名称
  • 操作示例:
    # 查看被暂停的容器
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                   PORTS     NAMES
    8a6831bba185   centos:7   "/bin/bash"   23 minutes ago      Up 20 minutes (Paused)            exciting_wilbur
    # 恢复容器
    [root@docker ~]# docker unpause 8a6831bba185
    8a6831bba185
    # 查看恢复后的状态,STATUS回到Up
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS         PORTS     NAMES
    8a6831bba185   centos:7   "/bin/bash"   23 minutes ago      Up 20 minutes            exciting_wilbur
3. 停止容器(docker stop

docker stop命令用于终止运行中的容器,停止后容器的进程会被关闭,资源(如内存、CPU)会被释放,容器状态变为“已退出”。

  • 基本语法:docker stop 容器ID/容器名称
  • 操作示例:
    # 停止运行中的容器
    [root@docker ~]# docker stop 8a6831bba185
    8a6831bba185
    # 查看停止后的容器状态
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                       PORTS     NAMES
    8a6831bba185   centos:7   "/bin/bash"   30 minutes ago      Exited (137) 12 seconds ago             exciting_wilbur
    (退出码137通常表示容器被外部信号终止,如docker stop命令触发)
4. 清理停止的容器(docker container prune

当系统中积累大量停止状态的容器时,可使用docker container prune命令批量清理所有处于“已退出”状态的容器,释放磁盘空间。

  • 操作示例:
    [root@docker ~]# docker container prune
    WARNING! This will remove all stopped containers.
    Are you sure you want to continue? [y/N] y
    Deleted Containers:
    8a6831bba185e5700bd94807e1e09471fd151dee09056d50ae18f89bc1688670
    ...
    Total reclaimed space: 1.2GB
    执行命令前会提示确认,输入y后即可删除所有停止的容器,并显示回收的磁盘空间。

(五)进入容器(docker attachdocker exec

当容器以后台模式(-d)启动时,若需进入容器内部执行命令,可使用docker attachdocker exec命令。两者的核心区别在于退出容器后的容器状态

1. docker attach(不推荐)

docker attach命令通过连接容器的标准输入/输出/错误流(STDIO)进入容器,但退出容器(如执行exit)时,会导致容器自动停止,因此仅适用于临时调试,不推荐用于生产环境。

2. docker exec(推荐)

docker exec命令通过在容器内创建一个新的进程来执行命令,支持交互模式。退出容器时,仅终止新创建的进程,不会影响容器的主进程,因此容器仍会保持运行状态,是生产环境中进入容器的首选方式。

  • 基本语法:docker exec [选项] 容器ID/容器名称 容器内执行的命令
  • 常用选项:-it(创建可交互终端,同docker run
  • 操作示例:
    # 启动一个后台容器并命名为httpd
    [root@docker ~]# docker run -itd --name httpd httpd:latest /bin/bash
    82aec4e96622f56c2daba16d7b51483e762194f8137bb9c8cfa6887cfe4d6f82
    # 查看容器状态(运行中)
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS      NAMES
    82aec4e96622   httpd:latest   "/bin/bash"   2 seconds ago    Up 2 seconds    80/tcp     httpd
    # 使用exec进入容器(-it创建交互终端)
    [root@docker ~]# docker exec -it httpd /bin/bash
    [root@82aec4e96622 /]#
    # 退出容器
    [root@82aec4e96622 /]# exit
    exit
    # 再次查看容器状态,仍为运行中
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS      NAMES
    82aec4e96622   httpd:latest   "/bin/bash"   32 seconds ago   Up 32 seconds   80/tcp     httpd

(六)删除容器(docker rm

docker rm命令用于删除不再需要的容器,默认情况下仅能删除处于停止状态的容器;若需强制删除运行中的容器,需添加-f(force)选项。

1. 删除停止的容器
2. 强制删除运行中的容器
  • 基本语法:docker rm -f 容器ID/容器名称
  • 操作示例:
    # 启动一个运行中的容器
    [root@docker ~]# docker run -itd --name test-rm httpd:latest /bin/bash
    74c75d56383b
    # 直接删除运行中的容器(无-f选项,报错)
    [root@docker ~]# docker rm test-rm
    Error response from daemon: You cannot remove a running container 74c75d56383b... Stop the container before attempting removal or force remove
    # 添加-f选项强制删除
    [root@docker ~]# docker rm -f test-rm
    test-rm
    # 查看容器列表,已删除
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
3. 注意事项
  • 删除容器前,建议先停止容器(除非确有强制删除的需求),避免因强制删除导致数据丢失或进程异常终止。
  • 若容器挂载了数据卷(-v选项),仅删除容器不会删除挂载的数据卷,需单独删除数据卷(docker volume rm)。

(七)容器的导入与导出

Docker的导入(docker import)与导出(docker export)功能用于实现容器在不同系统间的迁移,是容器备份与分发的重要手段。

1. 导出容器(docker export

docker export命令用于将一个已创建的容器(无论当前处于运行还是停止状态)导出为一个tar格式的归档文件,该文件包含了容器的文件系统内容。

  • 基本语法:
    # 方式1:通过-o选项指定输出文件
    docker export -o 导出文件名.tar 容器ID/容器名称
    # 方式2:通过重定向符号>指定输出文件
    docker export 容器ID/容器名称 > 导出文件名.tar
  • 操作示例:
    # 查看当前所有容器(包含运行中的httpd和停止的centos)
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                     PORTS      NAMES
    2f77705c335b   centos:7   "/bin/bash"   5 seconds ago       Exited (0) 5 seconds ago              centos
    55c631353b28   httpd:latest   "/bin/bash"   About a minute ago  Up About a minute        80/tcp     httpd
    # 导出运行中的httpd容器
    [root@docker ~]# docker export -o test_for_run_httpd.tar 55c631353b28
    # 导出停止的centos容器
    [root@docker ~]# docker export -o test_for_stop_centos.tar 2f77705c335b
    # 查看导出的tar文件
    [root@docker ~]# ls
    Public  test_for_stop_centos.tar  cy-httpd.tar.gz  Documents  Music  Pictures  test_for_run_httpd.tar  Videos  anaconda-ks.cfg  Dockerfile  initial-setup-ks.cfg
2. 导入容器(docker import

docker import命令用于将通过docker export导出的tar文件导入为一个新的Docker镜像(注意:导入的是镜像,而非容器),后续可基于该镜像创建新的容器。

  • 基本语法:docker import 导出文件名.tar 新镜像名称:标签
  • 操作示例:
    # 将导出的httpd容器tar文件导入为mytest:cy镜像
    [root@docker ~]# docker import test_for_run_httpd.tar mytest:cy
    sha256:41da22302aa8412cd7664b22991dd3dec3a3703b24765ca2c6244b1def2780a3
    # 将导出的centos容器tar文件导入为mytest1:cy1镜像
    [root@docker ~]# docker import test_for_stop_centos.tar mytest1:cy1
    sha256:46e3dd459d0c93af7fd56ea4d97b3e7761c1fe8848dd1c1d049015227a06ee35
    # 查看导入的新镜像
    [root@docker ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    mytest1      cy1       46e3dd459d0c   10 seconds ago   204MB
    mytest       cy        41da22302aa8   30 seconds ago   142MB
    httpd        latest    74d299993c8e   2 weeks ago      142MB
    centos       7         eeb6ee3f44bd   2 months ago     204MB
3. 导入与导出的特点
  • 导出的是容器文件系统docker export仅包含容器运行时的文件系统内容,不包含容器的元数据(如环境变量、端口映射、命令等)。
  • 导入的是镜像docker import生成的是镜像,需通过docker run基于该镜像创建新容器,新容器的配置(如端口、命令)需重新指定。

四、Docker容器进阶操作

(一)容器端口映射

容器默认具有网络隔离性,外部(如宿主机、其他机器)无法直接访问容器内的服务(如Web服务的80端口)。通过端口映射,可将容器内的端口映射到宿主机的端口上,实现外部对容器服务的访问。Docker支持两种端口映射方式:映射随机端口和映射指定端口,分别通过-P(大写)和-p(小写)选项实现。

1. 映射随机端口(-P

-P选项会将容器内所有暴露的端口(镜像构建时通过EXPOSE指令声明的端口,如httpd的80端口)随机映射到宿主机的一个未被占用的端口上,映射关系可通过docker ps查看。

2. 映射指定端口(-p

-p选项允许用户自定义宿主机端口与容器端口的映射关系,格式为宿主机端口:容器端口,适用于需要固定访问端口的场景(如Web服务需使用8080端口对外提供服务)。

  • 基本语法:docker run -itd -p 宿主机端口:容器端口 --name 容器名称 镜像名称:标签
  • 操作示例:
    # 映射宿主机8080端口到容器80端口
    [root@docker ~]# docker run --name httpd2 -itd -p 8080:80 httpd:latest
    d5e5e991b5dc5becad63a8ba874c0ac583fea34a2b63081736aa2ea1f9d8ec6f
    # 查看端口映射关系
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE        COMMAND              CREATED          STATUS          PORTS                     NAMES
    d5e5e991b5dc   httpd:latest "/usr/local/bin/ht…" 4 seconds ago    Up 3 seconds    0.0.0.0:8080->80/tcp, :::8080->80/tcp   httpd2
    此时通过浏览器访问http://172.25.0.100:8080,即可访问容器内的httpd服务。
3. 端口映射的意义
  • 突破网络隔离:解决容器与外部的网络通信问题,使外部服务(如用户浏览器)能访问容器内的应用。
  • 端口复用与隔离:多个容器的相同端口(如80端口)可映射到宿主机的不同端口(如8080、8081),避免端口冲突,实现多服务并行运行。

(二)查看容器日志(docker logs

docker logs命令用于查看容器运行过程中产生的日志信息,包括应用的启动日志、访问日志、错误日志等,是容器问题排查与运维监控的重要工具。

1. 基本语法
docker logs [选项] 容器ID/容器名称
2. 常用选项(扩展)
  • -f(follow):实时跟踪日志输出,类似tail -f命令,容器产生新日志时会实时显示在终端。
  • -t(timestamp):在日志条目前添加时间戳,便于定位日志产生的时间。
  • --tail N:仅显示最后N行日志(如--tail 100显示最后100行)。
3. 操作示例

查看httpd2容器的日志(包括启动日志和访问日志):

[root@docker ~]# docker logs httpd2
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Tue Jun 14 14:21:31.100679 2022] [mpm_event:notice] [pid 1:tid 140464557473088] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Tue Jun 14 14:21:31.100752 2022] [core:notice] [pid 1:tid 140464557473088] AH00094: Command line: 'httpd -D FOREGROUND'
172.25.0.1 - - [14/Jun/2022:14:22:07 +0000] "GET / HTTP/1.1" 200 45
172.25.0.1 - - [14/Jun/2022:14:22:07 +0000] "GET /favicon.ico HTTP/1.1" 404 196

日志解读:

  • 前两行:httpd服务启动时的警告,提示未配置ServerName,可忽略或在配置文件中添加ServerName解决。
  • 中间两行:httpd服务启动成功的日志,显示服务版本(Apache/2.4.52)和启动命令。
  • 最后两行:访问日志,记录了来自172.25.0.1(宿主机IP)的两次请求:一次访问根路径(GET /),返回状态码200(成功);一次访问/favicon.ico(浏览器默认请求),返回状态码404(文件不存在)。

(三)查看容器详细信息(docker inspect

docker inspect命令用于查看容器的完整元数据信息,包括容器ID、创建时间、使用的镜像、网络配置、端口映射、挂载的卷、环境变量等,信息以JSON格式输出,适用于深入了解容器的配置细节。

1. 基本语法
docker inspect 容器ID/容器名称
2. 操作示例(部分输出)

查看httpd2容器的详细信息:

[root@docker ~]# docker inspect httpd2
[
{
"Id": "d5e5e991b5dc5becad63a8ba874c0ac583fea34a2b63081736aa2ea1f9d8ec6f",
"Created": "2022-06-14T14:21:30.823122786Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 12345,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-06-14T14:21:31.000000000Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:74d299993c8e21374e11391715a81706322042555201320d060685f8d2386622",
"ResolvConfPath": "/var/lib/docker/containers/d5e5e991b5dc.../resolv.conf",
"HostnamePath": "/var/lib/docker/containers/d5e5e991b5dc.../hostname",
"HostsPath": "/var/lib/docker/containers/d5e5e991b5dc.../hosts",
"LogPath": "/var/lib/docker/containers/d5e5e991b5dc.../d5e5e991b5dc-json.log",
"Name": "/httpd2",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
]
},
...
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "a1b2c3d4e5f6...",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
},
{
"HostIp": "::",
"HostPort": "8080"
}
]
},
"SandboxKey": "/var/run/docker/netns/a1b2c3d4e5f6...",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "e6f7g8h9i0j1...",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "f1e2d3c4b5a6...",
"EndpointID": "e6f7g8h9i0j1...",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
},
...
}
]

关键信息解读:

  • Id:容器的唯一ID。
  • Created:容器创建时间(UTC时间)。
  • State:容器当前状态(running表示运行中)、PID(进程ID)、启动时间等。
  • Image:容器使用的镜像ID。
  • HostConfig.PortBindings:端口映射配置,显示容器80端口映射到宿主机8080端口。
  • NetworkSettings.IPAddress:容器的内部IP地址(172.17.0.2)。
  • NetworkSettings.Gateway:容器所在网络的网关(宿主机的Docker网桥IP,172.17.0.1)。

(四)其他实用容器命令

1. 复制文件(docker container cp

docker container cp命令用于在宿主机与容器之间复制文件或目录,支持双向复制(宿主机→容器、容器→宿主机)。

2. 查看容器内文件变更(docker container diff

docker container diff命令用于查看容器创建后,其文件系统发生的变更(包括新增、修改、删除的文件/目录),有助于跟踪容器内的文件操作。

  • 基本语法:docker container diff 容器ID/容器名称
  • 输出符号含义:
    • A(Added):新增的文件/目录。
    • C(Changed):修改的文件/目录。
    • D(Deleted):删除的文件/目录。
  • 操作示例:
    [root@docker ~]# docker container diff d5e5e991b5dc
    A /tmp/data
    C /var/log/httpd/access_log
    表示容器内新增了/tmp/data目录,修改了/var/log/httpd/access_log日志文件。
3. 查看容器端口映射(docker container port

docker container port命令用于快速查看容器的端口映射关系,是docker psdocker inspect的简化版本。

  • 基本语法:docker container port 容器ID/容器名称 [容器端口]
  • 操作示例:
    # 查看所有端口映射
    [root@docker ~]# docker container port d5e5e991b5dc
    80/tcp -> 0.0.0.0:8080
    80/tcp -> :::8080
    # 查看指定容器端口的映射
    [root@docker ~]# docker container port d5e5e991b5dc 80
    0.0.0.0:8080
    :::8080

五、Docker容器应用实战:部署Web服务器

以Nginx(高性能HTTP和反向代理服务器)为例,详细介绍基于Docker容器部署Web服务器的完整流程,包括镜像获取、基础启动、数据卷挂载、自定义网页部署等步骤。

(一)步骤1:查找Nginx镜像

Docker Hub(https://hub.docker.com/)是Docker官方的镜像仓库,包含大量官方和社区维护的镜像。可通过docker search命令在Docker Hub上查找Nginx镜像。

(二)步骤2:获取Nginx镜像

通过docker pull命令从Docker Hub下载指定的Nginx镜像(默认下载latest标签,即最新版本)。

  • 操作示例:
    [root@docker ~]# docker pull nginx
    Using default tag: latest
    latest: Pulling from library/nginx
    a2abf6c4d29d: Pull complete
    a9edb18cadd1: Pull complete
    589b7251471a: Pull complete
    186b1aaa4aa6: Pull complete
    b4df32aa5a72: Pull complete
    a0bcbecc962e: Pull complete
    Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest
    # 查看下载的镜像
    [root@docker ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    nginx        latest    605c77e624dd   5 months ago   141MB

(三)步骤3:基础启动Nginx容器

基于下载的Nginx镜像,使用docker run命令启动一个基础的Nginx容器,并通过端口映射实现外部访问。

  • 操作示例:
    # 启动Nginx容器,映射宿主机80端口到容器80端口,命名为nginx-test
    [root@docker ~]# docker run --name nginx-test -p 80:80 -itd nginx:latest
    1552cf50adc8c8f0e60127eb1e366a329080aed8bab0378f497479041d9f36a3
    # 查看容器状态
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                NAMES
    1552cf50adc8   nginx:latest "/docker-entrypoint.…"   2 seconds ago    Up 1 second     0.0.0.0:80->80/tcp   nginx-test
    启动成功后,在浏览器中输入宿主机IP地址(如http://172.25.0.100),即可看到Nginx的默认欢迎页面(“Welcome to nginx!”)。

(四)步骤4:数据卷挂载(自定义配置与日志)

默认情况下,容器内的配置文件、日志文件、网页文件存储在容器内部,当容器被删除时,这些数据会丢失。通过数据卷挂载-v选项),可将容器内的关键目录映射到宿主机的目录,实现数据持久化存储,同时便于在宿主机上修改配置和查看日志。

1. 创建宿主机目录

在宿主机上创建三个目录,分别用于存储Nginx的网页文件、日志文件和配置文件:

[root@docker ~]# mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf
  • ~/nginx/www:映射为Nginx容器的网页根目录(默认/usr/share/nginx/html)。
  • ~/nginx/logs:映射为Nginx容器的日志目录(默认/var/log/nginx)。
  • ~/nginx/conf:映射为Nginx容器的配置文件目录(默认/etc/nginx)。
2. 拷贝容器内默认配置文件到宿主机

由于宿主机的~/nginx/conf目录为空,需先将容器内的默认Nginx配置文件拷贝到该目录,以便后续自定义修改:

# 拷贝容器内的nginx.conf到宿主机~/nginx/conf目录(容器ID为1552cf50adc8)
[root@docker ~]# docker cp 1552cf50adc8:/etc/nginx/nginx.conf ~/nginx/conf/
3. 启动挂载数据卷的Nginx容器

使用-v选项将宿主机目录与容器目录绑定,启动新的Nginx容器:

[root@docker ~]# docker run -itd -p 20000:80 --name nginx-test-1 \
-v ~/nginx/www:/usr/share/nginx/html \
-v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/nginx/logs:/var/log/nginx \
nginx:latest
bdea99be969900be48b5e7ff0b4d124273ba12adba570818c004438c5a89e803

选项解读:

  • -p 20000:80:映射宿主机20000端口到容器80端口。
  • --name nginx-test-1:容器名称为nginx-test-1
  • -v ~/nginx/www:/usr/share/nginx/html:宿主机~/nginx/www目录挂载到容器/usr/share/nginx/html(网页目录)。
  • -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:宿主机~/nginx/conf/nginx.conf文件挂载到容器/etc/nginx/nginx.conf(主配置文件)。
  • -v ~/nginx/logs:/var/log/nginx:宿主机~/nginx/logs目录挂载到容器/var/log/nginx(日志目录)。
4. 查看容器状态
[root@docker ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED             STATUS             PORTS                   NAMES
bdea99be9699   nginx:latest "/docker-entrypoint.…"   About a minute ago  Up About a minute  0.0.0.0:20000->80/tcp   nginx-test-1

(五)步骤5:自定义网页并访问

在宿主机的~/nginx/www目录下创建自定义网页文件,容器会自动加载该文件(因目录已挂载)。

  • 操作示例:

    # 进入宿主机网页目录
    [root@docker ~]# cd ~/nginx/www/
    # 创建自定义网页(使用vim编辑index.html)
    [root@docker www]# vim index.html
    # 在文件中输入以下内容并保存:
    welcome to luoqi!!!
  • 访问测试:
    在浏览器中输入http://172.25.0.100:20000,即可看到自定义的网页内容(“welcome to luoqi!!!”),表示Nginx容器已成功部署并加载自定义网页。

  • 日志查看:
    访问后,Nginx的访问日志会记录在宿主机的~/nginx/logs/access.log文件中,可通过以下命令查看:

    [root@docker ~]# cat ~/nginx/logs/access.log
    172.25.0.1 - - [14/Jun/2022:15:30:00 +0000] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"

    日志记录了访问IP、时间、请求方法、状态码等信息。

六、核心知识点总结

  1. 容器隔离本质:容器是运行中的进程,通过封装实现与主机及其他容器的隔离,核心隔离维度是专用文件系统(由Docker镜像提供)。
  2. 容器生命周期管理
    • 创建(docker create):生成停止状态的容器。
    • 启动(docker start):将停止的容器变为运行状态。
    • 运行(docker run):创建并启动容器(等价于create + start)。
    • 暂停/恢复(docker pause/unpause):冻结/解冻容器进程,不释放资源。
    • 停止(docker stop):终止容器进程,释放资源。
    • 删除(docker rm):默认删除停止的容器,-f强制删除运行中的容器。
  3. 进入容器的选择docker attach退出会停止容器(不推荐);docker exec退出不影响容器(推荐,需搭配-it)。
  4. 容器迁移:通过docker export导出容器为tar文件,docker import导入为镜像,实现跨系统迁移。
  5. 端口映射-P随机映射容器暴露端口,-p 宿主机端口:容器端口自定义映射,解决外部访问容器服务的问题。
  6. 镜像与容器的关系:类似“类与实例”,镜像是静态模板,容器是动态运行实体。
  7. 数据持久化:通过-v选项挂载数据卷,将容器内目录映射到宿主机,避免容器删除导致数据丢失,便于配置修改和日志查看。
  8. 常用命令熟练掌握:包括runexecstoprmstartcplogsinspect等,是容器管理的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Groovy】Groovy环境搭建

1 前言 ​ Groovy 是一种基于 JVM 平台的敏捷且动态的编程语言,能与 Java 无缝集成。该语言由 James Stracham 和 Bob McWhirter 于 2003 年启动开发,在 2007 年 1 月发布第一个版本。 ​ Groovy 具有以下优势…

php 网站 发布优对 网站开发

摘要:沈海军:今天(2019年4月10日)下午接受广东卫视采访,就晚上21:00即将发布的人类首张黑洞照片发表了评论。提笔撰稿时,尚未到照片官方的发布时间,故不能一睹黑洞照片的芳容,但鉴于…

做网站分页垦利网站定制

# -*- coding: utf-8 -*- z0 def numbersize(a,b):global zif(a>b):zaelif(a<b):zbelif(ab):zaelse:z99return z

2025年TAB拉链制造商权威推荐榜:创新设计与耐用品质口碑

2025年TAB拉链制造商权威推荐榜:创新设计与耐用品质口碑 在纺织辅料行业快速发展的今天,TAB拉链作为功能性与装饰性并重的重要配件,其技术创新与品质标准已成为衡量制造商实力的关键指标。随着新材料应用与智能制造…

变量类型

isinstance() isinstance(object, classinfo) 是一个 Python 内置函数,用于判断一个对象 (object) 是否是某个类或其子类的实例,或者是否属于 classinfo 参数指定的类型或元组中的一种类型。它返回 True 或 False,并…

VMware Cloud Foundation 9.0.1.0 发布 - 领先的多云平台

高效管理虚拟机 (VM) 和容器工作负载,为本地部署的全栈超融合基础架构 (HCI) 提供云的优势。VMware Cloud Foundation 9.0.1.0 发布 - 领先的多云平台 高效管理虚拟机 (VM) 和容器工作负载,为本地部署的全栈超融合基…

velero 备份及使用方法

1、安装velero wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.0/velero-v1.17.0-linux-amd64.tar.gz tar -xzf velero-v1.17.0-linux-amd64.tar.gz cd velero-v1.17.0-linux-amd64 cp velero…

CT5132 Program. Tools for AI:-week4 note

CT5132 Program. & Tools for AI:-week4 noteNumpy: Multidimensional Arrays and Fancy Indexing 标题解析:NumPy: Multidimensional Arrays and Fancy Indexing 🧠 NumPy 是什么? NumPy(Numerical Python)…

Fluttercon EU 2025 :Let‘s go far with Flutter - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

洛谷月赛T1 P14081 「CZOI-R7」炸弹游戏

洛谷月赛T1 P14081 「CZOI-R7」炸弹游戏竟然做了一晚上才AC 发题解警示自己犯糖 一道思维题,推公式即可首先手玩一下样例发现 m=1,m=2均无法成功,直接输出 如果大于2一定存在范围[L,R]可以胜利 对于最小值,不难想…

io的异步处理io_uring,实现io_uring_tcp_server - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网络舆情应对措施seo推广教程seo推广技巧

1、什么是多态性&#xff1f;什么是虚拟方法调用&#xff1f; 对象的多态性&#xff1a; Person p new xx(); 此时new的对象可以为多种形态&#xff0c;但需要是person类的子类。即父类的引用指向子类的对象。 虚拟方法调用: p.eat(); 该语句在编译时会认为时调用Person类中的…

VMware NSX 4.2.3.1 发布,新增功能概览

VMware NSX 4.2.3.1 - 网络安全虚拟化平台VMware NSX 4.2.3.1 发布,新增功能概览 VMware NSX 4.2.3.1 - 网络安全虚拟化平台 构建具有网络连接和安全性的云智能网络,跨多种云环境支持一致的策略、运维和自动化。 请访…

Claude Code V2集成KAT-Coder

Claude Code V2集成KAT-CoderClaude Code V2安装Anthropic于2025年9月29日正式发布了Claude Code的重大版本更新(v2.0),并推出了Claude Sonnet 4.5模型。Anthropic是一家人工智能公司,由OpenAI前员工创立,致力于开…

用wordpress做微站企业网站 jquery

多重继承派生类 除去一个类从一个基类派生&#xff0c;C还支持一个派生类同时继承多个基类 MI&#xff1a;有多个直接基类的类 1.多重继承派生类的定义 如果已经定义了多个基类&#xff0c;那么定义多重继承的派生类的形式为&#xff1a; class 派生类名:访问标号1 基类名…

Ceph 分布式存储学习笔记(一):介绍、部署与集群设置(上)

Ceph 分布式存储学习笔记(一):介绍、部署与集群设置(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

不让在建设门户网站wordpress 无法将上传的文件移动至

DP——动态规划 动态规划算法动态规划的一般步骤特殊DP——背包0-1背包问题完全背包问题 总结 动态规划算法 当涉及到解决具有重叠子问题的优化问题时&#xff0c;动态规划是一种常用的算法技术。它通过将问题分解为一系列重叠子问题&#xff0c;并使用递归或迭代的方式来解决…

VMware Aria Suite Lifecycle 8.18 Patch 5 发布,新增功能概览

VMware Aria Suite Lifecycle 8.18 Patch 5 发布,新增功能概览VMware Aria Suite Lifecycle 8.18 Patch 5 发布,新增功能概览 VMware Aria Suite Lifecycle 8.18 - 应用生命周期管理 请访问原文链接:https://sysin.…

阿里云的国际网站建设中山市企业网站seo哪家好

更新&#xff1a; 在上一篇文章中&#xff0c;我们介绍了如何聚合SDK的基本原理&#xff0c;介绍了聚合SDK的接口设计&#xff0c;那么当CP接入了我们的聚合SDK&#xff0c;给了我们游戏apk包时&#xff0c;这时我们又当如何分发渠道包呢&#xff1f; 分发渠道包&#xff1a;…

P3977 [TJOI2015] 棋盘题解

题目描述 有个 \(n\) 行 \(m\) 列的棋盘,棋盘上可以放许多棋子。每个棋子的攻击范围是 \(3\) 行 \(p\) 列。输入数据用一个 \(3\times p\) 的矩阵给出了棋子攻击范围的模板,棋子被默认为模板中的第 \(2\) 行,第 \(k…