Docker学习指南

前言

亲爱的读者们,欢迎来到这篇专为“小白”打造的 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 pulldocker 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:

  1. 在终端中定位到包含docker-compose-mysql.yml文件的目录
  2. 运行以下命令启动并部署服务
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_USERMYSQL_PASSWORD)。

至此,我们已经成功使用Docker部署了一个MySQL实例。后续可以根据需要对其进行备份、迁移、扩缩容等操作。

2、PostgreSQL部署

步骤一:拉取PostgreSQL镜像

首先,我们需要从Docker Hub拉取官方的PostgreSQL镜像。在终端中执行以下命令:

docker pull postgres:latest

这将下载最新版本的PostgreSQL镜像。如果你想使用特定版本,可以替换latest为所需的版本号,例如1413

步骤二:运行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:

  1. 在终端中定位到包含docker-compose-postgres.yml文件的目录
  2. 运行以下命令启动并部署服务
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_USERPOSTGRES_PASSWORD),验证数据库是否可以正常访问。

至此,我们已经成功使用Docker部署了一个PostgreSQL实例。后续也可以根据需要对其进行备份、迁移、扩缩容等操作。

总结,本节通过拉取PostgreSQL镜像、运行带有适当配置的容器,以及验证服务运行状态,详细展示了如何使用Docker部署PostgreSQL数据库。结合之前部署的MySQL实例,你现在已具备使用Docker部署两种主流关系型数据库的能力,这对于实际项目中的多数据库环境管理非常有帮助。

最后,本篇博客从认识Docker开始,逐步介绍了Docker的基本概念、核心组件、基础命令、使用场景,以及Dockerfile、Docker Compose等进阶内容。最后通过实战演示了如何使用Docker部署MySQL及PostgreSQL。希望这篇博客能帮助初学者快速入门并掌握Docker,为后续的开发、测试、部署等工作打下坚实基础。

上一篇:HTML常用文本标签以及注释文本


下一篇:视觉Transformer和Swin Transformer