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 安装步骤
  1. 下载Docker Desktop for Windows安装包:https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe

  2. 双击安装包,按照提示进行安装

  3. 安装完成后,启动Docker Desktop

  4. 验证Docker安装是否成功:

    • 打开命令提示符或PowerShell
    • 运行命令:docker --version
    • 运行命令:docker run hello-world

1.3.2.2 Linux系统安装Docker

以Ubuntu 24.04为例:

  1. 更新系统包:

    sudo apt-get update
    
  2. 安装必要的依赖包:

    sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    
  3. 添加Docker官方GPG密钥:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  4. 添加Docker稳定版仓库:

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
  5. 再次更新系统包:

    sudo apt-get update
    
  6. 安装Docker CE(社区版):

    sudo apt-get install docker-ce docker-ce-cli containerd.io
    
  7. 验证Docker安装是否成功:

    sudo docker --version
    sudo docker run hello-world
    
  8. (可选)将当前用户添加到docker组,无需sudo即可运行docker命令:

    sudo usermod -aG docker $USER
    

    注销并重新登录后生效。

1.3.2.3 macOS系统安装Docker

1.3.2.3.1 系统要求
  • macOS 11或更高版本
1.3.2.3.2 安装步骤
  1. 下载Docker Desktop for Mac安装包:https://desktop.docker.com/mac/main/amd64/Docker.dmg

  2. 双击安装包,将Docker图标拖动到Applications文件夹

  3. 启动Docker Desktop

  4. 验证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镜像:

docker pull postgres:18

1.3.4.2 运行PostgreSQL 18容器

1.3.4.2.1 基本运行
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的数据目录挂载到主机:

# 创建数据目录
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配置文件:

# 创建配置目录
sudo mkdir -p /opt/pg18/config

# 创建自定义配置文件
sudo vi /opt/pg18/config/postgresql.conf

在配置文件中添加自定义配置:

listen_addresses = '*'
max_connections = 200
shared_buffers = 512MB

运行容器并挂载配置文件:

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命令行工具
# 方法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连接
  1. 下载并安装pgAdmin:https://www.pgadmin.org/download/

  2. 打开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的文件:

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的文件,用于初始化数据库:

-- 创建测试表
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文件的目录中运行:

docker-compose up -d

1.3.5.5 停止服务

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镜像
docker pull postgres:18
1.3.6.2.2 运行PostgreSQL 18容器
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 验证容器运行状态
docker ps
1.3.6.2.4 连接到PostgreSQL容器
docker exec -it pg18-practice psql -U practiceuser -d practicedb
1.3.6.2.5 创建表和插入数据

在psql中运行:

-- 创建学生表
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文件:

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

启动服务:

docker-compose up -d

连接到数据库:

docker exec -it pg18-compose psql -U composeuser -d composedb
1.3.6.2.7 清理资源
# 停止并删除单个容器
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 18SQL 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 18SQL Server 2019+MySQL 8.0+
基本部署命令docker run -d --name pg18 -e POSTGRES_PASSWORD=mypassword -p 5432:5432 postgres:18docker run -d --name mssql -e SA_PASSWORD=MyPass123 -e ACCEPT_EULA=Y -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latestdocker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 mysql:8.0
默认用户名postgressaroot
环境变量支持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 18SQL Server 2019+MySQL 8.0+
数据卷挂载docker run -v pgdata:/var/lib/postgresql/data postgres:18docker run -v mssqldata:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latestdocker run -v mysqldata:/var/lib/mysql mysql:8.0
主机目录挂载docker run -v /host/path:/var/lib/postgresql/data postgres:18docker run -v /host/path:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latestdocker 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配置
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配置
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配置
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 18SQL 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 18SQL 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 18SQL 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配置、初始化和配置、性能和资源使用以及适用场景等方面。

主要内容包括:

  1. Docker的核心概念和优势
  2. Docker在不同系统上的安装方法
  3. Docker基本命令(镜像管理、容器管理、网络管理)
  4. 使用Docker部署PostgreSQL 18的方法
  5. 使用Docker Compose部署PostgreSQL 18
  6. 一个完整的实践项目
  7. 主流数据库Docker部署对比

Docker是现代应用开发和部署的重要工具,掌握Docker可以帮助我们更高效地开发、测试和部署应用程序。通过对比不同数据库的Docker部署方式,我们可以更好地理解它们的特点和适用场景,选择最适合我们需求的数据库。

在接下来的章节中,我们将学习如何在本地安装PostgreSQL 18,以及如何使用PostgreSQL进行数据操作和管理。

1.3.9 思考与练习

1.3.9.1 思考问题

  1. Docker和虚拟机的主要区别是什么?
  2. Docker容器和镜像的关系是什么?
  3. 如何持久化存储Docker容器中的数据?
  4. 如何在Docker容器中执行命令?
  5. Docker Compose的主要作用是什么?

1.3.9.2 练习题

  1. 编写一个Docker Compose文件,部署PostgreSQL 18和pgAdmin。
  2. 使用Docker部署一个PostgreSQL 18容器,并创建一个简单的数据库和表。
  3. 如何备份和恢复Docker容器中的PostgreSQL数据?
  4. 简述Docker的核心概念及其作用。
  5. 比较Docker镜像和容器的区别。
  6. 如何将当前用户添加到docker组,无需sudo即可运行docker命令?
  7. 简述使用Docker部署PostgreSQL 18的步骤。
  8. 如何使用Docker Compose启动和停止服务?
  9. 简述Docker容器的网络管理方法。
  10. 比较PostgreSQL 18、SQL Server 2019+和MySQL 8.0+在Docker部署方面的差异。

更多推荐