Docker镜像打包、共享和运行

1 Docker简介

Docker是一个用于开发、交付和运行应用程序的开放平台。它支持Linux、Windows和macOS平台,其架构如下:


Docker架构
  • 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进行管理,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

Speccy检查结果

如果不支持虚拟化,则无法进行后续步骤;如果支持但未启用,则启用虚拟化(具体启用方式根据电脑不同有所差异,请自行寻找方法)。

2.2 安装Docker Toolbox

Docker Toolbox的安装过程很简单,不再赘述。Docker Toolbox下载地址:https://github.com/docker/toolbox/releases
安装完成后运行Docker Quickstart Terminal,Docker Quickstart Terminal会自动初始化,初始化成功如下图所示:

Docker Quickstart Terminal

按照国际惯例,先从Hello World开始。执行以下命令会从Docker Hub拉取并运行hello-world应用程序:

docker run hello-world

执行成功如下图所示:


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

推送镜像耗时比较久,完成后可以在阿里云上看到该镜像:


共享Docker镜像到阿里云

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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。