Docker实战:从镜像管理到Nginx容器部署与访问全流程

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

  1. 进入主机挂载目录/some/content
[root@localhost ~]# cd /some/content
[root@localhost content]# ls  # 初始为空
  1. 创建并编辑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,无需重启容器。验证步骤:

  1. 检查容器内文件是否同步(通过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  # 主机创建的文件已同步到容器
  1. 再次访问容器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容器创建,到目录挂载、端口映射、页面访问的全流程,核心知识点如下:

  1. 镜像管理docker images查看镜像,docker save -o保存镜像(需指定正确标签);
  2. 容器创建docker run是核心命令,-d后台运行,--name指定名称;
  3. 目录挂载-v 主机目录:容器目录实现文件同步,解决容器内文件修改难题;
  4. 端口映射-p 主机端口:容器端口让外部可访问容器服务;
  5. 常见问题:403错误需添加index.html;命令错误(如缺少空格)会导致执行失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值