Docker

Docker是一种开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个标准化的单元(容器)中,从而实现快速、一致的环境部署。

本教程将详细指导你完成从环境配置到使用Docker的完整流程。


一、Docker核心概念与环境准备

在开始操作前,理解Docker的几个核心概念至关重要:

概念 解释 类比说明
镜像 (Image) 一个只读的模板,包含了运行应用程序所需的代码、运行时、库、环境变量和配置文件。 类似于面向对象编程中的"类",或者一个安装光盘的ISO文件。
容器 (Container) 镜像的运行实例。容器可以被创建、启动、停止、删除,每个容器都是相互隔离的。 类似于由类创建的"对象实例",或者从ISO文件安装好的操作系统。
仓库 (Repository) 集中存放镜像文件的地方,分为公共仓库(如Docker Hub)和私有仓库。 类似于GitHub,但存放的是Docker镜像。
Dockerfile 一个文本文件,包含了一系列指令,用于自动化构建Docker镜像。 类似于Makefile或构建脚本,定义了如何从基础镜像开始构建你的应用镜像。

系统要求与环境检查

Docker支持多种操作系统,包括Linux、Windows和macOS。以下以CentOS 7为例,其他系统步骤类似。

  1. 检查系统版本
cat /etc/redhat-release

确保系统是64位,内核版本3.10以上。

  1. 卸载旧版本Docker(如果已安装):
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

二、Docker安装与初始配置

2.1 在线安装Docker(推荐)

这是最常用的安装方式,适合有网络连接的环境。

  1. 安装必要的软件包
sudo yum install -y yum-utils
  1. 设置稳定的仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 启动Docker服务并设置开机自启
# 启动Docker服务
sudo systemctl start docker

# 设置开机自动启动
sudo systemctl enable docker

# 验证安装是否成功
sudo docker version

2.2 离线安装Docker

适用于没有网络连接或网络环境受限的场景。

  1. 在有网络的环境中下载Docker安装包
# 创建下载目录
mkdir docker-offline
cd docker-offline

# 使用yum下载所有依赖包(不安装)
sudo yum install --downloadonly --downloaddir=. docker-ce docker-ce-cli containerd.io
  1. 将下载的RPM包复制到目标机器,然后安装:
# 进入包含RPM包的目录
cd docker-offline

# 安装所有RPM包
sudo rpm -ivh *.rpm --nodeps --force
  1. 启动服务(同上):
sudo systemctl start docker
sudo systemctl enable docker

2.3 配置镜像加速器

由于Docker Hub在国内访问较慢,建议配置镜像加速器。

  1. 创建或修改Docker配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF
  1. 重新加载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 验证配置是否生效
docker info | grep -A 1 "Registry Mirrors"

三、Docker界面与命令行详解

Docker主要通过命令行界面(CLI)进行操作,这是最常用且功能最全的操作方式。

3.1 Docker命令结构

Docker命令采用docker [OPTIONS] COMMAND [ARG...]的结构,主要分为以下几类:

命令类别 主要命令 功能描述
镜像管理 docker images, docker pull, docker rmi 查看、拉取、删除镜像
容器生命周期 docker run, docker start/stop, docker rm 创建、启动、停止、删除容器
容器操作 docker exec, docker attach, docker cp 进入容器、执行命令、复制文件
信息查看 docker ps, docker logs, docker inspect 查看容器状态、日志、详细信息
网络管理 docker network, docker port 管理容器网络、端口映射

3.2 镜像管理命令详解

  1. 搜索镜像
# 从Docker Hub搜索镜像
docker search nginx

# 搜索特定标签的镜像
docker search ubuntu:20.04
  1. 拉取镜像
# 拉取最新版本的nginx镜像
docker pull nginx

# 拉取指定版本的ubuntu镜像
docker pull ubuntu:20.04

# 拉取指定架构的镜像(如ARM64)
docker pull --platform linux/arm64 nginx
  1. 查看本地镜像
# 查看所有镜像
docker images

# 查看镜像的详细信息
docker image inspect nginx:latest

# 查看镜像历史(构建层)
docker history nginx
  1. 删除镜像
# 删除单个镜像
docker rmi nginx:latest

# 强制删除镜像(即使有容器使用)
docker rmi -f nginx

# 清理所有未使用的镜像
docker image prune -a

3.3 容器生命周期管理

  1. 运行容器
# 最基本的运行命令
docker run nginx

# 后台运行并指定名称
docker run -d --name my-nginx nginx

# 运行并映射端口(主机端口:容器端口)
docker run -d -p 8080:80 --name web nginx

# 运行并挂载数据卷
docker run -d -v /host/data:/container/data --name app nginx

# 运行并设置环境变量
docker run -d -e "ENV_VAR=value" --name app nginx

# 运行并限制资源
docker run -d --memory="512m" --cpus="1.5" --name app nginx

参数详解

  • -d:后台运行(detached mode)
  • -p:端口映射(格式:主机端口:容器端口
  • -v:数据卷挂载(格式:主机目录:容器目录
  • -e:设置环境变量
  • --name:为容器指定名称
  • --memory:限制内存使用
  • --cpus:限制CPU使用
  1. 查看运行中的容器
# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 查看容器占用资源
docker stats

# 查看容器详细信息
docker inspect my-nginx
  1. 启动、停止、重启容器
# 启动已停止的容器
docker start my-nginx

# 停止运行中的容器
docker stop my-nginx

# 强制停止容器(发送SIGKILL)
docker kill my-nginx

# 重启容器
docker restart my-nginx

# 暂停容器(冻结进程)
docker pause my-nginx

# 恢复暂停的容器
docker unpause my-nginx
  1. 删除容器
# 删除已停止的容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

# 删除所有已停止的容器
docker container prune

3.4 容器交互与操作

  1. 进入容器
# 使用exec进入运行中的容器(推荐)
docker exec -it my-nginx /bin/bash

# 使用attach附加到容器(会显示所有输出)
docker attach my-nginx

参数详解

  • -i:保持标准输入打开
  • -t:分配伪终端
  • -it:通常一起使用,实现交互式操作
  1. 在容器中执行命令
# 在容器中执行单条命令
docker exec my-nginx ls -la /etc/nginx

# 在容器中执行交互式命令
docker exec -it my-nginx python3
  1. 查看容器日志
# 查看最新日志
docker logs my-nginx

# 实时查看日志(类似tail -f)
docker logs -f my-nginx

# 查看最近10行日志
docker logs --tail 10 my-nginx

# 查看特定时间后的日志
docker logs --since 2024-01-01T00:00:00 my-nginx
  1. 文件复制
# 从主机复制文件到容器
docker cp local_file.txt my-nginx:/container/path/

# 从容器复制文件到主机
docker cp my-nginx:/container/file.txt ./local_path/

3.5 网络与端口管理

  1. 查看网络配置
# 查看所有网络
docker network ls

# 查看网络详细信息
docker network inspect bridge
  1. 端口映射查看
# 查看容器的端口映射
docker port my-nginx

# 查看所有端口映射
docker ps --format "table {{.Names}}\t{{.Ports}}"
  1. 创建自定义网络
# 创建桥接网络
docker network create my-network

# 在自定义网络中运行容器
docker run -d --network my-network --name app1 nginx
docker run -d --network my-network --name app2 nginx

# 容器间可以通过容器名直接通信
docker exec app1 ping app2

3.6 Docker Compose界面与使用

对于多容器应用,Docker Compose提供了更便捷的管理方式。

  1. 安装Docker Compose
# 对于较新版本的Docker,Compose已包含在安装包中
# 如果需要单独安装
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  1. 编写docker-compose.yml
version: '3.8'
services:
  web:
    image: nginx:latest
    container_name: my-web
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - app-network
    
  db:
    image: mysql:8.0
    container_name: my-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:
    driver: bridge
  1. Compose常用命令
# 启动所有服务(在docker-compose.yml所在目录)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs -f

# 停止所有服务
docker-compose down

# 停止并删除所有资源(包括卷)
docker-compose down -v

# 重新构建并启动服务
docker-compose up -d --build

四、实践案例:部署一个简单的Web应用

让我们通过一个完整的例子来巩固所学知识:部署一个包含Nginx Web服务器和MySQL数据库的应用。

4.1 创建项目结构

# 创建项目目录
mkdir my-webapp
cd my-webapp

# 创建网页文件
mkdir html
echo "<h1>Welcome to My Web App</h1><p>This is running in Docker!</p>" > html/index.html

# 创建Dockerfile
cat > Dockerfile << 'EOF'
FROM nginx:alpine
COPY html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
EOF

4.2 创建docker-compose.yml

version: '3.8'
services:
  web:
    build: .
    container_name: web-app
    ports:
      - "8080:80"
    depends_on:
      - db
    networks:
      - app-net
    restart: unless-stopped
  
  db:
    image: mysql:8.0
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: userpass
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-net
    restart: unless-stopped
    command: --default-authentication-plugin=mysql_native_password

volumes:
  mysql-data:

networks:
  app-net:
    driver: bridge

4.3 构建并运行应用

# 构建并启动所有服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看Web服务日志
docker-compose logs -f web

# 进入MySQL容器
docker-compose exec db mysql -u root -p
# 输入密码: secret

# 在MySQL中创建表
CREATE TABLE users (id INT, name VARCHAR(50));
INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
SELECT * FROM users;

4.4 访问应用与验证

  1. 打开浏览器访问 http://localhost:8080,应该能看到欢迎页面
  2. 验证容器运行状态:
# 查看所有容器
docker ps

# 查看容器资源使用
docker stats

# 查看容器网络
docker network inspect my-webapp_app-net

4.5 清理资源

# 停止并删除所有容器、网络
docker-compose down

# 删除数据卷(如果需要)
docker-compose down -v

# 删除所有未使用的资源
docker system prune -a

五、高级功能与最佳实践

5.1 数据持久化策略

容器本身是临时性的,数据持久化至关重要:

  1. 绑定挂载(Bind Mounts)
# 将主机目录挂载到容器
docker run -d -v /host/data:/container/data --name app nginx
  1. 数据卷(Volumes)
# 创建数据卷
docker volume create my-volume

# 使用数据卷
docker run -d -v my-volume:/container/data --name app nginx

# 查看数据卷信息
docker volume inspect my-volume
  1. 临时文件系统(tmpfs)
# 将内存挂载为临时文件系统
docker run -d --tmpfs /tmp --name app nginx

5.2 资源限制与监控

# 限制CPU使用(1.5个CPU核心)
docker run -d --cpus="1.5" --name app nginx

# 限制内存使用(512MB内存,1GB交换空间)
docker run -d --memory="512m" --memory-swap="1g" --name app nginx

# 限制进程数
docker run -d --pids-limit 100 --name app nginx

# 监控资源使用
docker stats --all --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

5.3 安全最佳实践

  1. 不要以root用户运行容器
# 在Dockerfile中指定非root用户
FROM nginx:alpine
RUN addgroup -g 1000 -S appgroup && \
    adduser -u 1000 -S appuser -G appgroup
USER appuser
  1. 定期更新基础镜像
# 拉取最新安全更新
docker pull nginx:latest
  1. 扫描镜像安全漏洞
# 使用Docker Scan(需要登录Docker Hub)
docker scan nginx:latest

5.4 常用调试技巧

  1. 检查容器内部进程
docker top my-container
  1. 查看容器元数据
docker inspect my-container | grep -A 10 "State"
  1. 查看容器文件系统变化
docker diff my-container
  1. 保存容器状态为镜像
docker commit my-container my-snapshot:latest

通过本教程,你应该已经掌握了Docker从环境配置到实际使用的完整流程。

记住,Docker的核心优势在于环境一致性、快速部署和资源隔离。

在实际工作中,建议从简单的单容器应用开始,逐步过渡到使用Docker Compose管理多容器应用,最终学习Docker Swarm或Kubernetes进行容器编排。


参考来源

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐