dockerfile是docker指定镜像的脚本,由一行行命令语句组成,并且支持以#开头作为注释。一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。具体的dockerfile指令解释请看这篇文章。本篇文章利用dockerfile生成一个springboot的应用镜像,并用docker run命令启动。
1.项目文件简介
1.1 PeopleController文件
控制层,直接返回请求,很简单,没有任何逻辑。
@RestController
@Slf4j
@RequestMapping("/people")
public class PeopleController {
@GetMapping("/all")
public ResponseEntity<String> findAll(){
return ResponseEntity.ok().body("hello world");
}
}
1.2配置文件
配置文件主要配置了项目的端口号,log日志配置地址,以及项目的context-path
server.port=9650
logging.config=ext/conf/logback.xml
server.servlet.context-path=/docker/rest/v1
1.3pom文件
下面代码给了所用依赖以及maven打包时需要的插件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-conf</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<outputDirectory>${project.build.directory}/ext/conf</outputDirectory>
<resources>
<resource>
<directory>ext/conf</directory>
<includes>
<include>logback.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.Dockerfile文件
dockerfile文件是我们的重点,我们利用它来生成image。
FROM java:8-jre
ADD ./target/docker-springboot-0.0.1-SNAPSHOT.jar app.jar
ADD ./target/ext/conf/logback.xml ext/conf/logback.xml
LABEL maintainer="honorzhang@tju.edu.cn"
EXPOSE 9650
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
FROM是一个Dockerfile的第一个指令,是需要的基础镜像;
ADD是把我们运行的jar包添加到docker目录中,并改名为app.jar,后一个是把日志配置文件复制到docker中;
ENTRYPOINT指定容器启动时的默认运行的命令。
3.生成镜像
docker build -t docker-springboot:v1.0 .
在Dockerfile所在目录下,运行上面的命令。
-
-f
:指定要使用的 Dockerfile 路径,本文中在同一个目录下。 -
--tag, -t
:镜像的标签以及名字,可以在一次构建中为一个镜像设置多个标签。
我们在使用 docker build
命令去构建镜像时,往往会看到命令最后会有一个 .
号。它究竟是什么意思呢?很多人以为是用来指定 Dockerfile
文件所在的位置的,但其实 -f
参数才是用来指定 Dockerfile
的路径的,那么 .
号究竟是用来做什么的呢?
Docker
在运行时分为 Docker 引擎(服务端守护进程)
和 客户端工具
,我们日常使用各种 docker 命令
,其实就是在使用 客户端工具
与 Docker 引擎
进行交互。当我们使用 docker build
命令来构建镜像时,这个构建过程其实是在 Docker 引擎
中完成的,而不是在本机环境。如果在 Dockerfile
中使用了一些 ADD
等指令来操作文件,如何让 Docker 引擎
获取到这些文件呢?
这里就有了一个 镜像构建上下文
的概念,当构建的时候,由用户指定构建镜像时的上下文路径,而 docker build
会将这个路径下所有的文件都打包上传给 Docker 引擎
,引擎内将这些内容展开后,就能获取到上下文中的文件了。
构建成功,查看镜像信息
4.运行镜像
docker run --name docker-springboot -p 9650:9650 docker-springboot:v1.0
- --name 指定容器的名称
- -p端口映射,-p hostport:containerport