Linux:这啥命令?这台服务器我说了算-Docker 容器——“在我电脑上明明能跑!”

举报
yd_240046519 发表于 2026/11/11 10:10:03 2026/11/11
【摘要】 第十六章:Docker 容器——“在我电脑上明明能跑!”程序员最怕听到的一句话:“你这程序怎么部署就报错?”开发机运行正常,服务器却缺依赖、版本不对、端口冲突……Docker 的思路是:把程序和运行环境一起打包,减少“换台机器就翻车”。本章环境:Ubuntu 服务器,已具备 sudo 权限和网络连接。命令中的容器名称和端口可按需调整。 1. 镜像、容器,到底谁是谁?镜像(Image):运行...

第十六章:Docker 容器——“在我电脑上明明能跑!”

程序员最怕听到的一句话:“你这程序怎么部署就报错?”

开发机运行正常,服务器却缺依赖、版本不对、端口冲突……Docker 的思路是:把程序和运行环境一起打包,减少“换台机器就翻车”。

本章环境:Ubuntu 服务器,已具备 sudo 权限和网络连接。命令中的容器名称和端口可按需调整。

1. 镜像、容器,到底谁是谁?

  • 镜像(Image):运行程序的“模板”,包含应用及所需文件。
  • 容器(Container):镜像运行起来的实例。
  • 仓库(Registry):存放和分发镜像的地方,如 Docker Hub。

打个比方:镜像是菜谱,容器是按菜谱做出的菜。一份菜谱能做很多份菜,但菜吃完,菜谱还在。

容器不是完整的虚拟机;它通常共享宿主机内核,启动更轻量,但不等于绝对隔离。

2. 装 Docker:先把厨房搭起来

推荐按Docker官方Ubuntu安装文档配置软件源,随后安装 Docker Engine 和 Compose 插件:

sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

已有 docker.io 等旧包的机器,先按官方文档处理冲突,不要把不同来源的 Docker 包混装。

检查服务并试运行:

sudo systemctl status docker
sudo docker run --rm hello-world
sudo docker compose version

看到欢迎信息,说明“小企鹅的集装箱码头”开张了。

3. 三行命令,跑起一个网站

sudo docker pull nginx:stable-alpine
sudo docker run -d --name penguin-web \
  -p 127.0.0.1:8080:80 nginx:stable-alpine
curl -I http://127.0.0.1:8080

这里:

  • -d:在后台运行;
  • --name:给容器起名字;
  • -p 127.0.0.1:8080:80:把宿主机本地的 8080 映射到容器的 80。

本例仅供本机访问,避免练习时意外公开网站。若需要从其他设备访问,还要考虑监听地址、防火墙和云安全组。

4. 容器出了问题,别急着“重装宇宙”

sudo docker ps             # 正在运行的容器
sudo docker ps -a          # 包括已停止的容器
sudo docker logs penguin-web
sudo docker logs -f penguin-web
sudo docker exec -it penguin-web sh

进入容器后输入 exit 退出。注意:exec 需要容器正在运行。

管理生命周期:

sudo docker stop penguin-web
sudo docker start penguin-web
sudo docker restart penguin-web
sudo docker stop penguin-web
sudo docker rm penguin-web

stop 是关机,rm 是删除容器。删除容器不等于删除镜像。

5. 数据持久化:别把网站和容器一起扔了

默认情况下,写在容器可写层里的数据,删容器时可能一起消失。先准备宿主机目录:

mkdir -p ~/docker-lab/site
printf '<h1>Linux 小企鹅上线!</h1>\n' \
  > ~/docker-lab/site/index.html

把目录挂载到容器中:

sudo docker run -d --name penguin-web \
  -p 127.0.0.1:8080:80 \
  -v "$HOME/docker-lab/site:/usr/share/nginx/html:ro" \
  nginx:stable-alpine
curl http://127.0.0.1:8080

-v 是绑定挂载,:ro 表示容器内只读。即使删除容器,宿主机上的 index.html 仍在。

挂载不是备份! 宿主机文件被误删或损坏,容器不会帮你变回来。

6. Dockerfile:做一份自己的镜像

不想每次手动挂载页面?用 Dockerfile 将页面写进镜像。

在 ~/docker-lab/site 下新建 Dockerfile:

FROM nginx:stable-alpine
COPY index.html /usr/share/nginx/html/index.html

构建并运行:

cd ~/docker-lab/site
sudo docker build -t penguin-site:1.0 .
sudo docker run -d --name penguin-built \
  -p 127.0.0.1:8081:80 penguin-site:1.0
curl http://127.0.0.1:8081

现在 penguin-site:1.0 就是你的自制镜像。这里的 . 表示以当前目录作为构建上下文。

7. Compose:多条命令写成配置

创建 compose.yaml:

services:
  web:
    image: nginx:stable-alpine
    ports:
      - "127.0.0.1:8082:80"
    volumes:
      - ./index.html:/usr/share/nginx/html/index.html:ro

在该文件目录执行:

sudo docker compose up -d
curl http://127.0.0.1:8082
sudo docker compose ps
sudo docker compose down

Compose 特别适合以后同时管理 Web、数据库等多个服务。down 默认不会清除命名卷;加 -v 才会删除相关卷,别随手乱加。

8. 新手避坑与本章挑战

记住三件事:不要随意开放端口;不要随意删除卷;不要把不可信镜像当成安全软件。另外,加入 docker 用户组近似获得宿主机 root 级权限,本系列先使用 sudo docker。

请自己完成一次闭环:

  1. 用 Docker 运行 Nginx;查看容器与日志。
  2. 修改宿主机的 index.html,刷新页面观察变化。
  3. 用 Dockerfile 构建个人镜像,换端口启动。
  4. 用 Compose 启动、查看、关闭服务。
  5. 检查容器删除后,宿主机文件是否还在。

速查命令:

sudo docker images
sudo docker ps -a
sudo docker logs 容器名
sudo docker exec -it 容器名 sh
sudo docker stop 容器名
sudo docker rm 容器名
sudo docker build -t 名称:版本 .
sudo docker compose up -d
sudo docker compose down

至此,你已经从“我电脑上能跑”升级成了“我知道该怎么打包给别人跑”。

下一章:《第十七章:Nginx 反向代理——“一个门卫,怎么接待八百个网站?”》

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。