这个例子,通过DockerFile构建一个简单的SpringBoot应用,该springboot应用对外暴露了一个api,对外暴露8080端口,日志文件写在应用当前目录,部分代码以及配置文件如下:
@Slf4j @SpringBootApplication @RestController public class SpringbootDockerApplication { public static void main(String[] args) { SpringApplication.run(SpringbootDockerApplication.class, args); } @RequestMapping("/docker") public String docker() { log.info("access docker home at " + LocalTime.now()); return "Hello Docker!"; } }
application.properties
spring.application.name=springboot-docker server.port=8080 logging.file=app.log
把jar和dockerfile文件上传到一个springboot-docker目录中
[root@localhost springboot-docker]# ls Dockerfile springboot-docker-1.0.jar
Dockerfile:
FROM openjdk:8u181-jdk-alpine ARG workdir=/app VOLUME ${workdir} WORKDIR ${workdir} ADD springboot-docker-1.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
- FROM openjdk:8u181-jdk-alpine : 从docker仓库中获取基础镜像
- ARG workdir=/app : 添加变量,该变量只在当前的dockerfile中有效,如果换成ENV,则在容器中生效。这里需要注意的是,ARG和ENV对哪些指令是起效的,可以参考 docker – Dockerfile常用指令
- VOLUME ${workdir} : 把宿主机的目录(该目录可以通过docker inspect dockerName查看)挂载到容器中的/app这个目录,这样可以在宿主机中查看该目录的内容。还有一个很重要的原因,就是数据持久化,如果不挂载,当容器关闭删除后,数据将会跟着被删除。这里因为/app是应用所在的目录,该目录会产生日志等其它内容。
- WORKDIR ${workdir} :指定工作目录,下面的指令操作将在这个指定目录中执行。还有一点是,当通过交互模式的exec命令进入到该容器时,默认当前路径是/app
- ADD springboot-docker-1.0.jar app.jar : 添加文件到WORKDIR
- EXPOSE 8080 : 暴露8080端口,需要通过容器IP和端口访问应用。如果想通过宿主机的IP和端口访问应用,需要在RUN容器的时候绑定。可以参考docker – Dockerfile常用指令 的run命令
- ENTRYPOINT: 运行容器后执行的第一条命令,这里通过java -jar命令运行应用。
接下通过BUILD命令构建镜像
[root@localhost springboot-docker]# docker build -t springboot-docker:1.0 . Sending build context to Docker daemon 17.85MB Step 1/7 : FROM openjdk:8u181-jdk-alpine ---> 97bc1352afde Step 2/7 : ARG workdir=/app ---> Using cache ---> a3818e8696c2 Step 3/7 : VOLUME ${workdir} ---> Using cache ---> e2faefe34aa6 Step 4/7 : WORKDIR ${workdir} ---> Using cache ---> 144b537c1b57 Step 5/7 : ADD springboot-docker-1.0.jar app.jar ---> Using cache ---> daca849e1012 Step 6/7 : EXPOSE 8080 ---> Using cache ---> 123da0847dd3 Step 7/7 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"] ---> Using cache ---> de46a3f96d91 Successfully built de46a3f96d91 Successfully tagged springboot-docker:1.0
查看当前本地仓库的镜像,已经构建springboot-docker:1.0镜像
[root@localhost springboot-docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE springboot-docker 1.0 de46a3f96d91 38 minutes ago 121MB openjdk 8u181-jdk-alpine 97bc1352afde 5 weeks ago 103MB
运行镜像
docker run -p 8080:8080 -d --name springboot-docker springboot-docker:1.0
通过-p参数,把容器中的8080端口映射到宿主机中的8080端口。–name,给容器起一个名字
可以查看springboot应用的启动情况
docker logs -f springboot-docker
查看容器的运行情况
docker inspect springboot-docker
只看一些关键的信息
"Mounts": [ { "Type": "volume", "Name": "90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3", "Source": "/var/lib/docker/volumes/90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3/_data", "Destination": "/app", "Driver": "local", } ], "Networks": { "bridge": { "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", } }
宿主机中的 /var/lib/docker/volumes/90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3/_data 目录挂载到 容器的 /app目录
容器的IP地址 172.17.0.2
运行成功后,在宿主机中通过命令访问服务
curl 172.17.0.2:8080/docker
也可以通过宿主机的IP或者localhost访问,因为已经绑定
curl 127.0.0.1:8080/docker