使用 Docker 进行项目快速部署

完成过数据库上机的同学都知道,我们学院作业使用的数据库为华为出品的 opengauss 数据库。但是老师给出的实验手册中的安装教程与我们以往部署某项目的方式不一致——选择使用 Docker 部署 opengauss,而不是直接在实体机上安装

前言

我们在软件部署中总是会遇到这样的问题:

  • 怎么这项目在我电脑上能跑,到你电脑上就跑不了了
  • 这环境怎么配起来这么复杂,这教程在说啥啊,一个字都看不懂
  • 怎么我 A 项目带着 B 项目一起崩了?他俩也没关系啊?

孩子别怕,我拿 Docker 来救你了!

Docker 可以帮助你轻松运行自己不熟悉语言编写的项目,帮助你更加优雅地部署自己的项目,省去重复下载并配置环境的繁琐过程

Docker 是什么

Docker 是一种容器化平台,它允许开发人员将应用程序及其依赖打包成一个轻量级、可移植的容器,不管前后端应用都可以使用镜像的形式进行分发

两个关键概念:镜像和容器

镜像和容器是 Docker 中的两个核心概念是理解和使用 Docker 的基础

镜像

Docker 镜像是一个轻量级、可执行的软件包,包含了运行一个应用所需的所有内容——代码、运行时、库、环境变量和配置文件,用于创建 Docker 容器。镜像可以在 Docker Hub 或其他容器镜像仓库中存储和分发。用户可以拉取公共镜像或私有镜像来本地使用

容器

Docker 容器是镜像的运行实例。容器是镜像的动态,它们可以被启动、停止、删除和修改。每个容器都是相互隔离的,它们运行在自己的环境中,与其他容器和宿主机隔离

如何使用 Docker

0、安装 Docker

以 Ubuntu 为例

  1. 更新系统包索引

    1
    sudo apt update
  2. 安装必要的包以允许apt通过HTTPS使用仓库

    1
    2
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    # 用于设置系统,准备安装来自安全(HTTPS)存储库的软件,并确保下载的软件是经过验证和可信的
  3. 添加 Docker 的官方 GPG 密钥

    1
    2
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    # 用于验证从远程仓库下载的文件或软件包在传输过程中没有被篡改,确保包没有被篡改或损坏
  4. 添加 Docker 的稳定仓库

    1
    2
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    # 在系统中添加 Docker 官方软件仓库,以便后续通过 apt 安装 Docker 及其更新
  5. 再次更新系统包索引

    1
    sudo apt update
  6. 安装Docker CE(社区版)

    1
    2
    sudo apt install docker-ce
    # Docker Community Edition 简称 Docker CE
  7. 验证Docker是否安装成功

    1
    sudo docker run hello-world

如果一切顺利,您的终端将会打印一下内容:

image-20240908162408373

1、拉取镜像

Docker Hub 是一个公共的 Docker 镜像仓库,其中包含了大量的镜像,用户可以从中拉取镜像到本地使用

image-20240908162430400

例如,要拉取一个名为 opengauss 的镜像,可以使用以下命令:

1
docker pull opengauss/opengauss

2、创建容器

拉取镜像成功后就可以启动容器了

1
2
docker run -d --name opengauss_container -p 5432:5432 opengauss/opengauss
docker run --name opengauss_container --privileged=true -d -e GS_PASSWORD=your_password -e GS_USERNAME=your_username -p 5432:5432 opengauss/opengauss
  • --privileged:赋予容器内的进程几乎相同的权限,容器内的进程可以访问宿主机的所有设备
  • --name opengauss_container:给容器指定一个名称,这里是 opengauss_container
  • -d:表示在后台运行容器
  • -e:传递参数
  • GS_PASSWORD=your_password -e GS_USERNAME=your_username:自定义数据库账号密码
  • -p 5432:5432:将容器的 5432 端口映射到本机的 5432 端口

3、使用容器

这里是以 opengauss 数据库为例,所以接下来我们可以使用 gsql 或数据库管理工具来连接数据库。如果是其他项目,通过端口使用即可

为什么推荐使用 Docker?

更简单、更快速、成功率更高的启动项目

以 opengauss 为例,如果不使用 Docker,直接在实机上安装,可以参考 opengauss 官方给出的 安装教程

显然要麻烦的多,并且配好环境后也不一定能成功运行(

在传统开发流程中,不同的开发、测试和生产环境常常存在差异,导致 「这段代码在我电脑上没问题啊」 的问题。Docker 通过容器化技术,在镜像中打包了项目全部的代码、运行时、库、环境变量和配置文件,容器中的所有配置、依赖和环境设置都与生产环境保持一致。这样一来,应用程序在开发、测试和生产环境中都能以相同的方式运行,从而消除了部署时的环境差异问题

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。使用 Docker 可以直接打包应用本身、配置文件、环境、版本、数据等,在新服务器上可直接部署,如果不使用 Docker 这些步骤都需要自己手动完成:在新服务器上手动配置与原服务器相同的操作系统和软件环境、重新安装数据库软件,包括所有必要的补丁和更新、手动复制和调整数据库配置文件、在新环境中进行测试,确保所有功能正常,数据一致

独立的环境

Docker 运行的不同容器间相互隔离,互不影响,每个容器都是一个独立的环境。这样就可以避免开头提到的 「怎么我 A 项目带着 B 项目一起崩了?他俩也没关系啊?」

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本

对比传统虚拟机

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Docker 为什么可以无视本机环境

还用说,肯定也是虚拟机(

但 Docker 并不是传统的虚拟化技术,而是一种容器化技术(但也属于虚拟化技术,属于轻量级的虚拟化技术),它不需要虚拟出整个操作系统环境,只需要虚拟出小规模的环境。容器共享宿主机的操作系统内核,但每个容器都有自己的文件系统、网络配置、进程空间等。容器内的应用和依赖被封装在容器内部,与宿主机的其他部分隔离。

每一个容器都包含了运行一个应用所需的所有内容——代码、运行时、库、环境变量和配置文件,运行在自己的容器中,所以可以无视本机环境运行项目

总结

你说得对,但是 Docker 是一款由 dotCloud 公司发起的的一款全新开源应用容器引擎。引擎发生在一个被称作「操作系统」的幻想世界,在这里,被 Docker 选中的项目将被授予「镜像」,引导独立运行之力。你将扮演一位名为「DevOps」的角色,在自由的旅行中邂逅功能各异、能力独特的镜像们,和他们一起创建容器,完成产品经理的需求——同时,逐步发掘「复用」的真相