一、如何简单理解Docker
小编看来,docker相当于一台虚拟机,我们大家或多或少玩过vmware虚拟机,我们一般都会在虚拟机上装一些软件,比如mysql,道理一样,我们也可以在docker上面安装一些软件,redis或者mysql或者自己开发的应用程序。
另外,我们都知道maven,maven有自己的中央仓库,道理一样,docker也有自己的仓库。那么maven中央仓库存储什么呢?答案是构建(Artifact),同样的道理,docker也存放着自己的东西,只不过这些东西我们不叫构建,我们叫镜像,docker仓库也称为镜像仓库。
上面提到的内容,我们可以总结出几个知识点。
- 1、docker有自己的中央镜像仓库,也有类似maven仓库地址可分为第三方仓库,甚至,我们可以搭建自己的docker镜像仓库地址,harbor可以了解一下。
- 2、docker就类似一台虚拟机,我们成为容器,容器顾名思义就是装东西,装的东西我们称为镜像
二、Docker安装
小编认为,docker本身就是一个服务,要在linux上面搭建docker服务,我们首先要做的无非就是下载并启动docker。在centos、redhat上,我们可以通过下面命令安装我们的docker容器。
yum install docker
下载完成之后,我们可以通过下面命令查看下docker安装的位置以及版本,输出如下:
whereis docker
docker --version
下载完成,我们进行安装,我们可以选择将docker安装成为一个开机自启动的服务,命令如下:
service docker start # 启动服务
chkconfig docker on # 设置为开机自启动
三、在Docker上部署我们的SpringBoot服务
我们假设你的linux机器上已经安装了jdk8和maven。
我们首先在[start.spring.io/]网站上创建一个springboot web Demo程序,大致的目录结构如下:
其中application.properties
文件没有任何内容,我们在resources目录下新建一个Dockerfile
文件,内容如下:
FROM openjdk:8-jdk-alpine
MAINTAINER "hjw"<lifvalue>
ADD demo-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
注意,Dockerfile是从指令FROM
开始的,而且每个指令首字母要大写。
FROM
表示该镜像的源镜像是哪里,我们使用openjdk8的镜像作为源镜像,更多源镜像,我们可以使用docker search xxx
来搜索,xxx是具体镜像名称。
MAINTAINER
告诉我们镜像维护者是谁
ADD
指令表示将我们的demo-1.0.jar
这个文件添加进来,并且重新命名成app.jar
EXPOSE
表示该镜像启动的时候,所使用的的端口是什么,注意,这里有一个坑,我们最开始说docker就像是虚拟机,所以此处的端口并不是你宿主机器的物理端口,而是只docker这个容器内部的地址。我们可以使用-P -p intenelport:outport
进行映射。
ENTRYPOINT
为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
再贴一下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.0.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
<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>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!-- 镜像名称 -->
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!-- 这里填写我们Dockerfile文件的地址 -->
<dockerDirectory>src/main/resources</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
</project>
MyController.java
@RestController
public class MyController {
@RequestMapping("/sayhello")
private void sayhello() {
System.err.println("hello docker!");
}
}
使用fstp工具,将我们的demo代码拷贝到我们的linux机器上,使用下面命令进行打包:
mvn package
如果没有报错,我们使用docker来构建我们的应用成为一个标准的镜像,命令如下:
mvn package docker:build
到这里就表示构建镜像成功了。如何查看我们的镜像仓库都有哪些镜像呢?使用如下命令即可~
docker images
好了,镜像有了,也就相当于我们的虚拟机有了mysql了,接下来我们就来运行我们刚刚构建的springboot镜像文件,命令如下:
docker run -P -d -p 8080:8080 springboot/demo
-P
表示开启docker虚拟端口-物理端口的映射关系
-p
表示具体指定映射到哪个端口
-d
表示镜像在后台运行
启动完毕之后,我们开下另外一个端口,访问我们刚刚写的接口。
四、Docker扩展
本文的对docker只是做了简单的介绍,更多更高级的docker特性,期待我们后面进一步学习掌握。docker的应用很多,在Web 应用的自动化打包和发布、CI/CD中应用颇多。在自动化打包和发布中,我们一般可以结合git,jenkins来完成这项工作。 我们可能会问,微服务中某个服务我们可能会提供集群,当然docker也可以;微服务中,我们服务越来越多的时候会有服务治理,docker越来越多怎么办呢?答案是docker容器编排,我们可以继续往下深入了解K8S。
更多docker指令,请移步参考:docker指令大全
更多dockfile指令写法,请移步:dockerfile指令官方文档