Docker容器化部署
本指南将带您深入了解Docker,学习如何使用这项强大的容器化技术来打包、分发和运行应用程序。您将掌握从安装Docker到使用Docker Compose管理复杂应用的全过程。
什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。
容器 vs. 虚拟机
与传统的虚拟机相比,容器更加轻量、快速。
容器 (Container)
共享宿主机的操作系统内核,进程级隔离,启动速度快(秒级),资源占用小。
虚拟机 (VM)
拥有独立的操作系统内核,硬件级隔离,启动速度慢(分钟级),资源占用大。
💡 Docker的优势
- 环境一致性: 从开发到生产,环境完全一致。
- 快速部署: 秒级启动,加速开发、测试、部署流程。
- 轻量高效: 更少的资源开销,更高的服务器利用率。
- 应用隔离: 每个应用运行在独立沙箱中,互不影响。
安装Docker
在您的VPS上安装Docker非常简单。官方提供了一个便捷的安装脚本,可以自动完成大部分工作。
下载并运行官方安装脚本
这个命令会下载脚本并立即执行它。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
启动并设置开机自启
安装完成后,启动Docker服务并将其设置为开机自动启动。
sudo systemctl start docker
sudo systemctl enable docker
将当前用户添加到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文件来配置应用的服务,然后使用一个命令,就可以创建并启动所有服务。
安装 Docker Compose
通常新版Docker已包含Compose,如果没有,可按官方文档安装。
创建 `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:
启动应用
在`docker-compose.yml`文件所在的目录下,运行以下命令即可。
docker-compose up -d
若要停止并删除所有相关容器和网络,请使用 docker-compose down
。
总结与后续
恭喜!您已经掌握了Docker的核心用法,从单个容器的管理到使用Docker Compose编排复杂应用。Docker将极大地简化您的应用部署和运维工作。