Docker容器完全操作指南
一、课程目标
本课程围绕Docker容器技术展开,旨在帮助学习者达成以下两大核心目标:
- 熟练掌握Docker容器的操作:全面理解容器的创建、启动、运行、暂停、恢复、停止、进入、删除、导入、导出等基础操作,以及端口映射、日志查看、文件复制等进阶操作,能够独立完成容器生命周期内的各类管理任务。
- 深入理解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 /]#
),表示已进入容器内部,可执行ls
、pwd
等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
命令用于暂停运行中的容器,暂停后容器的进程会被冻结,资源占用保持当前状态,但不会释放。
- 基本语法:
docker pause 容器ID/容器名称
- 操作示例:
# 查看当前运行的容器 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a6831bba185 centos:7 "/bin/bash" 20 minutes ago Up 16 minutes exciting_wilbur # 暂停容器 [root@docker ~]# docker pause 8a6831bba185 8a6831bba185 # 再次查看容器状态,STATUS显示为Paused [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a6831bba185 centos:7 "/bin/bash" 20 minutes ago Up 17 minutes (Paused) exciting_wilbur
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 attach
与docker exec
)
当容器以后台模式(-d
)启动时,若需进入容器内部执行命令,可使用docker attach
或docker exec
命令。两者的核心区别在于退出容器后的容器状态。
1. docker attach
(不推荐)
docker attach
命令通过连接容器的标准输入/输出/错误流(STDIO)进入容器,但退出容器(如执行exit
)时,会导致容器自动停止,因此仅适用于临时调试,不推荐用于生产环境。
- 基本语法:
docker attach 容器ID/容器名称
- 操作示例:
# 启动一个后台容器(以httpd为例) [root@docker ~]# docker run -itd --name test-httpd httpd:latest /bin/bash e710eb97bcbc # 使用attach进入容器 [root@docker ~]# docker attach test-httpd [root@e710eb97bcbc /]# # 退出容器 [root@e710eb97bcbc /]# exit exit # 查看容器状态,已停止 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e710eb97bcbc httpd:latest "/bin/bash" 53 seconds ago Exited (0) 21 seconds ago test-httpd
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. 删除停止的容器
- 基本语法:
docker rm 容器ID/容器名称
- 操作示例:
# 查看当前运行的容器 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82aec4e96622 httpd:latest "/bin/bash" 3 minutes ago Up 3 minutes 80/tcp httpd # 先停止容器 [root@docker ~]# docker stop httpd httpd # 删除停止的容器 [root@docker ~]# docker rm httpd httpd # 查看容器列表,已无该容器 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
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
查看。
- 基本语法:
docker run -itd -P --name 容器名称 镜像名称:标签
- 操作示例:
输出结果中,# 基于httpd:latest镜像启动容器,使用-P映射随机端口 [root@docker ~]# docker run --name httpd -itd -P httpd:latest 7524a276c8534e09c3081cef8774bee81d99bf20dcbb8988d510630412a0da9c # 查看端口映射关系 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7524a276c853 httpd:latest "/usr/local/bin/ht…" 5 seconds ago Up 4 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp httpd
PORTS
列显示0.0.0.0:49154->80/tcp
,表示宿主机的49154端口已映射到容器的80端口。此时可通过宿主机的IP地址+49154端口访问容器内的httpd服务(如在浏览器中输入http://172.25.0.100:49154
,会显示“It works!”页面)。
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
命令用于在宿主机与容器之间复制文件或目录,支持双向复制(宿主机→容器、容器→宿主机)。
- 基本语法:
# 宿主机文件/目录 → 容器 docker container cp 宿主机路径 容器ID/容器名称:容器内路径 # 容器文件/目录 → 宿主机 docker container cp 容器ID/容器名称:容器内路径 宿主机路径
- 操作示例:
将宿主机的data
目录复制到d5e5e991b5dc
容器的/tmp
目录下:
(复制完成后,可通过[root@docker ~]# docker container cp data d5e5e991b5dc:/tmp
docker exec -it d5e5e991b5dc ls /tmp
查看是否复制成功)
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 ps
或docker 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镜像。
- 操作示例:
输出结果中,[root@docker ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 16944 [OK] linuxserver/nginx An Nginx container, brought to you by LinuxS… 169 [OK] ...
OFFICIAL
列标记为[OK]
的是官方镜像(如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容器,并通过端口映射实现外部访问。
- 操作示例:
启动成功后,在浏览器中输入宿主机IP地址(如# 启动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
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、时间、请求方法、状态码等信息。
六、核心知识点总结
- 容器隔离本质:容器是运行中的进程,通过封装实现与主机及其他容器的隔离,核心隔离维度是专用文件系统(由Docker镜像提供)。
- 容器生命周期管理:
- 创建(
docker create
):生成停止状态的容器。 - 启动(
docker start
):将停止的容器变为运行状态。 - 运行(
docker run
):创建并启动容器(等价于create + start
)。 - 暂停/恢复(
docker pause/unpause
):冻结/解冻容器进程,不释放资源。 - 停止(
docker stop
):终止容器进程,释放资源。 - 删除(
docker rm
):默认删除停止的容器,-f
强制删除运行中的容器。
- 创建(
- 进入容器的选择:
docker attach
退出会停止容器(不推荐);docker exec
退出不影响容器(推荐,需搭配-it
)。 - 容器迁移:通过
docker export
导出容器为tar文件,docker import
导入为镜像,实现跨系统迁移。 - 端口映射:
-P
随机映射容器暴露端口,-p 宿主机端口:容器端口
自定义映射,解决外部访问容器服务的问题。 - 镜像与容器的关系:类似“类与实例”,镜像是静态模板,容器是动态运行实体。
- 数据持久化:通过
-v
选项挂载数据卷,将容器内目录映射到宿主机,避免容器删除导致数据丢失,便于配置修改和日志查看。 - 常用命令熟练掌握:包括
run
、exec
、stop
、rm
、start
、cp
、logs
、inspect
等,是容器管理的基础。