Docker简介

Docker是打包和分发赢博体育程序的一种流行机制。Docker系统允许用户将赢博体育程序打包成镜像进行分发,然后将这些镜像文件转换为在用户计算机或服务器上运行的容器。Docker还提供了一些工具,使多个赢博体育程序可以轻松地同时运行在不同的容器中,这些容器可以相互通信并协作以实现某些目标。

为了使赢博体育这些更具体,在这些讲义中,我将展示一个示例,其中我将Spring Boot赢博体育程序打包到一个映像中,并将MySQL数据库打包到第二个映像中。然后,我将演示如何使这两者一起工作以创建一个完整的系统。

什么是Docker映像?映像是一种打包机制,它将赢博体育程序与其操作所需的依赖项打包在一起。例如,要运行Spring Boot赢博体育程序,我们通常会将Spring Boot赢博体育程序编译成一个jar文件,然后使用Java运行时环境来运行该jar文件。Docker将允许我们将jar文件和Java运行时环境打包到一个可以运行的映像中。这样做的目的是使分发赢博体育程序变得更容易:我们可以给他们一个Docker镜像,其中包含了运行赢博体育程序所需的一切,而不是给他们一个jar文件,然后告诉他们需要设置一个Java运行时来运行它。要运行这些镜像,用户需要在他们的系统上安装Docker,但这对于服务器来说是一件相当普遍的事情。

如果你想跟随我在这节课中展示的一些例子,你还需要在你的电脑上安装Docker。在笔记本电脑上进行此操作的最简单方法是安装Docker Desktop赢博体育程序。

树立形象

构造一个映像最简单的方法是构造一个Dockerfile。这是一个文本文件,其中包含Docker设置镜像所需的赢博体育信息。

下面是一个典型的Dockerfile的示例。这里显示的Dockerfile是我用来构建一个映像的,该映像将我的拍卖赢博体育程序的jar文件与JDK一起打包:

运行mkdir /opt/app COPY jpaauction.jar /opt/app EXPOSE 8085 CMD ["java", "-jar", "/opt/app/jpaauction.jar"]

这个文本被放入一个文件中,这个文件的字面名称是“Dockerfile”。此外,我假设我有一个jar文件的副本存储在与Dockerfile相同的目录中。

在这几行代码中发生了很多事情:

一旦我们构建了Dockerfile,我们就可以要求Docker从它构建一个镜像。例如,我们可以运行命令

Docker build -t auction Docker run -dp 8085:8085 auction

在终端中从Dockerfile创建镜像,然后运行镜像。这里的run命令以分离模式运行容器,这实际上是在后台运行赢博体育程序。正在运行的容器将出现在容器下的Docker桌面赢博体育程序中。在那里,您将看到可用于停止容器的控件。

只有当我们已经在同一台机器上安装了数据库以便服务器与之通信时,运行拍卖赢博体育程序本身才会真正工作。

Docker撰写简介

当我们分发我们的赢博体育程序时,我们会想要分发它成功运行所需的一切。如果我们计划将服务器安装在MySQL服务器和数据库不可用的位置,我们将需要安排将我们的映像与安装了MySQL和拍卖数据库的第二个映像一起分发。此外,我们需要安排这两个容器能够相互通信。

幸运的是,Docker提供了一个相对简单的工具,称为Docker Compose,它可以轻松地同时运行多个协作容器。

使用Docker Compose的关键是建立第二个配置文件,名为Docker - Compose。在与Dockerfile和jar文件相同的目录下。

这是我的docker-compose的初始版本。Yaml文件看起来像:

Services: auction: build:。图片:joegregglu/auction:最近重启:总是端口:—8085:8085网络:—拍卖环境:—spring.datasource. exeurl=jdbc:mysql://mysqldb:3306/auction depends_on: - mysqldb mysqldb: image: "mysql:8.0" restart: always ports: - 3305:3306网络:-拍卖环境:MYSQL_DATABASE: auction MYSQL_USER: student MYSQL_PASSWORD: Cmsc250!MYSQL_ROOT_PASSWORD: Cmsc455 !- ${PWD}/auction.sql:/docker-entrypoint-initdb.d/auction。SQL网络:拍卖;

这里要注意的第一件事是,使用一个典型的YAML文件来设置配置命令的分层集合。在这个层次结构的顶层,我们看到两个条目:服务和网络。网络部分包含一个名为“auction”的虚拟网络,我们将使用它使两个容器能够相互通信。

该文档最重要的部分是services部分,它定义了两个服务:auction和mysqldb。拍卖服务本质上是一个容器,它将托管我们的Spring Boot赢博体育程序,而mysqldb服务将是一个容器,它运行MySQL的副本,其中安装了我们的拍卖数据库。

拍卖服务包含一个构建命令,该命令告诉docker compose在同一目录中查找Dockerfile并运行该Dockerfile来构建初始映像。除此之外,我们还有一个映像设置,它将决定我们构建的映像的名称。稍后,当我们将映像推送到Dockerhub时,映像名称也将指定我们要将该映像推送到我提前设置的名为“joegregglu”的存储库中。环境选项允许我们在启动拍卖容器时将环境值传递给它。在本例中,我将传递一个环境值,告诉服务器覆盖赢博体育程序中的spring.datasource.url设置。属性设置一个新值,该值指向第二个容器中运行的MySQL服务器。

mysqldb服务与拍卖服务略有不同。对于数据库映像,我们不打算使用Dockerfile。相反,我们指定了一个标准的Docker基础镜像,该镜像已经安装了MySQL 8.0版本。该服务的环境部分指定,当MySQL启动时,它应该创建一个名为‘auction’的新空数据库,并设置一个具有访问该数据库所需特权的用户。为了定义拍卖数据库的结构,我首先使用MySQL工作台导出一个名为‘auction ’的自包含转储文件。Sql '定义了数据库所需的表。服务中的volumes选项允许我们将该文件的副本挂载到容器的docker-entrypoint-initdb中的数据库容器中。d目录。MySQL容器被设置为在该文件夹中查找转储文件,并将自动加载在那里找到的任何此类转储文件。这将保证我们的数据库将安装在数据库容器中并准备使用。

要构建和运行我们的双容器系统,我们只需要运行命令

Docker-compose build

要重新关闭容器,我们只需要执行这个命令

docker-compose下来

把我们的图像放到服务器上

为了准备在服务器上设置图像并在服务器上运行它们,我需要执行两个额外的步骤。第一步是将Spring Boot映像推送到Dockerhub以供以后访问。要做到这一点,我只需要运行命令

docker-compose推

第二步是构造一个稍微修改过的docker-compose。在服务器上使用的Yaml文件。

这是docker-compose。我设置了一个在生产服务器上运行的yaml文件:

服务:auction: image: joegregglu/auction:latest restart: always端口:—80:8085网络:—拍卖环境:—spring.datasource. data .data .data .data .data .data。url=jdbc:mysql://mysqldb:3306/auction depends_on: mysqldb: condition: service_healthy mysqldb: image: "mysql:8.0" restart: always端口:- 3306:3306网络:-拍卖环境:MYSQL_DATABASE: auction MYSQL_USER: student MYSQL_PASSWORD: Cmsc250!MYSQL_ROOT_PASSWORD: Cmsc455 !- ./auction.sql:/docker-entrypoint-initdb.d/auction。sql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 1秒重试次数:120次网络:拍卖

以下是配置文件中需要注意的一些重要更改:

设置服务器

下一步是设置服务器并在其上安装所需的一切。下面的示例命令假设我已经在Amazon Web Services上设置了一个Ubuntu EC2实例,它将作为我们示例的服务器。

在设置服务器时需要注意的一件事是,我们为服务器指定了正确的体系结构。因为我是在带有Arm架构的Mac笔记本电脑上构建拍卖图像,所以我们需要确保设置一个使用相同Arm64架构的服务器。

一旦EC2实例启动并运行,我们就可以连接到它并开始运行必要的设置命令。

我们首先在服务器端安装docker和docker-compose:

Sudo apt update Sudo apt upgrade Sudo apt install -y docker。sudo systemctl启动docker sudo systemctl启用docker sudo curl - l “https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)”chmod +x /usr/local/bin/docker-compose

然后我们需要复制我们的docker-compose。将SQL转储文件保存到服务器。为此,我们断开与服务器的连接,并在本地终端运行scp命令:

SCP -i <pem-file> auction。SQL ubuntu@<server-address>:/home/ubuntu/ SCP -i <pem-file> docker-compose。yaml ubuntu@ <服务器地址>:/ home / ubuntu /

其中 是AWS提供给我们的密钥文件的名称。一旦这两个文件就位,我们就可以连接回服务器并运行命令

Sudo docker-compose up -d

启动我们的容器。此时,我们的容器将在服务器的后台启动并运行。