步骤1:使用本地Web服务器
在不设置IIS的情况下运行IIS
如果您以前没有运行过Docker,这里有一个快速的方法来了解Docker在工作中的力量。首先,确保您正在使用Windows容器。然后在命令行中键入
docker container run --detach --publish 8080:80 --name web microsoft/iis:nanoserver
(之后耐心的等……)
最后显示:
Pull complete
Digest: sha256:6064d49ffd47f2c36c3bfbdd74ed87ec6932351de2dd81e90a6f5a7b27343c8f
Status: Downloaded newer image for microsoft/iis:nanoserver
b6fc651fcb52d107e3956764af3d2541b8279f68e0a62406d765f27957e144a7
打开浏览器,地址栏输入:http://localhost:8080/
显示如下,运行成功。
接下来,在C:\temp文件夹下,新建文本文档。
打开。
输入:
< html> < body> < h1>Hello myWorld! < /h1> < /body> < /html>
保存。
更名为index.html
停止容器:
docker container stop web
将该文件复制到容器中,它将覆盖容器中的默认IIS主页:
docker container cp C:\temp\index.html web:C:\inetpub\wwwroot\index.html
再次启动容器:
docker container start web
刷新http://localhost:8080看看你的新内容。显示下图运行成功。
您已经创建了一个Web服务器,使用了Microsoft发布和维护的Docker映像。Docker负责处理依赖关系。
当您完成任务时,最好停止并移除正在运行的容器
docker container stop web
docker container rm web
步骤2:定制并推送到Docker Hub
下一步,创建您自己的自定义映像。您需要有一个Docker ID
在同一个C:\temp目录中创建一个名为Dockerfile的文件。没有扩展名。
打开记事本,输入:
FROM microsoft/iis:nanoserver
COPY index.html /inetpub/wwwroot
这告诉Docker使用IIS基映像,并拷贝您刚才创建的HTML文件。与手动将文件复制到容器中不同,您将创建一个已经包含HTML的映像。
构建映像
在终端中键入:
docker image build --tag < YourDockerID>/firstimage .
这里要注意两点:
1、< YourDockerID>是你的Docker ID
2、语句后面的“.”,告诉Docker在此目录的上下文中构建。因此,当它将文件复制到/inetPUB/wwwroot时,它将使用这个目录中的文件。
运行映像
docker container run --detach --publish 8081:80 --name web2 < YourDockerID>/firstimage
去http://localhost:8081查看新的页面
最后把映像推到Docker Hub
docker image push < YourDockerID>/firstimage
文件有1.29G
系统总是提示:
docker : An image does not exist locally with the tag: naturalism/firstiamge
最后,停止并移除正在运行的容器:
docker container stop web2
docker container rm web2
步骤3:运行多服务应用程序
Docker很容易将多个服务连接在一起
Docker Compose 是用于定义和运行多容器Docker应用程序的工具。您可以使用YAML文件配置应用程序的服务。然后,使用一个命令创建并启动配置中的所有服务。Docker Compose安装自动与Docker Desktop一同安装。
多容器应用程序是一个有多个容器运行和相互通信的应用程序。此示例使用一个简单的.NET Core Web应用程序,运行在MySQL数据库中。您可以查看我们的应用程序在dockersamples GitHub repo.我们已经把两个映像推到了Docker Hub 在dockersamples repo下。DockerComposed直接处理服务发现,允许应用程序直接引用服务,Docker将流量路由到正确的容器。要试用它,新建文本文件,打开。复制下面内容:
……
并粘贴到这个文件,保存。然后把它更名为docker-compose.yml。
其中有很多细节,但基本上可以看到它指定要使用的映像、服务名称、应用程序配置、可用端口和不同服务所在的网络。
要运行它,请打开命令行,并导航到与docker-come.yml文件相同的目录。在命令行,键入
docker-compose up -d
当它从DockerHub中提取映像并启动它们时,您将看到一堆命令经过。完成运行后,导航到http://localhost 你应该看看音乐专辑查看器。.NET Core应用程序将数据保存在MySQL数据库中-不需要安装.NET Core或MySQL,所有组件都在Docker中运行。
若要停止和删除Docker创建的所有服务和资源,请输入:
docker-compose down
步骤4:编排:群集(Orchestration: Swarm)
在开始本节之前,请确保您正在使用Linux容器。Swarm确实支持Windows容器,但它们要大得多,需要更长的时间才能拉出来。
虽然在一台机器上单独运行应用程序很容易,但业务流程允许您协调多台计算机来管理应用程序,包括复制、加密、负载平衡、服务发现等功能。如果你读过任何关于Docker的文章,你可能听说过Kubernetes和Docker swarm模式。 Docker Desktop是使用Swarm 或 Kubernetes最简单开始方式。
群是一组机器正在运行Docker并加入到集群中。在这之后,您继续运行您习惯的Docker命令,但是现在这些命令是由群集管理器在集群上执行的。群中的机器可以是物理的,也可以是虚拟的。加入群后,它们被称为节点。
群集模式使用管理器和工作人员运行应用程序。管理人员运行群集集群,确保节点能够相互通信,将应用程序分配给不同的节点,并处理集群中的各种其他任务。
Swarm使用Docker命令行或Docker组合文件格式,并添加了一些内容。用几个简单的步骤试一试。
……
更名为docker-stack-simple.yml的文件。
然后,从与该文件相同的目录中的命令行中,键入以下命令。
docker swarm init
(必须切换到Linux容器。Windows容器不能正常运行。)
PS G:\temp> docker swarm init Swarm initialized: current node (c07o9awkcwwnej2le2ofqblm0) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-5gppq8okhu5b6pzhdlqhpnr7ecr6abmxvnwa9wwrbxfdw962fs-9cnlyljp4 78f3wvczw6yoiqtp 192.168.65.3:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
您应该看到一个可以复制和粘贴以向群集添加另一个节点的命令。为了我们的目的,现在不要在群中添加更多的节点。
docker stack deploy -c docker-stack-simple.yml vote
PS G:\temp> docker stack deploy -c docker-stack-simple.yml vote Creating network vote_frontend Creating network vote_backend Creating service vote_vote Creating service vote_result Creating service vote_worker Creating service vote_redis Creating service vote_db |
Docker会告诉您它正在创建网络和服务。都连接到一个叫做“投票”的堆栈上。您可以通过键入
docker stack ls
也许你列出一项,有5个服务。
PS G:\temp> docker stack ls NAME SERVICES ORCHESTRATOR vote 5 Swarm |
接下来,您可以通过键入
docker service ls
PS G:\temp> docker service ls |
ID | NAME | MODE | REPLICAS | IMAGE | PORTS | |
w2bqgtlh3wy3 | vote_db | replicated | 0/1 | postgres:9.4 | ||
nyktxmg5czb5 | vote_redis | replicated | 0/1 | redis:alpine | *:30000->6379/tcp | |
w1cofs8j7q4m | vote_result | replicated | 0/1 | dockersamples/examp levotingapp_result:before | *:5001->80/tcp | |
n5yrkahgt3s0 | vote_vote | replicated | 0/1 | dockersamples/examp levotingapp_vote:before | *:5000->80/tcp | |
flitscv0rg9f | vote_worker | replicated | 0/1 | dockersamples/examp levotingapp_worker:latest |
这将向您展示这5项服务,所有服务都有1份副本。都有一个名字您可以运行几次,直到所有副本都表示1/1。
那么发生了什么?使用简单的撰写文件格式,您创建了一个包含5个组件的应用程序:
1、Flask的投票页面,将结果推送给redis。
2、存储键值对的redis实例。
3、工作人员进入redis实例,取出数据并将其推入数据库。
4、postgres数据库。
5、一个运行在Node.js中的结果页面,它从数据库中抽取数据。
现在,登录localhost:5000 去投票。你可以投票给猫或狗,无论你喜欢哪种。在localhost:5001你可以看到投票结果。打开不同的浏览器,添加额外的选票,如果你愿意的话。
所有这些组件的代码都在我们的示例投票应用程序在GitHub上。这里有很多事情要做,但这里有一些要点要强调:
1、这些服务都通过名称相互引用。因此,当结果应用程序调用数据库时,它连接到“postgres@db”,集群负责将服务目录指向“db”。
2、在多节点环境中,Swarm将按照您的需要展开副本。
3、Swarm也会做基本的负载平衡。以下是你如何看待这一点:
登录localhost:5000再来一次。注意页面底部的“由容器ID处理”。现在添加一个副本:
docker service scale vote_vote=3
完成验证后,重新加载页面几次,然后看到容器ID在三个不同的值之间转换。这是三个不同的容器。即使它们位于不同的节点上,它们也会共享相同的入口和端口。
若要在进入下一节之前进行清理,请键入
docker stack rm vote
PS G:\temp> docker stack rm vote
Removing service vote_db
Removing service vote_redis
Removing service vote_result
Removing service vote_vote
Removing service vote_worker
Removing network vote_backend
Removing network vote_frontend
PS G:\temp> docker swarm leave --force
Node left the swarm.
步骤5:编排:Kubernetes
在开始本节之前,请确保您正在使用Linux容器。Kubernetes还不支持Windows容器。
……
Kubernetes一直是启动状态!无语
结论:在Windows运行docker当前还是有点难! |