Docker实战:从镜像管理到Nginx容器部署与访问全流程
在Docker的日常使用中,镜像管理、容器创建以及服务访问是核心操作。本文将通过实际操作案例,带你从基础的镜像保存,到Nginx容器的部署、目录挂载,再到页面访问验证,完整走一遍Docker应用流程,适合新手参考学习。
一、Docker镜像基础操作:查看与保存
镜像作为Docker容器的“模板”,掌握其基本管理是入门第一步。我们可以通过docker image
相关命令查看、保存镜像。
1. 查看镜像相关命令
执行docker image
可查看所有镜像管理命令,包括ls
(查看镜像)、save
(保存镜像)、pull
(拉取镜像)等:
[root@localhost ~]# docker image
Usage: docker image COMMAND
# 以下为常用命令(省略部分)
Commands:
ls List images # 列出本地镜像
save Save one or more images to a tar archive # 保存镜像为tar包
pull Download an image from a registry # 从仓库拉取镜像
rm Remove one or more images # 删除镜像
2. 查看本地镜像
用docker images
命令可查看当前已下载的镜像,包括仓库名、标签、ID、创建时间和大小:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 22bd15417453 8 days ago 192MB # Nginx最新版镜像
centos 7 eeb6ee3f44bd 3 years ago 204MB # CentOS 7镜像
3. 保存镜像为本地文件
如果需要备份或迁移镜像,可使用docker save -o [输出文件名] [镜像名:标签]
命令。例如保存centos:7
镜像:
# 错误尝试:镜像标签不存在会报错
[root@localhost ~]# docker save -o centos_test.tar centos:test
Error response from daemon: reference does not exist
# 正确操作:指定存在的镜像标签(centos:7)
[root@localhost ~]# docker save -o centos_test.tar centos:7
# 查看保存结果:当前目录下出现centos_test.tar
[root@localhost ~]# ls
centos_test.tar # 保存成功的镜像文件
注意:
docker save
需要指定存在的镜像标签(如centos:7
),标签错误会导致“reference does not exist”错误。
二、Nginx容器部署:创建、挂载与验证
掌握镜像操作后,我们以Nginx为例,实战容器的创建、目录挂载(实现主机与容器文件同步),并解决访问中的常见问题。
1. 创建Nginx容器并挂载目录
通过docker run
命令创建容器时,可通过-v
参数将主机目录挂载到容器内,实现文件共享。例如创建一个名为nginx_test
的Nginx容器,挂载主机/some/content
目录到容器Nginx网页目录:
[root@localhost ~]# docker run -d --name nginx_test -v /some/content:/usr/share/nginx/html:ro nginx:latest
e50db7cd44ea0f9b08eab82e35b50d74ed319cca1bca9d9c3d1e9a10224521e7
-d
:后台运行容器;--name nginx_test
:指定容器名为nginx_test
;-v /some/content:/usr/share/nginx/html:ro
:主机/some/content
目录挂载到容器/usr/share/nginx/html
(Nginx默认网页目录),ro
表示容器内只读(文件只能在主机修改);nginx:latest
:使用最新版Nginx镜像。
2. 查看容器状态
用docker ps -a
查看容器是否正常运行:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e50db7cd44ea nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp nginx_test # 状态为Up,说明运行正常
18c1c73a2614 centos:7 "bash" 23 hours ago Exited ... c1
3. 解决Nginx访问403错误:添加首页文件
容器创建后,直接访问可能出现403错误(因为挂载目录下没有Nginx默认首页index.html
):
# 查看容器IP(通过docker inspect过滤IPAddress)
[root@localhost ~]# docker inspect e50 | grep IPAddress
"IPAddress": "172.17.0.2", # 容器IP
# 访问容器Nginx服务:出现403(无首页文件)
[root@localhost ~]# curl http://172.17.0.2
<html>
<head><title>403 Forbidden</title></head>
<body><center><h1>403 Forbidden</h1></center></body>
</html>
解决方法:在主机挂载目录添加index.html
- 进入主机挂载目录
/some/content
:
[root@localhost ~]# cd /some/content
[root@localhost content]# ls # 初始为空
- 创建并编辑
index.html
(添加简单页面内容):
[root@localhost content]# touch index.html
[root@localhost content]# vim index.html # 编辑内容(示例如下)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
<style>body {text-align: center; margin-top: 50px;}</style>
</head>
<body>
<h1>Hello, Nginx!</h1>
<p>这是通过Docker挂载目录显示的页面</p>
<!-- 加入JS实时显示时间 -->
<p>当前时间: <span id="time"></span></p>
<script>
function updateTime() {
document.getElementById('time').textContent = new Date().toLocaleString();
}
updateTime();
setInterval(updateTime, 1000);
</script>
</body>
</html>
4. 验证文件同步与访问
Nginx会自动读取挂载目录的index.html
,无需重启容器。验证步骤:
- 检查容器内文件是否同步(通过
docker exec
进入容器查看):
# 错误示例:命令缺少空格导致失败(ls和路径间需空格)
[root@localhost content]# docker exec -it nginx_test ls/usr/share/nginx/html
OCI runtime exec failed: exec: "ls/usr/share/nginx/html": no such file or directory
# 正确命令:ls后加空格
[root@localhost content]# docker exec -it nginx_test ls /usr/share/nginx/html
index.html # 主机创建的文件已同步到容器
- 再次访问容器Nginx服务:页面正常显示
[root@localhost content]# curl http://172.17.0.2
# 输出结果:完整显示刚才编写的index.html内容(成功解决403错误)
三、容器端口映射:让外部访问Nginx服务
默认创建的容器只能在主机内部访问,若需通过浏览器等外部工具访问,需添加端口映射(将主机端口与容器端口绑定)。
1. 创建带端口映射的Nginx容器
用-p 主机端口:容器端口
参数创建容器,例如将主机80端口映射到容器80端口(Nginx默认端口):
[root@localhost content]# docker run -d -p 80:80 --name nginx_port -v /some/content-port:/usr/share/nginx/html:ro nginx:latest
c49e493172a72ed419b7d51eee047e3e0d9b189095e649285e71f445ff4138de
-p 80:80
:主机80端口映射到容器80端口,外部访问主机IP:80
即可指向容器Nginx。
2. 同步页面文件到新挂载目录
新容器挂载了/some/content-port
目录,需将index.html
复制到该目录(确保页面可访问):
[root@localhost content]# cp index.html /some/content-port/ # 复制文件到新挂载目录
3. 验证外部访问(浏览器访问)
在本地浏览器输入http://主机IP
(因映射了80端口,无需加端口),即可看到index.html
页面内容,实现从“主机内部访问”到“外部浏览器访问”的跨越。
四、总结与关键知识点
本文通过实际操作,完成了从Docker镜像保存、Nginx容器创建,到目录挂载、端口映射、页面访问的全流程,核心知识点如下:
- 镜像管理:
docker images
查看镜像,docker save -o
保存镜像(需指定正确标签); - 容器创建:
docker run
是核心命令,-d
后台运行,--name
指定名称; - 目录挂载:
-v 主机目录:容器目录
实现文件同步,解决容器内文件修改难题; - 端口映射:
-p 主机端口:容器端口
让外部可访问容器服务; - 常见问题:403错误需添加
index.html
;命令错误(如缺少空格)会导致执行失败。