第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

一. 自定义Centos镜像

1. 要求

 基于Centos7.0官方镜像制作一个自己的名为ypfcentos的镜像,版本为1.0,要求如下:

 (1). 默认的登录路径 /ypfusr

 (2). 可以使用vim

2. 步骤

(1). 下载一个centos7.0的官方镜像

 【docker pull centos:7.0】  宿主机已经存在该镜像

(1). 在工作目录下通过指令新建一个文件夹‘ypfcentos’,用于存放自己改造的centos镜像的Dockerfile文件

【mkdir ypfcentos】

(2). 进入ypfcentos文件夹,新建一个ypfcentos_Dockerfile文件,复制下面内容。

【cd ypfcentos】

【vi ypfcentos_Dockerfile】

相关dockerfile代码如下

#1.定义依赖镜像(宿主机中没有话则去下载)
FROM centos:7

#2.定义作者信息(可以不写)
MAINTAINER ypf <ypf@qq.com>

#3. 执行安装vim的命令(-y表示安装过程中不提示)
RUN yum install -y vim 

#4. 定义默认的工作目录
WORKDIR /ypfusr

#5 定义容器启动执行的命令
CMD /bin/bash

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(3). 运行下面指令,进行镜像构建

【docker build -f ./ypfcentos_Dockerfile -t ypfcentos:1.0 .    】   其中 ./ 代表当前目录   等价于  【docker build -f ypfcentos_Dockerfile -t ypfcentos:1.0 .    】

或:【docker build  -t ypfcentos:1.2 .   】 使用默认的Dockerfile命名,且在当前目录,则不需要通过-f指定路径了。(已测试)

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(4). 将镜像发布成容器,并进入容器内部(交互式容器)

 【docker run -it --name=ypfcentoscontainer1 ypfcentos:1.0 】

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(5). 测试

【pwd】查看当前目录

【vim ypf.txt】测试vim指令是否可以使用

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

二. 制作WebApi镜像并发布容器

1. 要求

 制作一个Asp.Net Core WebApi镜像,名为ypfwebapi1,并发布成容器,名为ypfwebapicontainer1,要求如下:

(1). 容器内的工作目录为userapi

(2). 容器仅对外暴露端口9000

(3). 用户可以通过 http://xxxxx:8000/weatherforecast 访问接口,获取数据

2. 步骤

(1). 新建一个Asp.Net Core WebApi项目,版本3.1 ,右键对其添加docker支持,会自动生成一个Dockerfile文件,如下:

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["webapi1/webapi1.csproj", "webapi1/"]
RUN dotnet restore "webapi1/webapi1.csproj"
COPY . .
WORKDIR "/src/webapi1"
RUN dotnet build "webapi1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "webapi1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "webapi1.dll"]
View Code

分析Dockerfile文件,我们得知,该项目需要依赖的两个基础镜像为,其它内容,我们自行来编辑

 mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim

 mcr.microsoft.com/dotnet/core/sdk:3.1-buster  

(2). 根据要求,自定义的Dockerfile文件内容如下:

#1.依赖两个基础镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim 
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster 

#2.制作人
MAINTAINER ypf <ypf@qq.com>

#3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) 
ENV ASPNETCORE_URLS=http://*:9000

#4.容器对外暴露的端口
EXPOSE 9000

#5.指定默认工作目录
WORKDIR /userapi

#6. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的userapi工作目录下
COPY . /userapi/

#7.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
ENTRYPOINT ["dotnet", "webapi1.dll"]

说明:

  A. 可以自定义Dockerfile文件名,比如:ypfdockerfile,但需要在构建容器的时候通过 -f 指定一下路径即可 。指令如下 【docker build -f dockerfile文件路径 -t 镜像名称:版本号 .

  B. 容器暴露的端口如上9000 一定要和程序运行的端口一致,上述Dockerfile文件是通过 ENV设置环境变量来设置程序运行端口的。 另外还有两种方式:程序中通过UseUrl来指定 或 构建容器的时候动态设置环境变量。(详见下面3补充)

(3). 将项目进行发布,目标运行时选择:可移植,并把Dockerfile文件复制到发布包根目录下

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

 第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(4). 登录linux服务器,运行下面指令,下载必备的程序镜像

 docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
 docker pull mcr.microsoft.com/dotnet/core/sdk:3.1-buster

PS: 这里也可以不下载,等构建镜像的时候如果检测到Linux宿主机上没有该镜像,也会自动下载,这里建议提前下载。

(5). 在Linux的工作目录下新建myprogram文件夹,用于存放需要程序的发布包,进入该目录,然后新建ypfwebapi1文件夹,用于存放该项目的发布包。

【mkdir myprogram】

【cd myprogram】

【mkdir ypfwebapi1】

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(6). 通过WinSCP软件,将项目发布包复制到ypfwebapi1文件夹下

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(7). 进入ypfwebapi1文件夹下,通过指令生成镜像

【docker build -t ypfwebapi1 . 】

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(8). 通过下面指令,将镜像发布成容器

【docker run -id --name=ypfwebapicontainer1 -p 8000:9000 ypfwebapi1】

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(9). 测试:

A. 通过指令【docker exec -it 8ff5c6e7a5d8 bash】进入,容器查看工作目录为userapi

 第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

B. 用PostMan进行get请求    http://119.45.174.249:8000/weatherforecast,获取返回值,测试通过。

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(10). 总结:

 在该容器内,查看工作目录下的内容 【ls】,发现就是发布包中的内容哦,这时通过Dockerfile中的 【copy . /userapi/】实现的。

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

 说白了:

  这里webapi部署成容器就是把依赖的环境和发布包的内容整合到一起,最后通过Dockerfile中的  ENTRYPOINT ["dotnet", "webapi1.dll"] 运行该项目。

 

3. 补充其它用法

(1). 关于程序端口的另外两种写法

A. Dockerfile文件中不指定程序运行端口,通过构建容器指令来指定程序运行端口。

dockerfile文件如下:

#1.依赖两个基础镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim 
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster 

#2.制作人
MAINTAINER ypf <ypf@qq.com>

#3.容器对外暴露的端口
EXPOSE 9000

#4.指定默认工作目录
WORKDIR /userapi

#5. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的userapi工作目录下
COPY . /userapi/

#6.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
ENTRYPOINT ["dotnet", "webapi1.dll"]
View Code

相关指令如下:

#构建镜像
docker build -t ypfwebapi3 . 
#发布容器
docker run --env ASPNETCORE_URLS=http://*:9000  -id --name=ypfwebapicontainer3 -p 8002:9000 ypfwebapi3

测试连接:http://119.45.174.249:8002/weatherforecast

B. Dockerfile文件中不指定程序运行端口,在代码里指定端口

程序代码:

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

dockerfile文件同上一样:

#1.依赖两个基础镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim 
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster 

#2.制作人
MAINTAINER ypf <ypf@qq.com>

#3.容器对外暴露的端口
EXPOSE 9000

#4.指定默认工作目录
WORKDIR /userapi

#5. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的userapi工作目录下
COPY . /userapi/

#6.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
ENTRYPOINT ["dotnet", "webapi1.dll"]
View Code 

相关指令:

#构建镜像
docker build -t ypfwebapi4 . 
#发布容器
docker run -id --name=ypfwebapicontainer4 -p 8004:9000 ypfwebapi4

(2). 尝试一下,一个项目能不能同时挂多个端口。

答案:不行,当设置多个程序运行端口(非容器端口!!)的时候,仅最后一个有效。

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(3). COPY 和 ADD 二者基本等效,只能复制Dockerfile所在目录下的文件;复制的镜像内的路径如果不存在,会自动创建。

 第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

 Linux中相关操作截图:

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

(4). CMD 和 ENTRYPOINT 效果一致,下面四行指令等效

# 启动容器时候的指令等价于下面的4种写法:
# ENTRYPOINT ["dotnet", "webapi1.dll"]
# ENTRYPOINT dotnet webapi1.dll
# CMD ["dotnet", "webapi1.dll"]
# CMD dotnet webapi1.dll

(5). -P 随机端口映射的问题

A. 使用上述的ypfwebapi1镜像,是-P随机指定端口

【docker run -id --name=test1 -P ypfwebapi1】

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

B. 使用一个新的Dockerfile文件,对外暴露3个端口,通过-P随机指定所有暴露端口。 

 第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

docker build -t ypfwebapi5 . 
docker run -id --name=ypfwebapicontainer5 -P ypfwebapi5

第五节:自定义Centos镜像和Asp.Net Core WebApi镜像并发布

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

相关推荐