前言
亲爱的读者们,欢迎来到这篇专为“小白”打造的 Docker 学习博客。作为一名运维工程师,我深知初学者在面对 Docker 这样的技术时可能会遇到的困惑与挑战。因此,本文将以浅显易懂的语言、详实的步骤和实用的示例,带领大家从零开始认识 Docker,逐步掌握其基础命令,并最终利用 Docker 实现应用程序的部署。让我们一起踏上这段探索之旅吧!
一、认识 Docker
1.1 什么是 Docker?
Docker 是一种开源的应用容器引擎,它允许开发者将应用及其依赖打包成一个可移植的容器,然后在任何支持 Docker 的环境中运行。简单来说,Docker 就像一个轻量级的虚拟机,但比传统虚拟机更高效、更灵活。无论将这个“集装箱”搬到哪台服务器上,只要支持Docker,就能直接运行其中的应用程序,无需关心底层环境差异。
特点与优势:
- 隔离性:每个 Docker 容器之间相互独立,拥有自己的文件系统、网络配置和进程空间,确保应用的稳定运行。
- 便携性:Docker 镜像可以在不同的环境中一致地运行,解决了“在我机器上好好的,怎么到你机器就出问题了”的困境。
- 资源利用率高:相比虚拟机,Docker 容器启动迅速,占用资源少,提高了硬件资源的利用率。
- 标准化:通过 Dockerfile 和 Docker Compose 等工具,实现了应用构建、部署流程的标准化和自动化。
1.2 Docker 核心组件
理解 Docker 工作原理,需要熟悉以下核心组件:
-
Docker 镜像(Image):类似于软件包,包含了运行一个应用所需的所有文件和依赖。镜像是只读的,通过
docker pull
或docker build
命令获取。 -
Docker 容器(Container):基于镜像运行起来的实例,是镜像的动态表现形式。容器包含了运行时环境和应用本身,可以通过
docker run
命令创建和启动。 - Docker 守护进程(Docker Daemon):在宿主机上运行的后台服务,负责管理 Docker 镜像、容器以及网络等。
- Docker 客户端(Docker Client):用户与 Docker 守护进程交互的工具,通过命令行或 API 发送请求。
二、Docker 基础命令与使用场景
2.1 安装 Docker
首先,根据你的操作系统(如 Ubuntu、CentOS、Windows、macOS),参照官方文档进行 Docker 的安装。这里以 Ubuntu 为例:
sudo apt update
sudo apt install docker.io
安装完成后,验证 Docker 是否安装成功:
sudo docker run hello-world
2.2 Docker 基础命令
以下是一些常用的 Docker 命令及其应用场景:
镜像操作
- 搜索镜像:查找 Docker Hub 上的镜像
docker search <image_name>
- 拉取镜像:从 Docker Hub 或其他 registry 下载镜像
docker pull <image_name[:tag]>
- 查看本地镜像:列出已下载的镜像
docker images
- 删除镜像:移除不再使用的镜像
docker rmi <image_id|image_name[:tag]>
容器操作
- 运行容器:基于镜像启动一个新的容器
docker run [options] <image_name[:tag]> [command]
例如,运行一个交互式的 Ubuntu 容器并进入其 shell:
docker run -it ubuntu bash
- 查看正在运行的容器:
docker ps
- 停止容器:
docker stop <container_id|container_name>
- 启动容器:
docker start <container_id|container_name>
- 进入容器:连接到正在运行的容器的 shell
docker exec -it <container_id|container_name> bash
- 删除容器:
docker rm <container_id|container_name>
2.3 使用场景示例
场景一:快速搭建开发环境
假设你需要在本地搭建一个 Python 开发环境,包括 Python 解释器、pip 包管理器及一些常用库。传统的做法可能需要手动安装,而使用 Docker 可以简化这一过程:
# 拉取官方 Python 镜像
docker pull python:3.9
# 创建并启动一个基于 Python 镜像的容器,挂载本地项目目录
docker run -it --name my-dev-env -v $(pwd):/app python:3.9 bash
# 在容器内安装所需库
pip install Flask requests
# 开始开发工作...
场景二:测试多版本软件兼容性
有时我们需要测试应用程序在不同版本的软件(如 MySQL、Node.js)上的兼容性。Docker 可以轻松创建多个独立的环境:
# 启动两个不同版本的 MySQL 容器
docker run --name mysql5.7 -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.7
docker run --name mysql8.0 -e MYSQL_ROOT_PASSWORD=secret -d mysql:8.0
# 测试应用连接不同版本 MySQL 的情况
# ...
三、Docker 进阶:Dockerfile 和 Docker Compose
3.1 Dockerfile
Dockerfile 是一个文本文件,用于定义如何构建一个 Docker 镜像。它包含一系列指令,如 FROM
(基础镜像)、RUN
(执行命令)、COPY
(复制文件)、CMD
(默认启动命令)等。
下面是一个简单的 Dockerfile 示例,用于构建一个包含 Python 应用的镜像:
# 使用官方的Python基础镜像
FROM python:3.0-slim
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件复制到容器的/app目录下
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 定义环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 暴露端口
EXPOSE 5000
# 容器启动时运行的命令
CMD ["flask", "run"]
构建镜像:
docker build -t my_python_app .
3.2 Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过编写一个 docker-compose.yml
文件,可以定义多个服务(即容器)、网络、卷等组件,并一键启动整个应用。
下面是一个简单的 docker-compose.yml
示例,包含一个 Flask 应用和一个 MySQL 数据库:
version: '3'
services:
app:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
启动应用:
docker-compose up -d
3.3 网络与数据管理
Docker提供了多种网络模式(如bridge、host、none、overlay等),可根据需要创建和管理容器间的网络连接。此外,还可以使用数据卷(volume)或绑定挂载(bind mount)来管理容器的数据持久化。
四、使用 Docker 部署应用:MySQL及PostgreSQL
1、MySQL部署
步骤一:拉取MySQL镜像
docker pull mysql:latest
步骤二:运行MySQL容器
docker run --name my_mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_password \
-e MYSQL_DATABASE=mydb \
-e MYSQL_USER=user \
-e MYSQL_PASSWORD=password \
-d mysql:latest
这里:
-
-p 3306:3306
:将主机的3306端口映射到容器的3306端口,以便外部访问MySQL服务。 -
-e
参数后跟的环境变量用于配置MySQL。
或者使用docker-compose来启动,内容如下:
version: '3'
services:
mysql:
image: mysql:latest # 使用官方的MySQL最新镜像
container_name: my_mysql # 为MySQL容器指定名称
environment: # 设置MySQL的环境变量,包括root用户的密码、要创建的数据库名、普通用户及其密码
MYSQL_ROOT_PASSWORD: your_mysql_root_password
MYSQL_DATABASE: mymysql_db
MYSQL_USER: mysql_user
MYSQL_PASSWORD: your_mysql_password
ports:
- "3306:3306" # 将主机的3306端口映射到容器的3306端口,允许外部访问MySQL服务
volumes:
- ./mysql_data:/var/lib/mysql # # 使用数据卷mysql_data持久化MySQL的数据
使用此docker-compose-mysql.yml
文件部署MySQL:
-
在终端中定位到包含
docker-compose-mysql.yml
文件的目录。 - 运行以下命令启动并部署服务:
docker-compose -f docker-compose-mysql.yml up -d
-f
参数指定了要使用的docker-compose
文件。-d
参数表示在后台(detached mode)运行容器。部署完成后,你将拥有一个运行着MySQL的容器。你可以通过MySQL客户端工具,使用配置的用户名(mysql_user
)、密码(your_mysql_password
)和端口(3306)访问这个数据库。
要停止并删除MySQL容器和服务,只需在相同目录下运行:
docker-compose -f docker-compose-mysql.yml down
这将停止并移除由docker-compose.yml
文件定义的所有容器、网络和数据卷(除非它们被标记为持久化的)。请注意,由于我们使用了数据卷持久化数据,即使执行docker-compose down
,数据库中的数据也不会丢失。下次重新启动服务时,数据将保持不变。
步骤三:验证MySQL是否运行正常
可以通过以下命令查看MySQL容器日志:
docker logs my_mysql
或者使用MySQL客户端工具(如MySQL Workbench、命令行客户端等)连接到MySQL服务器(地址为localhost,端口为3306,用户名和密码分别为设置的MYSQL_USER
和MYSQL_PASSWORD
)。
至此,我们已经成功使用Docker部署了一个MySQL实例。后续可以根据需要对其进行备份、迁移、扩缩容等操作。
2、PostgreSQL部署
步骤一:拉取PostgreSQL镜像
首先,我们需要从Docker Hub拉取官方的PostgreSQL镜像。在终端中执行以下命令:
docker pull postgres:latest
这将下载最新版本的PostgreSQL镜像。如果你想使用特定版本,可以替换latest
为所需的版本号,例如14
或13
。
步骤二:运行PostgreSQL容器
接下来,我们将使用Docker运行PostgreSQL容器。以下是一条包含必要配置的docker run
命令:
docker run --name my_postgres \
-p 5432:5432 \
-e POSTGRES_USER=user \
-e POSTGRES_PASSWORD=password \
-e POSTGRES_DB=mydb \
-d postgres:latest
这里:
-
--name my_postgres
:为容器指定名称。 -
-p 5432:5432
:将主机的5432端口映射到容器的5432端口,以便外部访问PostgreSQL服务。 -
-e
参数后跟的环境变量用于配置PostgreSQL:-
POSTGRES_USER
:设置数据库的默认用户。 -
POSTGRES_PASSWORD
:设置用户的密码。 -
POSTGRES_DB
:创建一个名为mydb
的数据库。
-
-
-d
:后台运行容器。
或者使用docker-compose来启动,内容如下:
version: '3'
services:
postgres:
image: postgres:latest # 使用官方的PostgreSQL最新镜像
container_name: my_postgres # 为PostgreSQL容器指定名称
environment: # 设置PostgreSQL的环境变量,包括默认用户、用户密码、要创建的数据库名
POSTGRES_USER: postgres_user
POSTGRES_PASSWORD: your_postgres_password
POSTGRES_DB: mypostgres_db
ports:
- "5432:5432" # 将主机的5432端口映射到容器的5432端口,允许外部访问PostgreSQL服务
volumes:
- ./postgres_data:/var/lib/postgresql/data # 使用数据卷postgres_data持久化PostgreSQL的数据
使用此docker-compose-postgres.yml
文件部署PostgreSQL:
-
在终端中定位到包含
docker-compose-postgres.yml
文件的目录。 - 运行以下命令启动并部署服务:
docker-compose -f docker-compose-postgres.yml up -d
-f
参数指定了要使用的docker-compose
文件。-d
参数表示在后台(detached mode)运行容器。部署完成后,你将拥有一个运行着PostgreSQL的容器。你可以通过PostgreSQL客户端工具,使用配置的用户名(postgres_user
)、密码(your_postgres_password
)和端口(5432)访问这个数据库。
要停止并删除PostgreSQL容器和服务,只需在相同目录下运行:
docker-compose -f docker-compose-postgres.yml down
这将停止并移除由docker-compose.yml
文件定义的所有容器、网络和数据卷(除非它们被标记为持久化的)。请注意,由于我们使用了数据卷持久化数据,即使执行docker-compose down
,数据库中的数据也不会丢失。下次重新启动服务时,数据将保持不变。
步骤三:验证PostgreSQL是否运行正常
可以通过以下命令查看PostgreSQL容器日志:
docker logs my_postgres
日志中应能看到PostgreSQL启动成功的相关信息。此外,你可以使用PostgreSQL客户端工具(如pgAdmin、psql命令行客户端等)连接到PostgreSQL服务器(地址为localhost,端口为5432,用户名和密码分别为设置的POSTGRES_USER
和POSTGRES_PASSWORD
),验证数据库是否可以正常访问。
至此,我们已经成功使用Docker部署了一个PostgreSQL实例。后续也可以根据需要对其进行备份、迁移、扩缩容等操作。
总结,本节通过拉取PostgreSQL镜像、运行带有适当配置的容器,以及验证服务运行状态,详细展示了如何使用Docker部署PostgreSQL数据库。结合之前部署的MySQL实例,你现在已具备使用Docker部署两种主流关系型数据库的能力,这对于实际项目中的多数据库环境管理非常有帮助。
最后,本篇博客从认识Docker开始,逐步介绍了Docker的基本概念、核心组件、基础命令、使用场景,以及Dockerfile、Docker Compose等进阶内容。最后通过实战演示了如何使用Docker部署MySQL及PostgreSQL。希望这篇博客能帮助初学者快速入门并掌握Docker,为后续的开发、测试、部署等工作打下坚实基础。