现在docker是否有windows的images
发布网友
发布时间:2022-04-25 21:50
我来回答
共1个回答
热心网友
时间:2022-05-26 17:53
第一步:创建运行环境
现在Docker还只能在Linux上运行,所以你必须找一台Linux机器或者装了Linux虚拟机的机器来运行Docker;你在这里可以找到Docker的安装步骤或者通过参考这篇文章Getting Started with Docker On Azure(在Azure云端安装Docker的起步教程)。当然你可以从Azure云获取一个安装好Docker的Linux虚拟运行环境。
这个教程假设你已经在Azure上有了安装好Docker的Linux虚拟机。如果你拥有其它类似的运行环境,那这个教程也是可以使用的。
第二步:为你的ASP.NET 5应用创建一个Docker镜像
为了能让ASP.NET应用程序在云端部署,你需要一个Docker镜像来承载你的应用。
Docker镜像的文件系统是层叠式的(AUFS文件系统),可以这样形象的理解:你的应用程序只是“基础镜像”上层新加的一个层而已(译者注:就像盖房子一样,新增的楼层是基于它下面的楼层建立起来的),而在我们的例子中“基础镜像”为microsoft/aspnet(译者注:这是一个Docker镜像的名称,这个镜像存在于Docker Hub中)。在Docker中镜像的层级是增量叠加起来的(译者注:这点跟Git原理一样),Docker保存了每个层之间的差异,所以当我们用Docker部署应用时,提交的更新不会包含Linux发行版内核或者ASP.NET的运行时,因为这些都已经存在于“基础镜像”中了,你只会提交基于此“基础镜像”构建的应用程序本身,所以Docker的这种差异化提交、部署机制能够确保应用程序以最快速、最小化的增量方式进行部署,为运维带来极大的便利。
如何创建Docker镜像呢?答案是使用:Dockerfile。跟Makefile相似,Dockerfile包含了供Docker用来构建一个镜像的所有步骤。
本教程所用到的ASP.NET源代码可以从GitHub的aspnet/Home仓库下的HelloWeb目录提取。首先,使用如下命令将源代码从GitHub上克隆下来:
git clone git@github.com:aspnet/Home.git aspnet-Home
切换到aspnet-Home的sample目录下:
cd aspnet-Home/samples/HelloWeb
完成后目录结构应该如下所示:
├── Startup.cs
├── image.jpg
└── project.json
然后我们在此目录下创建一个名叫Dockerfile的文件,并输入如下指令:
FROM microsoft/aspnet
COPY . /app
WORKDIR /app
RUN ["kpm", "restore"]
EXPOSE 5004
ENTRYPOINT ["k", "kestrel"]
让我们逐条解释此Dockerfile中命令的含义:
第一行中FROM命令后面的‘microsoft/aspnet’说明我们要下载Docker Hub中名为‘microsoft/aspnet’(此镜像也是ASP.NET在Docker Hub上的官方镜像)的镜像作为我们例子程序的“基础镜像”;
COPY命令告诉Docker在构建镜像的时候同时将当前目录(译者注:.表示当前目录)下的所有文件(译者注:Startup.cs、image.jpg与project.json这三个文件)拷贝到容器的/app目录下;紧接着,使用WORKDIR命令告诉Docker将容器启动目录设置为/app目录;
RUN [kpm, restore]命令告诉Docker运行kpm restore命令安装ASP.NET相关依赖项,这些都是Docker在第一次运行此容器之前要做的准备工作;
EXPOSE 5004命令会告诉Docker正在构建的镜像有个监听5004号端口的服务(可以查看project.json文件确认)(译者注:意思是以此镜像为基础运行的容器需要向外暴露5004号端口);
最后,ENTRYPOINT [k, kestrel]命令说明每次用Docker启动此容器时都会自动执行k kestrel命令,同时通过运行此命令保证容器始终在运行不退出,其实kestrel命令就是启动了ASP.NET 5的服务器,启动此服务器后会启动一个监听5004号端口的进程,处理HTTP连接请求。(译者注:这就是为什么要向外暴露5004号端口的原因。)
第三步:创建镜像
当我们编写完Dockerfile后,当前目录应该是如下结构,Dockerfile和程序源代码在一起:
├── Dockerfile
├── Startup.cs
├── image.jpg
└── project.json
现在我们来创建此Docker镜像。这个过程非常简单——运行Docker的build命令即可,命令如下:
docker build -t myapp .
这条命令运行结束后Docker就生成了一个名为myapp的镜像;同时,你对镜像所做的任何变化都能通过重新运行此命令来生成一个新的镜像。在你的Linux虚拟机或者开发环境中运行docker images命令可以看到我们刚刚创建的myapp镜像了:
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
myapp latest ccb7994d2bc1 39 seconds ago 499.8 MB
microsoft/aspnet latest 16b1838c0b34 12 days ago 473.4 MB
你可以看到你的应用镜像以及ASP.NET镜像都存在于你的主机上。
现在我们开始讲如何将ASP.NET应用程序部署到云端。
第四步:运行容器
运行一个容器非常的简单,通过运行以下命令可以在你的开发机上启动myapp容器:
docker run -t -d -p 80:5004 myapp
-t表示附加一个伪终端(tty)到容器(在以后的ASP.NET 5版本中可能不在需要);
-d表示以后台的方式运行容器,如果不使用此标识的话,ASP.NET运行时后台的输入/输出流信息就会显示在你的终端上;
-p 80:5004告诉Docker将容器的5004号端口映射到宿主机的80号端口上。这样,宿主机80号端口接收的数据包就会被转发到容器的5004号端口上了;
最后,myapp是镜像的名称,我们可以用这个名称来启动之前Dockerfile构建的镜像。
容器启动之后(译者注:容器和镜像的区别就相当于OO中的对象和实例,对象是编译时的概念,实例是运行时的概念。以这样理解,容器是运行时的镜像。),可以通过以下命令查看容器运行的状态:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f70bd9ffbc36 myapp:latest "/bin/sh -c 'k kestr About a minute ago Up About a minute 0.0.0.0:80->5004/tcp mad_goodall
好的,容器启动了!但是我们的演示还没结束,我们还要完成Azure VM的终端端口映射(endpoint port mapping for Azure VM)