本节我们将在CentOS7.1上演示用Docker部署Spring Boot程序。前面我们讲述了使用已经编译好的Docker镜像,本节我们将讲述如何编译自己的Docker镜像,并运行镜像的容器。
主流的云计算(PAAS)平台都支持发布Docker镜像。Docker是使用Dokerfile文件来编译自己镜像的。

10.3.1 Dockerfile

Dockerfile主要有如下的指令。

(1)FROM指令

FROM指令指明了当前镜像继承的基镜像。编译当前镜像时会自动下载基镜像。
示例:

FROM ubuntu
(2)MAINTAINER指令

MAINTAINER指令指明了当前镜像的作者。
示例:

MAINTAINER lmz
(3)RUN指令

RUN指令可以在当前镜像上执行Linux命令并形成一个新的层。RUN是编译时(build)的动作。
示例可有如下两种格式,CMD和ENTRYPOINT也是如此:

RUN /bin/bash -c "echo helloworld"
或RUN ["/bin/bash","-c","echo hello"]
(4)CMD指令

CMD指令指明了启动镜像容器时的默认行为。一个Dockerfile里只能有一个CMD指令。CMD指令里设定的命令可以在运行镜像时使用参数覆盖。CMD是运行时(run)的动作。
示例:

CMD echo "this is a test"

可被docker run -d image_name echo “this is not a test” 覆盖。

(5)EXPOSE指令

EXPOSE指明了镜像运行时的容器必需监听指定的端口。
示例:

EXPOSE 8080
(6)ENV指令

ENV指令可用来设置环境变量。
示例:

ENV myName=lmz
或ENV myName lmz
(7)ADD指令

ADD指令是从当前工作目录复制文件到镜像目录中去。
示例:

ADD test.txt /mydir/
(8)ENTRYPOINT指令

ENTRYPOINT指令可以让容器像一个可执行程序一样运行,这样镜像运行时可以像软件一样接收参数执行。ENTRYPOINT是运行是(run)的动作。
示例:

ENTRYPOINT ["/bin/echo"]

我们可以向镜像传递参数运行:

docker run -d image_name "this is not a test"

10.3.2 安装Docker

红帽系列Linux(演示采用CentOS7.1)通过下面命令安装Docker。

yum install docker

启动Docker并保持开机自启:

systemctl start docker
systemctl enable docker

10.3.3 项目目录及文件

我们使用源码的ch10docker来作为演示用的Spring Boot项目,这个项目很简单,只修改入口类,代码如下:

package com.wisely.ch10docker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Ch10dockerApplication {
	
	@RequestMapping("/")
	public String home() {
		return "Hello Docker!!";
	}

	public static void main(String[] args) {
		SpringApplication.run(Ch10dockerApplication.class, args);
	}

}

在CentOS7.1上的 /var/apps/ch10docker目录下放入我们编译好的ch10docker的jar包,如ch10docker-0.0.1-SNAPSHOT.jar,在同级目录下新建一个Dockerfile文件。
内容如下

MAINTAINER lmz

ADD ch10docker-0.0.1-SNAPSHOT.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

代码解释
1.基镜像为Java,标签(版本)为8.
2.作者为lmz。
3.将我们的ch10docker-0.0.1-SNAPSHOT.jar添加到镜像中,并重命名为app.jar。
4.运行镜像的容器,监听8080端口。
5.启动时运行java -jar app.jar

10.3.4 编译镜像

在/var/apps/ch10docker目录下执行下面命令,执行编译镜像:

docker build -t wisely/ch10docker .

其中,wisely/ch10docker为镜像名称,我们设置wisely作为前缀,这也是Docker镜像的一种命名习惯。

注意,最后还有一个“.”,这是用来指明Dockerfile路径的,“.”表示Dockerfile在当前路径下。

编译的过程如图

docker里执行maven docker maintainer_docker里执行maven


这时我们查看本地镜像,如图

docker里执行maven docker maintainer_docker_02

10.3.5 运行

通过下面命令运行:

docker run -d --name ch10 -p 8080:8080 wisely/ch10docker

查看我们当前的容器状态,如图

docker里执行maven docker maintainer_docker_03


当前的CentOS系统的ip为http://106.12.130.17,访问http://106.12.130.17:8080/,我们可以看到如图所示页面。

docker里执行maven docker maintainer_docker_04