Linux:这啥命令?这台服务器我说了算-Docker 容器——“在我电脑上明明能跑!”
第十六章: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。
请自己完成一次闭环:
- 用 Docker 运行 Nginx;查看容器与日志。
- 修改宿主机的
index.html,刷新页面观察变化。 - 用 Dockerfile 构建个人镜像,换端口启动。
- 用 Compose 启动、查看、关闭服务。
- 检查容器删除后,宿主机文件是否还在。
速查命令:
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 反向代理——“一个门卫,怎么接待八百个网站?”》
- 点赞
- 收藏
- 关注作者
评论(0)