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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342