Docker 实战教程之从入门到提高 (八)
![Docker 实战教程之从入门到提高 (八)](https://static001.geekbang.org/infoq/f1/f1eba3d71eacc82d814cd80d68ab3218.jpeg)
本教程的前七篇文章:
以及通过这篇文章的介绍,我们深入学习了 Docker 技术的三大要点。
从本文开始,我们将分享一些在 Windows 操作系统下的 Docker 实战演练。
练习 1:如何在 Windows 操作系统下使用 Docker 运行一个 Web 应用
本教程之前的文章,介绍的步骤全是在 Ubuntu 操作系统下使用 Docker 的步骤。本练习方便那些使用 Windows 操作系统的学习者,了解如何在 Windows 操作系统下使用 Docker.
这里的 Windows 特指 Windows 10.Windows 操作系统使用 Docker 的前提是要开启 Hyper V
虚拟技术,在控制面板里把Hyper-V
前面的勾选中,重启即可。
![](https://static001.geekbang.org/infoq/1e/1e6993c6d2b9adb4274d4f0215907de3.png)
Docker 官网下载 Docker For Windows 的 Community 版本:
![](https://static001.geekbang.org/infoq/4f/4fb2a2dc515b91574a3c786a767015bf.png)
下载下来是一个 900 多兆的可执行文件:
![](https://static001.geekbang.org/infoq/7f/7fccdfd3392250d75f25cba2fc6be895.png)
安装后,在右下角任务栏里能看到 Docker 的图标:
![](https://static001.geekbang.org/infoq/ec/ec240ace6fc86983ab4a29fd7d880b24.png)
安装默认会把 Docker 命令行工具 docker.exe 和容器编排工具 docker-compose.exe 安装到 Program Files 的 Docker 文件夹内:
![](https://static001.geekbang.org/infoq/86/869f2af5dbc344926faba539aa7965db.png)
右键可以使用 GUI 的方式来管理:
![](https://static001.geekbang.org/infoq/94/94220382ae7d2a6e81500e95fbfafa88.png)
但我们一般情况下还是更习惯于使用命令行工具 docker.exe
对各种容器镜像进行操作。
笔者已经事先开发好了一个 SAP UI5 应用,将其部署并运行在 Nginx 服务器上,并且把该应用和 Nginx 服务器一起打包在一个容器镜像内,并发布到 Docker Hub 上了,该镜像名称如下:
![](https://static001.geekbang.org/infoq/8f/8f6df9dbd3bdc27f0a19249139950e31.png)
命令行里直接运行这个镜像即可:
docker run i042416/ui5-nginx:v2.0
![](https://static001.geekbang.org/infoq/bc/bc86765adbae89f20077192c9d7e97bf.png)
从命令打印日志能看出,因为我的本地环境没有这个名为 i042416/ui5-nginx
,标签为 v2.0 的镜像,因此首先会自动从 Docker Hub 将镜像下载到本地。之后使用 docker images
命令就能看到这个成功下载到本地的镜像了,大小约为 109MB:
![](https://static001.geekbang.org/infoq/54/54a12e56894a08f98fddd0ecc1682abc.png)
现在使用如下的命令行启动一个容器:
docker run -d -p 1080:80 --name jerrynginx i042416/ui5-nginx:v2.0
各参数含义如下:-d: 以后台模式启动容器,返回其 ID.-p: 将容器内部 Nginx 开放的端口 80 映射到宿主机端口 1080,这样宿主机即 Windows 环境下通过浏览器输入 localhost:1080
访问该容器。
![](https://static001.geekbang.org/infoq/3e/3ec84e7a78e6755d919c03c3b2c1b0ff.png)
--name: 给启动的容器实例取一个名字。执行完命令行之后,浏览器输入如下 url,即可访问到运行在容器内的 Nginx 之上的 SAP UI5 应用:
![](https://static001.geekbang.org/infoq/c6/c66395b6e03d5120b26d3f3ef37ea0ce.png)
docker ps 命令,能看到这个处于运行状态的容器实例:
![](https://static001.geekbang.org/infoq/39/392d7bc35361720656fc8101860de919.png)
docker inspect jerrynginx
能查看明细:
![](https://static001.geekbang.org/infoq/e7/e7ada5f2e7b836cfc52dc4d84e622a96.png)
在 Windows Docker Desktop 的 Dashboard 菜单里能观察到这个名为 jerrynginx,处于后台运行状态下的容器实例:
![](https://static001.geekbang.org/infoq/6c/6cc4416da599e9e257a7c986e0394727.png)
![](https://static001.geekbang.org/infoq/b0/b075781c9c3689b92cdc9b48b9381d68.png)
该 Dashboard 提供了针对运行时容器实例的一些基础操作,比如查看日志:
![](https://static001.geekbang.org/infoq/bf/bf14e6da2ce968b17ad0c7fe2c1d3685.png)
以及登入容器实例内部,以交互式方式执行命令行等功能。这些功能均对应有 Docker 命令行工具的实现,可以根据喜好来选择使用。
![](https://static001.geekbang.org/infoq/f7/f7e1e0de1b3dd29e31925453d2462c5b.png)
练习 2:Windows 10 启动 Docker Desktop 时出现 WSL 2 installation is incomplete 的错误消息
我的 Windows10 操作系统,安装完 Docker Desktop,启动后出现下面的提示窗口:
WSL 2 installation is incomplete
![](https://static001.geekbang.org/infoq/5f/5f8d03852501d08a2cf2d15757d0ca89.png)
![](https://static001.geekbang.org/infoq/27/27e22b54bf39407b52ce4de01ef44c64.png)
把这个 WSL2 Linux kernel update package for x64 machines 升级包安装之后,Docker desktop 就能顺利启动了:
![](https://static001.geekbang.org/infoq/40/40bdd20970e7650988f2c251f087214c.png)
练习 3:把运行在 Docker 容器内的 Microsoft SQL 服务器部署到 Kyma 中
本教程的第六篇文章,我们已经介绍过如何在 Docker 里运行 Microsoft SQL 服务器:
本练习我们将把这个包含了 Microsoft SQL 服务器的 Docker 容器镜像,部署到 Kyma 平台上。
笔者之前的社区征文基于 Kyma 的企业级云原生应用的扩展案例分享 曾经介绍过 Kyma,一个开源的云原生应用开发平台和运行时,底层基于 Kubernetes,借助一系列包括 Istio, NATS, Serverless 和 Prometheus 在内的其他优秀开源项目和组件,能够开发、运行和操作云原生应用程序,支持对传统的 On-Premises(本地部署)应用程序和云原生应用基于事件驱动模式的松耦合扩展。
新建一个 secret.yaml
文件,维护数据库的用户名和密码等 credential 信息。
![](https://static001.geekbang.org/infoq/c0/c0161b00e44c13bcc8e0b16f415ae9d1.png)
定义了一个 PersistentVolume,用于存储数据库的数据。
![](https://static001.geekbang.org/infoq/7a/7a95aeec38b4fa640a64931a9b6308d7.png)
新建一个 deployment.yaml
文件,为 MSSQL 数据库定义一个 deployment 和一个 Service,用于通信。该文件使用到了前面创建的 pvc.yaml
和 secret.yaml
文件。
![](https://static001.geekbang.org/infoq/99/9977953d3bfe69289215d75443441d6f.png)
配置好 kubectl
和 SAP Kyma
的连接。使用命令行创建名为 dev 的 namespace:
kubectl create namespace dev
![](https://static001.geekbang.org/infoq/fd/fdb276345d9af60bdff91ebd0a5ccda7.png)
使用命令行部署 secret.yaml 和 pvc.yaml:
kubectl -n dev apply -f ./k8s/pvc.yaml
![](https://static001.geekbang.org/infoq/6c/6cb6ef0cb9ad532957cd51ac53bf586c.png)
注意,如果遇到下列错误消息:
error: you must be logged in to the server ( the server has asked for the client to provide credentials):
![](https://static001.geekbang.org/infoq/0c/0cc2d43dac61461b6619876138b34ea1.png)
解决办法就是从 Kyma 控制台重新下载一份 kubeconfig:
![](https://static001.geekbang.org/infoq/f9/f985202c3de66289807d9b74d7458c3b.png)
成功部署 PersistentVolumeClaim:
persistentvolumeclaim/mssql-data created
![](https://static001.geekbang.org/infoq/b2/b2439836ab83ac609d8933e83707c173.png)
成功部署 secret:
![](https://static001.geekbang.org/infoq/2f/2f3a922bf244aaa8b7109f79c6630cdf.png)
![](https://static001.geekbang.org/infoq/a5/a5a03213fe5ba6d5fef783effd9f6d59.png)
![](https://static001.geekbang.org/infoq/5d/5dab764ae9c9fb81cf774a438b76fc54.png)
最后使用如下命令,将本地 k8s 文件夹里的 yaml 文件代表的 deployment 资源,部署到 SAP Kyma 上:
![](https://static001.geekbang.org/infoq/75/756511ea5ab664c0d9dec420bbdb4e36.png)
部署成功后,使用命令行查看自动生成的 pod 的名称:我的 pod 名称:
mssql-74787d5b48-lr877
![](https://static001.geekbang.org/infoq/a8/a87cbe86d2c45f5e9aec1cfdc4995f0c.png)
使用如下命令行拿到该 pod 监听的端口号:
kubectl get pod mssql-74787d5b48-lr877 -n dev --template="{{(index (index .spec.containers 0).ports 0).containerPort}}"
得到端口号:1433 使用如下命令为 pod 设置端口转发,即 port forward 功能:
kubectl port-forward mssql-74787d5b48-lr877 -n dev 1433:1433 看到如下输出:
Forwarding from 127.0.0.1:1433 -> 1433Forwarding from [::1]:1433 -> 1433
![](https://static001.geekbang.org/infoq/c0/c00ced90a3c4594cb97dfb9be88c63b4.png)
接下来,我们就可以在本地,使用 localhost:1433 访问运行在 SAP Kyma 里的数据库了。
sqlcmd -S localhost:1433 -U SA -P Yukon900 使用如下命令找到 pod 里的 container 名称:mssql
kubectl describe pod mssql-74787d5b48-lr877 -n dev
![](https://static001.geekbang.org/infoq/92/92001639e23c9228601c78ab12980ded.png)
使用命令
kubectl exec -it mssql-74787d5b48-lr877 -n dev -c mssql -- bash 需要提前设置环境变量:
set KUBECONFIG=C:\app\kubeconfig.yml
![](https://static001.geekbang.org/infoq/40/40f1d0f72da46358d6b933f4fff07550.png)
![](https://static001.geekbang.org/infoq/c2/c28120b9dd4ae21ccc65cb32f68b2392.png)
![](https://static001.geekbang.org/infoq/c5/c5f65bf671d81996343920fa8edc3700.png)
最终可以进入 pod,登录 SQL 服务器的控制台,采用 SELECT * FROM ORDERS
命令行读取数据库里的订单数据:
![](https://static001.geekbang.org/infoq/1a/1aebbb9b0903cd8120968b871010fe76.png)
总结
本系列首先介绍了 Windows 操作系统下 Docker 软件的安装和使用前提,包括开启 Hyper V 技术后遇到的一些错误消息和解决方案,最后介绍了如何将 Docker 镜像部署到基于 Kubernetes 的 Kyma 平台并运行的详细步骤。
本教程的前七篇文章:
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/ecf656929816c5a8878591d4c】。文章转载请联系作者。
评论