周末闲来无事儿,就在docker上玩玩NET5.0的简单部署。其实还有很多没有涉及到,比如守护、多环境发布。现在主要是接触Java比较多些,以后再逐步的完善NET这块。
技术栈
- VS2019 16.8+
- NET5.0
- NetCore API 项目
- Docker latest
新建项目
选择 Docker support:可以自动生成基于所选版本 NET5.0 生成当前项目的 Dockerfile 文件
本地 VS 中 docker 调试模式
编写一个 controller
namespace MyDockerAppWeb.Controllers
{
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
[HttpGet]
public string Index()
{
return "success";
}
[HttpGet]
[Route("getList")]
public List<string> GetList()
{
return new List<string>() { "a", "b", "c" };
}
}
}
Dockerfile 说明
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
# WORKDIR
WORKDIR /app
# 对外暴露80、443端口
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
# COPY [--chown=:] ["",... ""]
COPY ["MyDockerAppWeb.csproj", ""]
# 还原依赖
RUN dotnet restore "./MyDockerAppWeb.csproj"
COPY . .
WORKDIR "/src/."
# Release方式构建项目,并输出到 /app/build文件夹下
RUN dotnet build "MyDockerAppWeb.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyDockerAppWeb.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# ENTRYPOINT ["","","",...]
ENTRYPOINT ["dotnet", "MyDockerAppWeb.dll"]
# 设置时区
#ENV TZ=Asia/Shanghai
#RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
生成自定义镜像
- 在项目根目录(有 Dockerfile 文件的路径下),运行以下命令
docker build -t {镜像名} .
特别注意:最后一个点,表示当前目录,不能缺少 比如:docker build -t hager/mynet5api:v20201115 .
- 运行镜像
docker run --name {为容器指定一个名称} -d -p {暴露访问端口}:{镜像项目中端口} {镜像名}:{版本号}
比如:docker run -d -p 8080:80 --name mynet5 hager/mynet5api:v20201115
PS E:\netcore-workspace\source\repos\MyDockerAppWeb> ls
目录: E:\netcore-workspace\source\repos\MyDockerAppWeb
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020/11/15 11:06 .config
d----- 2020/11/15 11:36 bin
d----- 2020/11/15 11:55 Controllers
d----- 2020/11/15 11:40 obj
d----- 2020/11/15 11:06 Properties
-a---- 2020/11/15 9:49 340 .dockerignore
-a---- 2020/11/15 9:49 162 appsettings.Development.json
-a---- 2020/11/15 9:49 192 appsettings.json
-a---- 2020/11/15 18:24 1129 Dockerfile
-a---- 2020/11/15 11:11 912 MyDockerAppWeb.csproj
-a---- 2020/11/15 11:47 739 MyDockerAppWeb.csproj.user
-a---- 2020/11/15 11:57 1364 MyDockerAppWeb.sln
-a---- 2020/11/15 9:49 724 Program.cs
-a---- 2020/11/15 18:21 4243 readme.md
-a---- 2020/11/15 9:49 1818 Startup.cs
-a---- 2020/11/15 9:49 310 WeatherForecast.cs
PS E:\netcore-workspace\source\repos\MyDockerAppWeb> docker build -t hager/mynet5api:v20201115
[+] Building 7.1s (18/18) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> [internal] load .dockerignore 0.1s
=> [internal] load metadata for mcr.microsoft.com/dotnet/sdk:5.0-buster-slim 0.4s
=> [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim 0.0s
=> [base 1/2] FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim 0.0s
=> [build 1/7] FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim@sha256:34736bfaece7ca4314b1b91977db555167da98e8 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 9.97kB 0.0s
=> CACHED [build 2/7] WORKDIR /src 0.0s
=> CACHED [build 3/7] COPY [MyDockerAppWeb.csproj, ] 0.0s
=> CACHED [build 4/7] RUN dotnet restore "./MyDockerAppWeb.csproj" 0.0s
=> [build 5/7] COPY . . 0.1s
=> [build 6/7] WORKDIR /src/. 0.1s
=> [build 7/7] RUN dotnet build "MyDockerAppWeb.csproj" -c Release -o /app/build 3.4s
=> [publish 1/1] RUN dotnet publish "MyDockerAppWeb.csproj" -c Release -o /app/publish 2.4s
=> CACHED [base 2/2] WORKDIR /app 0.0s
=> CACHED [final 1/2] WORKDIR /app 0.0s
=> [final 2/2] COPY --from=publish /app/publish . 0.2s
=> exporting to image 0.2s
=> => exporting layers 0.1s
=> => writing image sha256:a3cb4b6bbeb2149f743509df4583476ac9a7f4c9899dad0b8ff9fd4100413d03 0.0s
=> => naming to docker.io/hager/mynet5api:v20201115 0.0s
PS E:\netcore-workspace\source\repos\MyDockerAppWeb> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hager/mynet5api v20201115 a3cb4b6bbeb2 Less than a second ago 210MB
hager/mynet5api latest 8ab6c8205655 7 hours ago 210MB
mydockerappweb dev 816e4dc9779c 9 hours ago 205MB
mcr.microsoft.com/dotnet/aspnet 5.0-buster-slim c535cc5fb113 4 days ago 205MB
PS E:\netcore-workspace\source\repos\MyDockerAppWeb> docker run -d -p 8080:80 hager/mynet5api:v20201115 .
a25ae3e3cde076cf254cd4492d28ef15516a5b2cc7bc8382ea3213f664e47355
PS E:\netcore-workspace\source\repos\MyDockerAppWeb>
运行项目验证
通过访问http://localhost:8080/Home/getList
,就可以正常访问 docker 中部署的项目了。
其他资料
查看生成镜像
docker images
就会看到刚才生成的镜像信息了。
运行镜像
语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS 说明:
- -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器 ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -P: 随机端口映射,容器内部端口随机映射到主机的端口
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- --name="nginx-lb": 为容器指定一个名称;
- --dns 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致;
- --dns-search example.com: 指定容器 DNS 搜索域名,默认和宿主一致;
- -h "mars": 指定容器的 hostname;
- -e username="ritchie": 设置环境变量;
- --env-file=[]: 从指定文件读入环境变量;
- --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定 CPU 运行;
- -m :设置容器使用内存最大值;
- --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- --link=[]: 添加链接到另一个容器;
- --expose=[]: 开放一个端口或一组端口;
- --volume , -v: 绑定一个卷
实例
使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为 mynginx。
docker run --name mynginx -d nginx:latest
使用镜像 nginx:latest 以后台模式启动一个容器,并将容器的 80 端口映射到主机随机端口。
docker run -P -d nginx:latest
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用镜像 nginx:latest 以交互模式启动一个容器,在容器内执行/bin/bash 命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/#
资料
- https://www.runoob.com/docker/docker-run-command.html