Docker 实战教程之从入门到提高 (六)

本教程的前五篇文章:
以及通过这篇文章的介绍,我们深入学习了 Docker 技术的三大要点。
本文继续通过实战来深入了解 Docker 技术。
练习 1:运行在 Docker 里的 SpringBoot 应用,如何查看记录在文件系统的日志
通过本教程前面的练习,我们已经学习了将一个 SpringBoot 应用打包成 Docker 镜像的步骤。那么这个 SpringBoot 应用运行在 Docker 容器镜像实例时,如何查看其生成的日志文件?
DockerFile 如下:
定义了一个 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 关键字
VOLUME(卷) 是保存由 Docker 容器生成和使用的数据的首选机制。 虽然绑定挂载依赖于主机的目录结构和操作系统,但 VOLUME 完全由 Docker 管理。
与在容器的可写层中持久化数据相比,VOLUME 通常是更好的选择,因为 VOLUME 不会增加使用它的容器的大小,并且其内容存在于给定容器的生命周期之外。
我有一个如下的 Dockerfile:

定义了一个名为 log 的 VOLUME, 这样该 SpringBoot 应用运行在 Docker 容器时,我可以用如下命令,进入 Docker 容器内部,到 log 文件夹下查看该 SpringBoot 应用运行时产生的日志:
docker exec -it <容器 id> /bin/shSpringBoot 应用的 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 DemoDB2> SELECT * FROM ORDERS3> GO

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

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

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


总结
本文首先介绍了给定一个运行在 Docker 容器中的 SpringBoot 应用,如何用两种不同的交互式方式进入容器实例内部查看其运行时生成的日志文件,回顾了之前学习过的 Dockerfile 里 VOLUMES 关键字的知识点,然后介绍了在 Docker 容器里运行 Microsoft SQL 服务器的详细步骤。
本系列的前五篇文章:
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/028f10c4b251248cf37442836】。文章转载请联系作者。
评论