这篇将在centos7上用docker部署spring boot程序,学会如何编译自己的docker,并运行镜像的容器。
主流的云计算(PAAS)平台都支持发布Docker镜像。Docker是使用Dockerfile文件来编译自己的镜像的。
一,Dockerfile
Dockerfile主要有如下的指令:
1)FROM指令
FROM指令指明了当前镜像继承的基镜像。编译当前镜像时会自动下载基镜像。
示例:
FROM ubuntu
2)MAINTAINER指令
MAINTAINER指令指明了当前镜像的作者
示例:
MAINTAINER jack
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 9090
6)ENV指令
ENV指令可用来设置环境变量:
ENV myName=jack
或 ENV myName jack
7)ADD指令
ADD指令是从当前工作目录复制文件到镜像目录中去。
示例:
ADD test.txt /mydir
8)ENTRYPOINT指令
ENTRYPOINT指令可让容器像一个可执行程序一样运行,这样镜像运行时可以像软件一样接收参数执行。ENTRYPOINT是运行时(run)的动作。
示例:
ENTRYPOINT ["/bin/echo"]
我们可以向镜像传递参数运行:
docker run -d iamge-name “this is not test”
二,安装Docker
centos7下通过下面命令安装Docker:
yum install docker
启动Docker并保持开机自启:
systemctl start docker
systemctl enable docker
三,项目目录及文件
下面使用一个spring boot项目来演示,输出一个hello world,docker,如下:
创建一个spring boot项目,
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.jack</groupId>
<artifactId>springboot17dockerfile</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot17dockerfile</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</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>
<finalName>springbootdocker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编写一个测试controller,如下:
package com.jack.springboot17dockerfile.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* create by jack 2017/11/3
*/
@RestController
@RequestMapping("docker")
public class DockerController {
@RequestMapping("/hello")
public String hello(){
return "hello world,docker";
}
}
在centos7上的/usr/local/mysoft目录下放入我们编译好的springbootdocker.jar包,在同级目录下新建一个Dockerfile文件,如下:
Dockerfile文件内容如下:
FROM hub.c.163.com/library/java:latest
MAINTAINER jack
ADD springbootdocker.jar springbootdocker.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","springbootdocker.jar"]
基镜像为:hub.c.163.com/library/java:latest
作者为jack
将springbootdocker.jar添加到镜像中,并重命名为springbootdocker.jar
运行镜像的容器,监听8080端口
启动时运行java -jar springbootdocker.jar
四,编译镜像
在/usr/local/mysoft目录下执行下面的命令,执行编译镜像:
docker build -t jack/springbootdocker .
其中jack/springbootdocker为镜像名称,我们设置jack为前缀。
注意,最后还有一个“.”这是用来指明Dockerfile路径的,“.”表明Dockerfile在当前路径下。
编译的过程如下:
这时我们查看本地镜像如下:
五,运行
通过下面的命令运行:
docker run -d --name springbootdocker -p 9090:8080 -i -t jack/springbootdocker
查看当前的容器状态,如下:
当前虚拟机的ip为192.9.0.104,访问http://192.168.0.104:9090/docker/hello
使用docker logs 容器id
查看容器日志,如下:
上面就是编译一个dockerfile的基本步骤,详细的可以查看官方文档。
代码地址在这里github:https://github.com/wj903829182/SpringCloudTwo/tree/master/springboot17dockerfile