前言

学习一门东西你要先搞懂怎么使用它。以及使用它的一些操作用语。就好比你去驾校学车,教练首先给你讲这个是方向盘、这个是油门、这个是刹车一定要记住,关键时刻可以保命。然后开始教你怎么让车启动并慢慢跑起来。本文通过 Docker 部署 SpringBoot 带你快速了解 Docker 简单使用 Demo 级别操作。谨以此文献给刚入门的小白,大牛勿喷。

通过本文你将了解到如下内容:

  1. Docker 是什么以及 Docker专用名词
  2. Docker 安装
  3. 快速创建SprngBoot项目
  4. SprngBoot项目 Docker化

了解 Docker 以及相关的专有名词

Docker 是将程序隔离打包的一种容器技术,也被称为“轻量级”虚拟化技术。关于容器技术与物理机和虚拟机的区别,可以参考下面2篇讲的不错博文介绍:

  • 物理机、虚拟机、容器的比较(一) By yibuchen

  • 物理机、虚拟机、容器的比较(二) By yibuchen

说到 Docker 就不得不提三个知识点:镜像、容器、仓库 Docker 必学的三要素,那它们具体代码什么意思呢?听我给你慢慢道来。

镜像:就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。可以理解成启动容器的模板

容器:容器,其实是一种特殊的进程而已。Docker 为该进程划分一个独立空间

仓库:是用来存储镜像的,可以理解成专门存储镜像的仓库。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

Dockerfile:可以通过构建文件创建自定义镜像。

实战操作

安装Docker

可以直接去 https://hub.docker.com/ 下载安装包进行下载安装,前提是需要注册一个账号。也可以直接参考菜鸟的安装教程:

windows 安装教程

win7、win8 系统 和 win10 系统安装配置不同具体请参考菜鸟安装教程

MacOS Docker 安装

需要注意的是 菜鸟教程 Mac 安装教程提供了2个安装包连接分别为:edge 和 stable,这2个安装包区别如下:
edge:尝鲜版 每个月发布一次 可能存在一定问题
stable:稳定版 每个季度更新一次 相对稳定的版本
初学者建议下载stable进行安装。

配置Docker镜像加速

点击任务栏中docker图标然后点击 Settings 后如下图所示配置镜像加速地址

其他系统配置方式请菜鸟教程参考:

https://www.runoob.com/docker/docker-mirror-acceleration.html

可选的镜像加速地址如下:

  • Docker官方提供的中国镜像库地址:https://registry.docker-cn.com
  • 七牛云加速器地址:https://reg-mirror.qiniu.com
  • 网易的镜像地址:http://hub-mirror.c.163.com
  • 阿里云镜像地址:每个阿里云账号提供一个唯一的地址

关于阿里云镜像操作请参考:Docker(二)使用阿里云docker镜像加速 By 路西法_Lucifer

搭建SpringBoot 项目并将其 Docker化

第一步:创建 maven 项目然后引入 SpringBoot的 Parent 依赖。

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> </parent>

第二步:引入 SpringBoot web stater 依赖。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

第三步:在 build 标签内添加 finalName标签配置SpringBoot项目可执行jar包的名称。具体代码如下:

 <finalName>demo</finalName>

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><finalName>demo</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 5、添加插件指定jdk --><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><fork>true</fork></configuration></plugin></plugins></build>
</project>

第四步:创建 SpringBoot的启动类 在src/main/java 目录下,具体代码如下:

package cn.zhuoqianmingyue.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

第五步:创建用于测试的Controller,具体代码如下:

package cn.zhuoqianmingyue.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloDockerController {@GetMapping("/hello")public String hello(){return "hello docker";}
}

第六步:在demo项目中创建 Dockerfile,具体内容如下:

# FROM 自定义的镜像基于 java:8镜像创建。
FROM java:8
# MAINTAINER 作者的信息
MAINTAINER zhuoqianmingyue ljk126wy@126.com# COPY 拷贝target目录下的demo.jar 到自定义镜像中。
COPY target/demo.jar /demo.jar# 运行程序执行的命令,相当于在命令窗口中执行 java -jar demo.jar
ENTRYPOINT ["java", "-jar", "/demo.jar"]

第七步:在 demo项目中创建构建镜像的脚本 build.sh,具体内容如下:

#!/usr/bin/env bash
# 将SpringBoot 项目打包
mvn package# 根据当前目录下Dockerfile配置文件创建镜像
docker build -t demo:latest .

demo:latest :demo 表示镜像的名称,latest 表示版本号。

项目的目录结构如下图所示:

第八步:选中 build.sh 然后右击选择Run build.sh 执行脚本。

执行完毕后可以通过 docker images 查看生成的镜像。

通过 demo:latest 镜像启动一个容器执行的命令如下:

docker run -idt -p 8080:8080 demo:latest

docker run 依靠镜像运行容器

  • -i 以交互模式运行容器,通常与 -t 同时使用。
  • -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  • -d 后台运行容器,并返回容器ID。
  • -p 指定端口映射,格式为:主机(宿主)端口:容器端口。
  • demo:latest 镜像名称:镜像版本号。

docker ps 查看正在运行的镜像

  • CONTAINER_ID:容器ID
  • IMAGE:具体的镜像
  • COMMOND:运行程序执行的命令
  • STATUS:容器的状态
  • PORTS:容器映射的端口
  • NAMES:容器的名称

通过 docker log -f 容器ID 查看 SpringBoot 项目启动日志,具体操作如下图。

Windows通过 Docker 启动一个容器可以理解成创建了一个Linux的虚拟机,并在该虚拟机中运行我们的程序。可以通过 docker exec -it 容器ID /bin/bash 进入容器(也可以理解成进入Linux的虚拟机)。执行 curl localhost:8080/hello 在虚拟机本地访问运行SpringBoot 项目,具体操作如下:


因为Docker 相当于创建了一个Linux的虚拟机,所以直接通过游览器执行 localhost是访问不了的。因为这个问题各种百度大部分介绍都是通过执行docker-machine ip default 查看虚拟机的 ip 但是我执行后是这样的

命令建议我们通过 docker-machine ls 查看,具体操作如下:

自己对 docker-machine 操作不是很熟,希望有解决了的小伙伴私信我。

虽然通过 docker-machine 没有获取到虚拟机的 ip ,但是我通过另外的方式获取到了,具体操作如下:

执行ipconfig 查看Docker 虚拟主机的 ip,具体操作如下:

然后通过ip 访问以SpringBoot 搭建的 Demo 项目。

需要说明的是我的机器是 win10 64位操作系统。

到这里所有操作执行完毕!接下来开始做一个简单的总结。

小结

将一个 SpringBoot Docker 化的具体操作步骤如下:

  1. 创建SpringBoot项目
  2. 定义Dockerfile 文件来创建自定义镜像
  3. 通过自定义镜像启动容器。
  4. 查看容器中应用程序的日志以及访问运行中的程序

关于镜像、容器、Dockerfile 常用的操作命令如下:

命令 用途 示例
docker images 查看主机上的镜像列表 docker images
docker pull 下载镜像到本地主机 docker pull redis:latest
docker search 查找镜像 docker search redis
docker rmi 镜像名称 删除镜像 docker rmi demo
docker tag 镜像ID 用户名称/镜像源名(repository name):新的标签名(tag) 为镜像打标签 docker tag 860c279d2fec zqmy/demo:5.3
docker ps 查看启动中的容器 docker ps
docker ps -a 查看启动容器历史记录 docker ps -a
docker run 启动容器 docker run -itd --name redis-test -p 6379:6379 redis
docker stop <容器 ID> 停止容器 docker stop a750ccbcad88
docker restart <容器 ID> 重启容器 docker restart a750ccbcad88
docker exec -it <容器 ID> /bin/bash 进入容器 docker exec -it a750ccbcad88 /bin/bash
docker rm -f <容器 ID> 删除容器 docker rm -f a750ccbcad88
docker log -f <容器 ID> 查看容器日志输出 docker log -f a750ccbcad88

在这里感谢以下免费学习 Docker 教程,本文教程大部分参照以下内容进行编写

  • 菜鸟教程

  • Docker入门

  • 第一个docker化的java应用

  • 物理机、虚拟机、容器的比较(一) By yibuchen

  • 物理机、虚拟机、容器的比较(二) By yibuchen

  • Docker(二)使用阿里云docker镜像加速 By 路西法_Lucifer

不搞虚的!快速把你拉入Docker 的门里相关推荐

  1. 不搞虚的!快速把你拉入Docker 的门里 | 原力计划

    作者 | 桌前明月 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 前言 学习一门东西你要先搞懂怎么使用它.以及使用它的一些操作用语.就好比你去驾校学车,教练首先给你讲这个是方向盘.这个 ...

  2. 如何在App中实现朋友圈功能之六快速实现下拉加载朋友圈功能——箭扣科技Arrownock

    如何在App中实现朋友圈功能 之六 快速实现下拉加载朋友圈功能 实现逻辑: 根据上次下拉刷新的时间从数据库加载出limit(比如10)条post,判断总数据条数: a. 如果总数据大于limit条,清 ...

  3. Excel表格中如何快速生成下拉菜单

    Excel表格中如何快速生成下拉菜单 目录 Excel表格中如何快速生成下拉菜单 1.例如下表先手动输入前几组的"等级"类别"优良中差" ​2.同时按住 alt ...

  4. 【MDPI】全球最大 OA 出版商旗下所有期刊被拉入黑名单,包括 98 本 SCI 期刊

    专门揭露掠夺性期刊的知名学术网站 Predatory Reports 在今年 2 月 23 日发布消息,将知名学术出版集团 MDPI 旗下所有 422 本期刊( 413 本期刊和+9 本会议期刊)拉入 ...

  5. Android之解决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签)

    1 问题 决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签),我们访问youtube.com官网,点击网站的视频,点击视频右上角三个点设置,然后点击 播放设置 然后点 ...

  6. Odoo快速部署 附Odoo的Docker启动脚本

    Odoo快速部署 附Odoo的Docker启动脚本 前置条件 请先安装好docker和dokcer-compose docker-compose.yml version: '2' services:w ...

  7. html表单中动态添加下拉框,antd Select下拉菜单动态添加option里的内容操作

    antd Select下拉菜单动态添加option里的内容,通过form表单绑定select选中的值 提供一个公共的方法,每次只需去调用这个方法就行了 //这里是示例数据格式 let giftScop ...

  8. 拉起Docker容器初始化数据源时,报:org.postgresql.util.PSQLException: The connection attempt failed. 的解决办法

    问题概述 关于这个问题,博主是在进行容器化部署的时候遇到的, 这个问题,说是问题又不是问题,为了紧贴单位的发展战略及发展文化方针,给单位培养人才,先大胆的让同事先尝试着操作,最后出现问题了,博主就出场 ...

  9. 漏极开路门详解(Open Drain, OD)定义 提示 上拉电阻对OD门动态性能的影响

    定义: 指CMOS门电路的输出只有NMOS管,并且它的漏极是开路的. 提示: 由于OD门不能输出高电平,只能输出低电平,所以在使用OD门时必须在漏极和电源VDD间接一个上拉电阻. 上拉电阻对OD门动态 ...

最新文章

  1. java 1000个线程_关于Java多线程的一个问题
  2. iframe和父窗体之间的互相监听方法
  3. 字符串替换ant修改文件中的内容
  4. 计算机二级2021辅导书,2021该如何准备计算机二级考试?
  5. 2014-02-20
  6. java获得服务器路径的几中方法
  7. 数字游戏(水博客ing / csp-J T1 / luogu 5660)
  8. jQuery图片延迟加载插件jQuery.lazyload
  9. 联想Z6 Pro测评:斗战圣佛?很能打!
  10. Python程序的执行过程
  11. 2016-2017 华为中兴笔试+测评+技术面+综合二面+洽谈经验
  12. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构 1
  13. python矩形法求定积分_如何用矩形法(梯形法)求定积分
  14. 商帮文化数据:十大商帮文化代理变量(数据+代码)
  15. Vue Eslint语法检测工具
  16. CSS常用背景属性(背景颜色、背景图片、背景平铺、背景位置、背景附着、背景色半透明、背景属性复合写法)
  17. 李永乐讲通信与计算机专业,哈工大通信与信息工程18考研经验分享
  18. 【Andrew Gelman多元统计】(基于R)
  19. 说话人识别(speaker Recognition/Verification)简介
  20. HashMap底层源码解析

热门文章

  1. wegame登录cf显示服务器人数已满,电一再现万人排队进游戏的盛况?老玩家:感觉回到了三年前...
  2. JavaScript基本类型和引用类型
  3. 机器学习和AI的Python基础
  4. SQL COALESCE函数和NULL
  5. SQL 之后,GQL 成为 ISO/IEC 国际标准数据库语言项目
  6. Win 10 更新,Linux 内核的 WSL 2 开始上线
  7. Angular 7和ASP.NET Core 2.1入门
  8. vuedraggable嵌套块拖拽_Vue.Draggable拖拽效果
  9. java回车后自动从一个文本框切换到另一个_Java实用教程-Java基本语法-Java程序的构成...
  10. java如何取出数组指定数据6_java 从数组取出指定数量的值,相加大于等于或小于等于指定的值,取出对应的组合下标,下标不能重复...