1 Docker简介
Docker是一个用于开发、交付和运行应用程序的开放平台。它支持Linux、Windows和macOS平台,其架构如下:
- Client:代表Docker客户端,一个命令行工具,使用REST API与Docker服务端通信。
- Docker daemon:代表Docker服务端守护程序,用于监听Docker客户端命令,并管理Docker对象(image、container、文件系统和网络等)。
- Registry:Docker镜像仓库,Docker Hub为Docker官方Docker镜像仓库。考虑到网速等原因,本文使用阿里云的Docker镜像仓库。
- Image:Docker镜像,是一个带创建Docker容器说明的应用程序及其依赖的集合。
-
Container:Docker容器,是镜像的可运行实例。Docker容器经常与虚拟机概念进行比较,以下借助官方图片对两者进行说明:
Docker容器通过Docker进行管理,Docker容器只包含应用程序及其依赖程序。虚拟机通过Hypervisor进行管理,虚拟机包含了冗余的访客操作系统,在访客操作系统上运行应用程序及其依赖程序。因此Docker容器相比虚拟机更加轻量化。
2 安装Docker
我使用的电脑是Windows 7,因此需要使用Docker Toolbox安装Docker(Windows 10使用Docker Desktop)。
2.1 检查CPU是否支持并启用虚拟化
Docker服务端依赖Linux内核的功能,不能直接在Windows中运行,因此需要借助Docker Machine。Docker Machine用于在Windows中创建Linux(Alpine Linux)虚拟机,该虚拟机用于托管Docker服务端。既然要创建虚拟机,必然要保证CPU支持并启用虚拟化,否则无法进行后续步骤。检查CPU是否支持并启用虚拟化的方法有很多种,我这里使用的是Speccy工具,下载地址:https://www.ccleaner.com/speccy
如果不支持虚拟化,则无法进行后续步骤;如果支持但未启用,则启用虚拟化(具体启用方式根据电脑不同有所差异,请自行寻找方法)。
2.2 安装Docker Toolbox
Docker Toolbox的安装过程很简单,不再赘述。Docker Toolbox下载地址:https://github.com/docker/toolbox/releases
安装完成后运行Docker Quickstart Terminal,Docker Quickstart Terminal会自动初始化,初始化成功如下图所示:
按照国际惯例,先从Hello World开始。执行以下命令会从Docker Hub拉取并运行hello-world应用程序:
docker run hello-world
执行成功如下图所示:
3 打包和共享Docker镜像
以IntelliJ IDEA为例,创建一个Spring Boot应用程序,并使用jib-maven-plugin插件对应用进行打包。使用jib-maven-plugin插件可避免在项目中创建Dockerfile文件。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lujiatao</groupId>
<artifactId>spring-boot-for-docker</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.8.0</version>
<configuration>
<!-- 允许HTTP连接到远程镜像仓库 -->
<allowInsecureRegistries>true</allowInsecureRegistries>
<from>
<!-- 基础镜像 -->
<image>openjdk:13-jdk-alpine</image>
</from>
<to>
<!-- 镜像仓库域名/命名空间/镜像名称:镜像Tag(需根据实际情况替换) -->
<image>registry.cn-chengdu.aliyuncs.com/lujiatao/spring-boot-for-docker:${project.version}
</image>
<!-- 镜像仓库帐号密码(需根据实际情况替换) -->
<auth>
<username>your-username</username>
<password>your-password</password>
</auth>
</to>
<container>
<!-- 镜像创建时间与系统时间对齐 -->
<creationTime>USE_CURRENT_TIMESTAMP</creationTime>
</container>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<!-- build把镜像推到远程镜像仓库,dockerBuild把镜像推到本地镜像仓库 -->
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
SpringBootForDocker.java:
package com.lujiatao.springbootfordocker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SpringBootForDocker {
public static void main(String[] args) {
SpringApplication.run(SpringBootForDocker.class, args);
}
@GetMapping
public String index() {
return "Hello Spring Boot For Docker!";
}
}
在IntelliJ IDEA中执行以下命令打包并共享镜像到阿里云:
mvn clean compile
推送镜像耗时比较久,完成后可以在阿里云上看到该镜像:
4 运行Docker镜像
在Docker Quickstart Terminal中执行以下命令拉取镜像到本地仓库:
docker pull registry.cn-chengdu.aliyuncs.com/lujiatao/spring-boot-for-docker:1.0-SNAPSHOT
在Docker Quickstart Terminal中执行以下命令运行该应用程序:
docker run -p 8000:8080 -d --name sb4d registry.cn-chengdu.aliyuncs.com/lujiatao/spring-boot-for-docker:1.0-SNAPSHOT
访问http://192.168.99.100:8000/,如下图所示访问成功:
5 参考文献
Docker Get Started:https://docs.docker.com/get-started/
Install Docker Toolbox on Windows:https://docs.docker.com/toolbox/toolbox_install_windows/
Spring Boot with Docker:https://spring.io/guides/gs/spring-boot-docker/