Docker 实战教程之从入门到提高 (六)
本教程的前五篇文章:
- Docker 实战教程之从入门到提高 (一)
- Docker 实战教程之从入门到提高 (二)
- Docker 实战教程之从入门到提高 (三)
- Docker 实战教程之从入门到提高 (四)
- Docker 实战教程之从入门到提高 (五)
以及通过这篇文章的介绍,我们深入学习了 Docker 技术的三大要点。
本文继续通过实战来深入了解 Docker 技术。
练习1:运行在 Docker 里的 SpringBoot 应用,如何查看记录在文件系统的日志
通过本教程前面的练习,我们已经学习了将一个 SpringBoot 应用打包成 Docker 镜像的步骤。那么这个 SpringBoot 应用运行在 Docker 容器镜像实例时,如何查看其生成的日志文件?
DockerFile如下:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
VOLUME /log
ADD target/prolikeService.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar
定义了一个 log 的持久化存储,这样 SpringBoot 应用在容器里运行时,我们可以用命令行进入容器内部,查看 log 文件夹下的日志文件。
在 SpringBoot 应用的 Application.properties
配置文件里,设置日志文件的输出目录为 log:

使用下列的命令行制作镜像:
docker build -t jerry/springbootexample:v1 .
使用下面的命令行在镜像里运行 SpringBoot 应用:
docker run -p 8000:9000 --name jerrydockerdemo -d jerry/springbootexample:v1
使用docker ps
查看镜像 id:

使用下面的命令行进入镜像:
sudo docker exec -it 8302db78f838 /bin/sh
这样就在 Docker 镜像里查看 SpringBoot 应用运行时生成的日志文件:

练习2:Dockerfile 里的 VOLUMES 关键字
我有一个如下的 Dockerfile:

定义了一个名为 log 的 VOLUME, 这样该 SpringBoot 应用运行在 Docker 容器时,我可以用如下命令,进入 Docker 容器内部,到 log 文件夹下查看该 SpringBoot 应用运行时产生的日志:
docker exec -it <容器id> /bin/sh
SpringBoot 应用的 Application.properties 文件:

Dockerfile 里的 VOLUMES 关键字,会在宿主机的目录 /var/lib/docker/volumes
下面生成一个文件夹:

该文件夹里的 _data 子文件夹,存放的就是我们用命令 docker exec -it
进入容器内部后看到的 log 文件夹下的数据。
练习3:另一种办法直接在宿主机上的文件夹内查看 Docker 镜像运行的日志文件
我们可以用 docker ps
首先找到某个 Docker 容器的 id,再使用关键字 docker logs <容器id>
打印出该容器产生的日志:


同样,在宿主机目录 /var/lib/docker/containers
下面,能发现一个文件夹,其前 12 位名称正好是我们在命令 docker ps
里查看到的容器 id:

进入该文件夹,即可查找到以 -json.log
结尾的日志文件:


练习4:在 Docker 里运行 Microsoft SQL 服务器
这个例子展示了如何创建名为 DemoDB 的 MSSQL 数据库,以及名为 Orders 的数据库表,以及两行测试数据。
app 文件夹下的 setup.sql 负责创建数据库,数据库表和测试数据。

init-db.sh 文件用于配置数据库用户名和密码。

docker 文件夹完整层级结构:

Dockerfile 用于创建 docker 镜像。最后一行命令,执行 app 文件夹下面的 entrypoint.sh 文件。
根据 Dockerfile 构建一个镜像:
- 进入如下文件夹:
C:\Code\referenceCode\SAP Kyma教程例子\database-mssql
执行命令行:
docker build -t i042416/mssql -f docker/Dockerfile .

注意,因为基于的镜像名称为 microsoft/mssql-server-linux, 故这个命令应该在 linux 操作系统里完成:

镜像成功制作完毕:

docker 镜像制作完毕后,上传到 docker hub:
docker push i042416/mssql
上传成功:

本地运行这个镜像:
sudo docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=Yukon900 -p 1433:1433 --name sql1 -d i042416/mssql
进入镜像内部,打开 bash shell:
docker exec -it sql1 "bash"

Start the sqlcmd tool, which allows you to run queries against the database, by running this command: /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Yukon900
输入如下 query 命令:
1> USE DemoDB
2> SELECT * FROM ORDERS
3> GO

结果:成功读取到两条订单数据:

在 Docker 内部的 /usr/src/app 文件夹下,确实发现了我制作 docker 镜像时的文件:

Microsoft SQL 服务器,安装在 /opt 目录下:


总结
本文首先介绍了给定一个运行在 Docker 容器中的 SpringBoot 应用,如何用两种不同的交互式方式进入容器实例内部查看其运行时生成的日志文件,回顾了之前学习过的 Dockerfile 里 VOLUMES 关键字的知识点,然后介绍了在 Docker 容器里运行 Microsoft SQL 服务器的详细步骤。
本系列的前五篇文章: