容器技术概述
什么是容器?
容器是一种轻量级的虚拟化技术,它允许我们将应用程序及其依赖项打包到一个标准化的单元中,以便在任何环境中一致地运行。与传统虚拟机不同,容器共享主机操作系统内核,因此更加轻量、启动更快,并且资源占用更低。
Docker 的核心概念
- 镜像(Image):只读的模板,包含运行应用程序所需的所有文件和配置
- 容器(Container):镜像的运行实例,可以被创建、启动、停止、删除
- 仓库(Repository):存储镜像的地方,如 Docker Hub
- Dockerfile:用于构建镜像的文本文件,包含一系列命令
- Docker Compose:用于定义和运行多容器 Docker 应用程序的工具
Docker 安装与配置
在 Ubuntu 系统上安装 Docker
# 更新包索引
apt-get update
# 安装依赖包
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# 添加 Docker 稳定版仓库
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新包索引并安装 Docker
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
# 验证 Docker 是否安装成功
docker --version
# 运行 hello-world 容器验证安装
docker run hello-world
在 CentOS 系统上安装 Docker
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务并设置开机自启
systemctl start docker
systemctl enable docker
# 验证 Docker 是否安装成功
docker --version
配置 Docker 镜像加速
由于网络原因,我们可以配置 Docker 镜像加速器来提高镜像拉取速度:
# 创建或编辑 Docker 配置文件
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
# 重启 Docker 服务
systemctl daemon-reload
systemctl restart docker
Docker 容器基础操作
镜像管理
# 拉取镜像
docker pull ubuntu:20.04
# 查看本地镜像
docker images
# 删除镜像
docker rmi ubuntu:20.04
# 查找镜像
docker search nginx
# 构建镜像
docker build -t my-nginx .
容器管理
# 运行容器
docker run -d --name my-nginx -p 80:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 删除容器
docker rm my-nginx
# 进入容器
docker exec -it my-nginx /bin/bash
容器网络
# 创建网络
docker network create my-network
# 运行容器时指定网络
docker run -d --name my-nginx --network my-network nginx
# 查看网络
docker network ls
# 查看网络详情
docker network inspect my-network
容器数据持久化
# 使用卷
docker volume create my-volume
docker run -d --name my-nginx -v my-volume:/usr/share/nginx/html nginx
# 使用绑定挂载
docker run -d --name my-nginx -v /host/path:/container/path nginx
# 查看卷
docker volume ls
实战:部署一个完整的 Web 应用
步骤 1:创建 Dockerfile
FROM node:14-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["npm", "start"]
步骤 2:构建镜像
docker build -t my-node-app .
步骤 3:运行容器
docker run -d --name my-node-app -p 3000:3000 my-node-app
步骤 4:验证应用
# 查看容器状态
docker ps
# 查看容器日志
docker logs my-node-app
# 测试应用
curl http://localhost:3000
容器监控与管理
使用 Docker 内置命令监控
# 查看容器资源使用情况
docker stats
# 查看容器详细信息
docker inspect my-container
# 查看容器日志
docker logs -f my-container
使用 Portainer 进行图形化管理
# 运行 Portainer
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
然后通过浏览器访问 http://localhost:9000 即可使用 Portainer 管理 Docker 环境。
常见问题与解决方案
1. 容器启动失败
问题:容器启动后立即退出,查看日志显示错误。
解决方案:
- 查看容器日志:
docker logs container-name - 检查端口是否被占用:
netstat -tulpn | grep port - 检查挂载卷权限:确保主机目录有正确的权限
2. 镜像拉取缓慢
问题:docker pull 命令执行缓慢,甚至超时。
解决方案:
- 配置镜像加速器(如前面所述)
- 使用国内镜像源,如阿里云、腾讯云等
- 考虑使用 Docker 镜像代理服务
3. 容器网络连接问题
问题:容器之间无法通信,或无法访问外部网络。
解决方案:
- 检查容器网络配置:
docker network inspect network-name - 确保容器在同一个网络中
- 检查主机防火墙设置
最佳实践
1. 镜像管理
- 使用官方或经过验证的镜像作为基础镜像
- 最小化镜像大小,使用 Alpine 等轻量级基础镜像
- 定期清理未使用的镜像:
docker image prune - 使用标签管理镜像版本,避免使用 latest 标签
2. 容器管理
- 为容器设置合理的资源限制:
--memory、--cpus等 - 使用命名卷或绑定挂载进行数据持久化
- 为容器配置健康检查:
--health-cmd - 利用 Docker Compose 管理多容器应用
3. 安全最佳实践
- 避免在容器中以 root 用户运行应用
- 定期更新镜像和依赖项
- 限制容器的网络和文件系统权限
- 使用 Docker secrets 管理敏感信息
总结
Docker 容器技术已经成为现代应用部署的标准方式,它提供了一种轻量级、可移植、一致的应用运行环境。通过本文的学习,你应该已经掌握了 Docker 容器的基础概念、操作命令、网络配置、数据持久化等核心知识,并能够通过实战部署一个完整的 Web 应用。
作为一名运维工程师,掌握 Docker 技术不仅可以提高部署效率,还可以减少环境差异带来的问题,实现更可靠的应用运行环境。在实际工作中,我们还需要结合具体场景,灵活运用 Docker 技术,不断积累经验,才能真正发挥其最大价值。