Docker 入门:用容器跑第一个 Web 服务
为什么是容器?
每个开发者大概都遇到过这种尴尬:在自己电脑上跑得好好的程序,搬到服务器上就罢工——缺依赖、版本对不上、环境变量没配。传统做法是写一份长长的部署文档,而 Docker 给出的答案更干脆:把程序连同它依赖的环境一起打包成一个"集装箱",走到哪里搬到哪里。
镜像(Image)是这个"集装箱"的蓝图,容器(Container)是按蓝图真正运行起来的实例。概念先放一边,我们直接动手,把第一个 Web 服务跑起来。
第一步:安装 Docker
Linux 服务器上安装 Docker 非常简单:
curl -fsSL https://get.docker.com | sh
sudo systemctl start docker
docker --version
看到版本号输出,就说明 Docker 已经就绪。Windows 和 macOS 用户可以直接安装 Docker Desktop,图形化界面更友好。
第二步:先跑一个 Hello World 热热身
docker run hello-world
别小看这一行命令,它背后发生了三件事:本地没有 hello-world 镜像,Docker 自动去默认仓库拉取;下载完成后创建容器;容器运行并打印欢迎信息后退出。拉取、创建、运行,一气呵成。
第三步:用 Nginx 跑真正的 Web 服务
光打印一句话不过瘾,我们跑一个真正对外提供服务的 Nginx:
docker run -d --name my-web -p 8080:80 nginx
参数逐个拆开看:
-d:后台运行,不占用当前终端;--name my-web:给容器起个名字,后续管理更方便;-p 8080:80:端口映射,把宿主机的 8080 端口映射到容器内的 80 端口,这是容器与外界通信的关键;nginx:使用的镜像名称。
执行后在浏览器访问 http://服务器IP:8080,熟悉的 Nginx 欢迎页出现了。你的第一个容器化 Web 服务,正式上线。
第四步:学会管理容器
服务跑起来只是开始,日常管理离不开几个高频命令:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,包括已停止的
docker logs my-web # 查看容器日志,排查问题全靠它
docker stop my-web # 停止容器
docker start my-web # 重新启动容器
docker rm my-web # 删除容器(需先 stop)
docker images # 查看本地已下载的镜像
记住一个重要原则:容器应该是"一次性的",重要数据不要只放在容器里,持久化要靠数据卷(volume)。
第五步:把自己的页面装进容器
默认欢迎页太单调,换成我们自己的页面。先写一个简单的 index.html:
<!DOCTYPE html>
<html>
<body>
<h1>你好,Docker!</h1>
<p>这是我的第一个容器化页面。</p>
</body>
</html>
用数据卷挂载的方式替换 Nginx 默认页面:
docker run -d --name my-page -p 8081:80 \
-v $(pwd)/index.html:/usr/share/nginx/html/index.html:ro nginx
浏览器访问 8081 端口,「你好,Docker!」出现了。-v 把宿主机文件映射进容器,修改本地文件后重启容器即生效,开发调试非常顺手。
新手常踩的四个坑
- 端口被占用:启动时报
port is already allocated,说明宿主机端口已被占用,换一个-p冒号前面的端口即可。 - 容器一起就退出:用
docker logs 容器名看日志,多半是启动命令或配置写错了。 - 镜像拉取太慢:默认仓库在境外,配置国内镜像加速器后速度能快一个数量级。
- 容器里的数据丢了:容器删除数据就没了,重要数据一定要用
-v挂载到宿主机。
写在最后
从一条 docker run 开始,你已经掌握了容器最核心的工作流:拉镜像、跑容器、映射端口、管理生命周期。下一步可以尝试自己写 Dockerfile,把应用打包成专属镜像,那就真正推开了容器化的大门。动手试试吧,当第一个 Web 服务在容器里跑起来的那一刻,你会发现部署原来可以这么简单。
- 点赞
- 收藏
- 关注作者
评论(0)