Zerlaer's Notebook

欢迎来到我的博客|

Docker 容器基础入门与实践

容器技术概述

什么是容器?

容器是一种轻量级的虚拟化技术,它允许我们将应用程序及其依赖项打包到一个标准化的单元中,以便在任何环境中一致地运行。与传统虚拟机不同,容器共享主机操作系统内核,因此更加轻量、启动更快,并且资源占用更低。

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 技术,不断积累经验,才能真正发挥其最大价值。

参考资料