Docker容器化部署

📖 阅读时间:30分钟 🎯 难度:中级 👥 适合人群:开发者、运维人员

本指南将带您深入了解Docker,学习如何使用这项强大的容器化技术来打包、分发和运行应用程序。您将掌握从安装Docker到使用Docker Compose管理复杂应用的全过程。

🐳 什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。

容器 vs. 虚拟机

与传统的虚拟机相比,容器更加轻量、快速。

📦

容器 (Container)

共享宿主机的操作系统内核,进程级隔离,启动速度快(秒级),资源占用小。

🖥️

虚拟机 (VM)

拥有独立的操作系统内核,硬件级隔离,启动速度慢(分钟级),资源占用大。

💡 Docker的优势

  • 环境一致性: 从开发到生产,环境完全一致。
  • 快速部署: 秒级启动,加速开发、测试、部署流程。
  • 轻量高效: 更少的资源开销,更高的服务器利用率。
  • 应用隔离: 每个应用运行在独立沙箱中,互不影响。

📥 安装Docker

在您的VPS上安装Docker非常简单。官方提供了一个便捷的安装脚本,可以自动完成大部分工作。

⚠️ 该脚本需要以root权限运行。请确保您了解其内容并信任来源。
1

下载并运行官方安装脚本

这个命令会下载脚本并立即执行它。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
2

启动并设置开机自启

安装完成后,启动Docker服务并将其设置为开机自动启动。

sudo systemctl start docker
sudo systemctl enable docker
3

将当前用户添加到docker组(重要)

为了避免每次使用docker命令都需要加上`sudo`,需要将当前用户添加到`docker`用户组。

sudo usermod -aG docker $USER

执行此命令后,您需要退出当前SSH会话并重新登录才能使改动生效!

🧩 核心概念

理解Docker的三个核心概念至关重要:镜像、容器和仓库。

镜像 (Image)

一个只读的模板,包含了运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件。镜像是创建容器的基础。

容器 (Container)

镜像的运行实例。可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证了应用的运行环境独立。

仓库 (Repository)

集中存放镜像文件的地方。最大的公开仓库是 Docker Hub,您也可以搭建私有仓库。

🖼️ 镜像管理

镜像是使用Docker的第一步。以下是一些常用的镜像管理命令。

命令 说明 示例
docker pull 从仓库拉取镜像到本地 docker pull nginx:latest
docker images 列出本地所有镜像 docker images
docker search 在Docker Hub中搜索镜像 docker search mysql
docker rmi 删除一个或多个本地镜像 docker rmi nginx:latest
docker build 使用Dockerfile构建镜像 docker build -t my-app .

⚙️ 容器管理

容器是应用的载体。掌握容器的生命周期管理是Docker的核心技能。

示例:运行一个Nginx容器

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

  • --name my-nginx: 给容器命名为`my-nginx`。
  • -p 8080:80: 将主机的8080端口映射到容器的80端口。
  • -d: 后台运行容器(detached mode)。
  • nginx: 使用的镜像。
命令 说明
docker ps 列出正在运行的容器(加 -a 列出所有)
docker stop [容器ID/名称] 停止一个正在运行的容器
docker start [容器ID/名称] 启动一个已停止的容器
docker rm [容器ID/名称] 删除一个或多个容器(需先停止)
docker logs [容器ID/名称] 查看容器的日志输出
docker exec -it [容器ID/名称] /bin/bash 进入正在运行的容器并打开一个交互式终端

💾 数据持久化

容器默认是无状态的,当容器被删除后,其内部的数据也会丢失。为了持久化存储数据(如数据库文件、用户上传内容等),我们需要使用 **数据卷 (Volume)**。

💡 什么是数据卷 (Volume)?

数据卷是宿主机上的一个特殊目录,由Docker管理。它可以绕过容器的文件系统,直接映射到容器内的某个路径。即使容器被删除,数据卷及其中的数据依然存在。

示例:运行一个带有数据卷的MySQL容器

-v mysql_data:/var/lib/mysql 这部分就是将一个名为`mysql_data`的数据卷挂载到容器的`/var/lib/mysql`目录。

docker run --name my-mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

🎼 容器编排 (Compose)

当应用需要多个容器协同工作时(例如Web服务器 + 数据库),手动管理会变得非常繁琐。**Docker Compose** 是一个用于定义和运行多容器Docker应用的工具。

您可以使用一个YAML文件来配置应用的服务,然后使用一个命令,就可以创建并启动所有服务。

1

安装 Docker Compose

通常新版Docker已包含Compose,如果没有,可按官方文档安装。

2

创建 `docker-compose.yml` 文件

例如,我们创建一个同时包含WordPress和MySQL服务的Compose文件。

version: '3.8'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somerootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpresspassword

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpresspassword
      WORDPRESS_DB_NAME: wordpress

volumes:
  db_data:
3

启动应用

在`docker-compose.yml`文件所在的目录下,运行以下命令即可。

docker-compose up -d

若要停止并删除所有相关容器和网络,请使用 docker-compose down

🎉 总结与后续

恭喜!您已经掌握了Docker的核心用法,从单个容器的管理到使用Docker Compose编排复杂应用。Docker将极大地简化您的应用部署和运维工作。