1.3.1 什么是Docker?
Docker是一种容器化技术,它允许开发者将应用程序及其依赖项打包到一个标准化的单元(容器)中,以便在任何环境中都能一致地运行。Docker容器是轻量级、可移植、自给自足的,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和配置。
1.3.1.1 Docker的核心概念
- 镜像(Image):只读模板,包含运行应用程序所需的所有文件和配置
- 容器(Container):镜像的运行实例,可以启动、停止、删除
- 仓库(Repository):存储镜像的地方,如Docker Hub
- Docker Hub:Docker官方的公共镜像仓库
- Dockerfile:定义如何构建Docker镜像的文本文件
- Docker Compose:用于定义和运行多容器Docker应用程序的工具
1.3.1.2 使用Docker的优势
- 环境一致性:确保应用程序在开发、测试和生产环境中运行一致
- 轻量级:容器共享主机内核,比虚拟机更轻量、启动更快
- 可移植性:可以在任何支持Docker的平台上运行
- 隔离性:容器之间相互隔离,不会互相影响
- 资源利用率高:可以在同一主机上运行多个容器,充分利用资源
- 快速部署:可以快速启动和停止容器,实现快速部署和扩展
1.3.2 Docker安装
1.3.2.1 Windows系统安装Docker
1.3.2.1.1 系统要求
- Windows 10 64位专业版、企业版或教育版(Build 16299或更高版本)
- 启用Hyper-V和Windows容器功能
1.3.2.1.2 安装步骤
-
下载Docker Desktop for Windows安装包:https://desktop.docker.com/win/main/amd64/Docker Desktop Installer.exe
-
双击安装包,按照提示进行安装
-
安装完成后,启动Docker Desktop
-
验证Docker安装是否成功:
- 打开命令提示符或PowerShell
- 运行命令:
docker --version - 运行命令:
docker run hello-world
1.3.2.2 Linux系统安装Docker
以Ubuntu 24.04为例:
-
更新系统包:
bashsudo apt-get update -
安装必要的依赖包:
bashsudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -
添加Docker官方GPG密钥:
bashcurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -
添加Docker稳定版仓库:
bashsudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" -
再次更新系统包:
bashsudo apt-get update -
安装Docker CE(社区版):
bashsudo apt-get install docker-ce docker-ce-cli containerd.io -
验证Docker安装是否成功:
bashsudo docker --version sudo docker run hello-world -
(可选)将当前用户添加到docker组,无需sudo即可运行docker命令:
bashsudo usermod -aG docker $USER注销并重新登录后生效。
1.3.2.3 macOS系统安装Docker
1.3.2.3.1 系统要求
- macOS 11或更高版本
1.3.2.3.2 安装步骤
-
下载Docker Desktop for Mac安装包:https://desktop.docker.com/mac/main/amd64/Docker.dmg
-
双击安装包,将Docker图标拖动到Applications文件夹
-
启动Docker Desktop
-
验证Docker安装是否成功:
- 打开终端
- 运行命令:
docker --version - 运行命令:
docker run hello-world
1.3.3 Docker基本命令
1.3.3.1 镜像管理命令
| 命令 | 描述 | 示例 |
|---|---|---|
docker pull |
从仓库拉取镜像 | docker pull postgres:18 |
docker images |
列出本地镜像 | docker images |
docker rmi |
删除本地镜像 | docker rmi postgres:18 |
docker build |
从Dockerfile构建镜像 | docker build -t myapp . |
docker tag |
为镜像添加标签 | docker tag myapp myusername/myapp:latest |
docker push |
将镜像推送到仓库 | docker push myusername/myapp:latest |
1.3.3.2 容器管理命令
| 命令 | 描述 | 示例 |
|---|---|---|
docker run |
运行容器 | docker run -d --name mypostgres postgres:18 |
docker ps |
列出运行中的容器 | docker ps |
docker ps -a |
列出所有容器 | docker ps -a |
docker start |
启动容器 | docker start mypostgres |
docker stop |
停止容器 | docker stop mypostgres |
docker restart |
重启容器 | docker restart mypostgres |
docker rm |
删除容器 | docker rm mypostgres |
docker exec |
在运行的容器中执行命令 | docker exec -it mypostgres psql -U postgres |
docker logs |
查看容器日志 | docker logs mypostgres |
docker inspect |
查看容器详细信息 | docker inspect mypostgres |
1.3.3.3 网络管理命令
| 命令 | 描述 | 示例 |
|---|---|---|
docker network ls |
列出所有网络 | docker network ls |
docker network create |
创建网络 | docker network create mynetwork |
docker network connect |
将容器连接到网络 | docker network connect mynetwork mypostgres |
docker network disconnect |
将容器从网络断开 | docker network disconnect mynetwork mypostgres |
1.3.4 使用Docker部署PostgreSQL 18
1.3.4.1 拉取PostgreSQL 18镜像
从Docker Hub拉取官方的PostgreSQL 18镜像:
bash
docker pull postgres:18
1.3.4.2 运行PostgreSQL 18容器
1.3.4.2.1 基本运行
bash
docker run -d \
--name pg18 \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
postgres:18
参数说明:
-d:在后台运行容器--name:为容器指定名称-e POSTGRES_PASSWORD:设置PostgreSQL超级用户密码-p 5432:5432:将容器的5432端口映射到主机的5432端口
1.3.4.2.2 挂载数据卷
为了持久化存储数据,我们可以将PostgreSQL的数据目录挂载到主机:
bash
# 创建数据目录
sudo mkdir -p /opt/pg18/data
# 设置目录权限
sudo chown -R 999:999 /opt/pg18/data
# 运行容器并挂载数据卷
docker run -d \
--name pg18 \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
-v /opt/pg18/data:/var/lib/postgresql/data \
postgres:18
参数说明:
-v /opt/pg18/data:/var/lib/postgresql/data:将主机的/opt/pg18/data目录挂载到容器的/var/lib/postgresql/data目录
1.3.4.2.3 设置自定义配置
我们还可以挂载自定义的PostgreSQL配置文件:
bash
# 创建配置目录
sudo mkdir -p /opt/pg18/config
# 创建自定义配置文件
sudo vi /opt/pg18/config/postgresql.conf
在配置文件中添加自定义配置:
listen_addresses = '*'
max_connections = 200
shared_buffers = 512MB
运行容器并挂载配置文件:
bash
docker run -d \
--name pg18 \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
-v /opt/pg18/data:/var/lib/postgresql/data \
-v /opt/pg18/config/postgresql.conf:/etc/postgresql/postgresql.conf \
postgres:18 \
-c config_file=/etc/postgresql/postgresql.conf
1.3.4.3 连接到PostgreSQL 18容器
1.3.4.3.1 使用psql命令行工具
bash
# 方法1:直接在容器内运行psql
docker exec -it pg18 psql -U postgres
# 方法2:使用本地psql连接(需要安装psql)
psql -h localhost -p 5432 -U postgres
1.3.4.3.2 使用pgAdmin连接
-
下载并安装pgAdmin:https://www.pgadmin.org/download/
-
打开pgAdmin,添加新服务器:
- 名称:pg18
- 主机名/地址:localhost
- 端口:5432
- 用户名:postgres
- 密码:mysecretpassword
1.3.5 使用Docker Compose部署PostgreSQL 18
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,使用YAML文件来配置应用程序的服务。
1.3.5.1 安装Docker Compose
Docker Compose通常与Docker Desktop一起安装,无需单独安装。如果需要单独安装,可以参考官方文档:https://docs.docker.com/compose/install/
1.3.5.2 创建Docker Compose文件
创建一个名为docker-compose.yml的文件:
yaml
version: '3.8'
services:
postgres:
image: postgres:18
container_name: pg18
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: postgres
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化SQL脚本
restart: always
volumes:
pgdata:
driver: local
1.3.5.3 创建初始化SQL脚本
创建一个名为init.sql的文件,用于初始化数据库:
sql
-- 创建测试表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
-- 插入测试数据
INSERT INTO users (name, email) VALUES
('张三', 'zhangsan@example.com'),
('李四', 'lisi@example.com'),
('王五', 'wangwu@example.com');
1.3.5.4 启动服务
在包含docker-compose.yml文件的目录中运行:
bash
docker-compose up -d
1.3.5.5 停止服务
bash
docker-compose down
1.3.6 实践项目:部署PostgreSQL 18容器
1.3.6.1 项目目标
通过本次实践,掌握使用Docker部署PostgreSQL 18的方法,包括:
- 拉取PostgreSQL 18镜像
- 运行PostgreSQL 18容器
- 连接到PostgreSQL 18容器
- 使用Docker Compose部署PostgreSQL 18
1.3.6.2 实践步骤
1.3.6.2.1 拉取PostgreSQL 18镜像
bash
docker pull postgres:18
1.3.6.2.2 运行PostgreSQL 18容器
bash
docker run -d \
--name pg18-practice \
-e POSTGRES_PASSWORD=practice123 \
-e POSTGRES_USER=practiceuser \
-e POSTGRES_DB=practicedb \
-p 5432:5432 \
postgres:18
1.3.6.2.3 验证容器运行状态
bash
docker ps
1.3.6.2.4 连接到PostgreSQL容器
bash
docker exec -it pg18-practice psql -U practiceuser -d practicedb
1.3.6.2.5 创建表和插入数据
在psql中运行:
sql
-- 创建学生表
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGER NOT NULL,
grade VARCHAR(10) NOT NULL
);
-- 插入测试数据
INSERT INTO students (name, age, grade) VALUES
('小明', 18, '高三'),
('小红', 17, '高二'),
('小刚', 16, '高一');
-- 查询数据
SELECT * FROM students;
-- 退出psql
\q
1.3.6.2.6 使用Docker Compose部署
创建docker-compose.yml文件:
yaml
version: '3.8'
services:
postgres:
image: postgres:18
container_name: pg18-compose
environment:
POSTGRES_PASSWORD: compose123
POSTGRES_USER: composeuser
POSTGRES_DB: composedb
ports:
- "5432:5432"
volumes:
- pgdata-compose:/var/lib/postgresql/data
restart: always
volumes:
pgdata-compose:
driver: local
启动服务:
bash
docker-compose up -d
连接到数据库:
bash
docker exec -it pg18-compose psql -U composeuser -d composedb
1.3.6.2.7 清理资源
bash
# 停止并删除单个容器
docker stop pg18-practice
docker rm pg18-practice
# 停止并删除Compose服务
docker-compose down
# 删除镜像(可选)
docker rmi postgres:18
1.3.7 主流数据库Docker部署对比
为了帮助你更全面地理解不同数据库的Docker部署方式,本节将对比PostgreSQL 18、SQL Server 2019+和MySQL 8.0+在Docker部署方面的差异。
1.3.7.1 Docker镜像特性对比
| 特性 | PostgreSQL 18 | SQL Server 2019+ | MySQL 8.0+ |
|---|---|---|---|
| 官方镜像维护 | 官方维护,更新频繁 | 官方维护,定期更新 | 官方维护,更新频繁 |
| 镜像大小 | 约300MB(alpine版本更小) | 约1.5GB(较大,因为包含完整的SQL Server) | 约500MB(alpine版本约150MB) |
| 镜像标签 | 提供多种标签:latest、18、18-alpine等 | 提供多种标签:latest、2019、2022、2022-latest等 | 提供多种标签:latest、8.0、8.0-alpine等 |
| 基础镜像 | 基于Debian,也提供Alpine版本 | 基于Ubuntu | 基于Debian,也提供Alpine版本 |
| 多平台支持 | 支持amd64、arm64等多种架构 | 主要支持amd64,部分版本支持arm64 | 支持amd64、arm64等多种架构 |
| 镜像分层 | 合理的分层设计,便于缓存和更新 | 分层较多,更新时可能需要较多带宽 | 合理的分层设计,便于缓存和更新 |
1.3.7.2 部署命令差异对比
| 部署方面 | PostgreSQL 18 | SQL Server 2019+ | MySQL 8.0+ |
|---|---|---|---|
| 基本部署命令 | docker run -d --name pg18 -e POSTGRES_PASSWORD=mypassword -p 5432:5432 postgres:18 |
docker run -d --name mssql -e SA_PASSWORD=MyPass123 -e ACCEPT_EULA=Y -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latest |
docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 mysql:8.0 |
| 默认用户名 | postgres | sa | root |
| 环境变量 | 支持POSTGRES_PASSWORD、POSTGRES_USER、POSTGRES_DB等 | 支持SA_PASSWORD、ACCEPT_EULA、MSSQL_PID等 | 支持MYSQL_ROOT_PASSWORD、MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD等 |
| 端口映射 | 默认5432 | 默认1433 | 默认3306 |
| 数据目录 | /var/lib/postgresql/data | /var/opt/mssql | /var/lib/mysql |
| 配置文件位置 | /var/lib/postgresql/data/postgresql.conf | /var/opt/mssql/mssql.conf | /etc/mysql/my.cnf 或 /etc/mysql/conf.d/ |
| 日志位置 | /var/log/postgresql | /var/opt/mssql/log | /var/log/mysql |
1.3.7.3 持久化存储对比
| 存储方面 | PostgreSQL 18 | SQL Server 2019+ | MySQL 8.0+ |
|---|---|---|---|
| 数据卷挂载 | docker run -v pgdata:/var/lib/postgresql/data postgres:18 |
docker run -v mssqldata:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latest |
docker run -v mysqldata:/var/lib/mysql mysql:8.0 |
| 主机目录挂载 | docker run -v /host/path:/var/lib/postgresql/data postgres:18 |
docker run -v /host/path:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latest |
docker run -v /host/path:/var/lib/mysql mysql:8.0 |
| 权限要求 | 数据目录需要uid/gid 999:999权限 | 数据目录需要特定权限配置 | 数据目录需要正确的权限配置 |
| 存储驱动支持 | 支持多种存储驱动 | 支持多种存储驱动,但对某些驱动有性能影响 | 支持多种存储驱动 |
| 数据备份 | 可通过docker exec运行pg_dump,或直接备份数据卷 | 可通过docker exec运行sqlcmd,或直接备份数据卷 | 可通过docker exec运行mysqldump,或直接备份数据卷 |
1.3.7.4 Docker Compose配置对比
1.3.7.4.1 PostgreSQL 18 Docker Compose配置
yaml
version: '3.8'
services:
postgres:
image: postgres:18
container_name: pg18
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: postgres
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: always
volumes:
pgdata:
driver: local
1.3.7.4.2 SQL Server 2019+ Docker Compose配置
yaml
version: '3.8'
services:
mssql:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: mssql
environment:
SA_PASSWORD: MyPass123
ACCEPT_EULA: Y
MSSQL_PID: Developer
ports:
- "1433:1433"
volumes:
- mssqldata:/var/opt/mssql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: always
volumes:
mssqldata:
driver: local
1.3.7.4.3 MySQL 8.0+ Docker Compose配置
yaml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql8
environment:
MYSQL_ROOT_PASSWORD: mysecretpassword
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- mysqldata:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- ./my.cnf:/etc/mysql/conf.d/my.cnf
restart: always
volumes:
mysqldata:
driver: local
1.3.7.5 初始化和配置对比
| 初始化方面 | PostgreSQL 18 | SQL Server 2019+ | MySQL 8.0+ |
|---|---|---|---|
| 初始化脚本 | 支持将.sql/.sh/.sql.gz文件放入/docker-entrypoint-initdb.d/目录 | 支持通过环境变量或外部脚本初始化 | 支持将.sql/.sh/.sql.gz文件放入/docker-entrypoint-initdb.d/目录 |
| 配置文件挂载 | 可挂载postgresql.conf和pg_hba.conf | 可挂载mssql.conf | 可挂载my.cnf或在/etc/mysql/conf.d/目录下挂载配置文件 |
| 命令行配置 | 支持通过docker run命令行参数传递配置(如-c shared_buffers=256MB) | 配置主要通过环境变量或配置文件 | 支持通过命令行参数传递配置(如--default-authentication-plugin=mysql_native_password) |
| 扩展安装 | 可通过docker exec安装扩展(如apt-get install postgresql-18-postgis-3) | 可通过docker exec安装扩展包 | 可通过docker exec安装插件(如apt-get install mysql-server-plugin-*) |
1.3.7.6 性能和资源使用对比
| 资源方面 | PostgreSQL 18 | SQL Server 2019+ | MySQL 8.0+ |
|---|---|---|---|
| CPU使用率 | 适中,默认配置下CPU使用率较低 | 较高,尤其是在启动时和执行复杂查询时 | 适中,默认配置下CPU使用率较低 |
| 内存使用率 | 可通过shared_buffers等参数调整,默认约128MB | 较大,默认至少需要2GB内存 | 可通过innodb_buffer_pool_size等参数调整,默认约128MB |
| 磁盘I/O | 可通过WAL配置调整I/O模式 | 较高,尤其是在执行大量写入操作时 | 可通过innodb_flush_log_at_trx_commit等参数调整I/O模式 |
| 启动时间 | 较快,约5-10秒 | 较慢,约30-60秒(因为需要初始化SQL Server) | 较快,约5-10秒 |
| 并发连接支持 | 默认支持100个并发连接,可调整 | 默认支持32767个并发连接 | 默认支持151个并发连接,可调整 |
1.3.7.7 适用场景对比
| 场景类型 | PostgreSQL 18 | SQL Server 2019+ | MySQL 8.0+ |
|---|---|---|---|
| 开发环境 | 非常适合,镜像较小,启动快,功能全面 | 适合需要SQL Server特定功能的开发环境 | 非常适合,镜像小,启动快,易于配置 |
| 测试环境 | 适合,支持多种配置,易于部署和销毁 | 适合,可快速部署不同版本的SQL Server | 适合,支持多种配置,易于自动化测试 |
| 生产环境 | 适合,稳定性高,支持高可用配置 | 适合,企业级支持,功能全面 | 适合,高并发性能好,资源占用低 |
| 微服务架构 | 适合,可作为微服务的后端数据库 | 适合,尤其是与.NET微服务集成 | 适合,轻量级,适合微服务架构 |
| CI/CD流水线 | 适合,镜像小,启动快,易于集成 | 可以使用,但镜像较大,可能影响CI/CD速度 | 非常适合,镜像小,启动快,易于集成 |
| 边缘计算 | 适合,alpine版本体积小,资源占用低 | 不适合,镜像太大,资源占用高 | 适合,alpine版本体积小,资源占用低 |
1.3.8 总结
本章节我们学习了Docker的基本概念、安装方法和基本命令,以及如何使用Docker部署PostgreSQL 18。同时,我们对比了PostgreSQL 18、SQL Server 2019+和MySQL 8.0+在Docker部署方面的差异,包括镜像特性、部署命令、持久化存储、Docker Compose配置、初始化和配置、性能和资源使用以及适用场景等方面。
主要内容包括:
- Docker的核心概念和优势
- Docker在不同系统上的安装方法
- Docker基本命令(镜像管理、容器管理、网络管理)
- 使用Docker部署PostgreSQL 18的方法
- 使用Docker Compose部署PostgreSQL 18
- 一个完整的实践项目
- 主流数据库Docker部署对比
Docker是现代应用开发和部署的重要工具,掌握Docker可以帮助我们更高效地开发、测试和部署应用程序。通过对比不同数据库的Docker部署方式,我们可以更好地理解它们的特点和适用场景,选择最适合我们需求的数据库。
在接下来的章节中,我们将学习如何在本地安装PostgreSQL 18,以及如何使用PostgreSQL进行数据操作和管理。
1.3.9 思考与练习
1.3.9.1 思考问题
- Docker和虚拟机的主要区别是什么?
- Docker容器和镜像的关系是什么?
- 如何持久化存储Docker容器中的数据?
- 如何在Docker容器中执行命令?
- Docker Compose的主要作用是什么?
1.3.9.2 练习题
- 编写一个Docker Compose文件,部署PostgreSQL 18和pgAdmin。
- 使用Docker部署一个PostgreSQL 18容器,并创建一个简单的数据库和表。
- 如何备份和恢复Docker容器中的PostgreSQL数据?
- 简述Docker的核心概念及其作用。
- 比较Docker镜像和容器的区别。
- 如何将当前用户添加到docker组,无需sudo即可运行docker命令?
- 简述使用Docker部署PostgreSQL 18的步骤。
- 如何使用Docker Compose启动和停止服务?
- 简述Docker容器的网络管理方法。
- 比较PostgreSQL 18、SQL Server 2019+和MySQL 8.0+在Docker部署方面的差异。