为什么要学 Docker

上课学了 Linux,装环境一直是噩梦——MySQL、Redis、Nginx,每个都要手动配置,卸载还不干净。Docker 解决的问题很简单:一次构建,到处运行。装个 Nginx 不用编译源码,一条命令就搞定。

安装 Docker

阿里云轻量应用服务器,系统是 Rocky Linux 8.x,全程用 root。

# 卸载旧版本
dnf remove docker docker-engine docker.io containerd runc

# 安装依赖
dnf install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 官方源(国内用阿里云镜像)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动并设置开机自启
systemctl start docker
systemctl enable docker

# 验证安装
docker --version

这里有个坑:Rocky Linux 的防火墙默认开启,拉镜像如果慢,配一下镜像加速器。

# 配置阿里云镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker

运行第一个 Nginx 容器

# 拉取镜像
docker pull nginx:alpine

# 运行容器(前台)
docker run --name my-nginx -p 8080:80 nginx:alpine

-p 8080:80 把宿主机 8080 端口映射到容器内 80 端口。浏览器访问 http://服务器IP:8080,看到 Nginx 欢迎页就算成功了。

生产环境要后台运行,用 -d(detach):

docker run -d --name my-nginx -p 8080:80 nginx:alpine

常用命令速查

命令作用
docker ps查看运行中的容器
docker ps -a查看所有容器(含已停止的)
docker images查看本地镜像列表
docker stop <容器名>停止容器
docker start <容器名>启动已停止的容器
docker rm <容器名>删除容器(需先停止)
docker rmi <镜像名>删除镜像
docker logs <容器名>查看容器日志
docker exec -it <容器名> sh进入容器内部(交互式)

最常用的组合——进容器看文件:

docker exec -it my-nginx sh
# 进去后可以 ls、cat 配置文件,调试完 exit 退出

个人体会

学 Docker 最关键的是理解镜像和容器的关系:镜像是模板(类比 Python 的类),容器是运行实例(类比对象)。刚开始容易混淆 docker rmdocker rmi,记法:rm 删容器(container),rmi 删镜像(image),多了一个 i。

下一阶段准备学 Docker Compose,把前后端和数据库一次编排起来。