Docker玩法 — 项目发布之旅
通过前文可以对docker有个了解,并运行一些自己喜欢的东西了,那这么有趣的玩具,我们必须加一点自己料近去。
但是在玩之前,需要知道一个东西,那就是dockerfile文件,这个文件是用来生成docker镜像用的,通过修改其中的命令
我们就可以把我们自己的料加镜像之中。接下来我们将围绕这个文件开始我们的旅程,那么扬帆启航了。
准备
在旅行之前我们肯定需要准备行囊,那么我这次将准备了一个Go服务 和 一个.net core 服务,两个都是非常简单的webapi服务
第一站,dockerfile
在dockerfile中,所有的命令都需要大写,常用命令如下
1. FROM 宿主环境,也就是代码运行的环境,Go项目就是Gloang,C#项目就是aspnet
2. MAINTAINER 个人信息,比如名字或邮箱
3. WORKDIR 是镜像内的工作目录
4. ADD 追加本地内容到指定镜像目录 第一个参数是本地路径,第二个是镜像目录
5. COPY 同上但不会自动解压缩包,不能访问网络
6. RUN 构建镜像时执行命令
7. EXPOSE 暴露容器端口 可以是一个 也可以是多个
8. CMD 构建镜像完毕后执行命令
接下来给出 go 服务的dockerfile 文件格式
FROM golang:latest
MAINTAINER xiao4_800k <840076909@qq.com>
WORKDIR /go/src/dockertest
ADD dockertest/ /go/src/dockertest
RUN go build -o .
EXPOSE 80
CMD ["./dockertest"]
那么我们对照着说一下用到的这些命令
FROM 指定了宿主环境为golang
MAINTAINER 写入了作者的个人信息
WORKDIR 指定工作目录,这里由于go的特性写的这个路径,根据需求有所差异
ADD 我将本地dockertest目录内容追加到src中
RUN go语言执行编译
EXPOSE 服务暴漏端口 80
CMD 执行服务
第二站,编译镜像
找到dockerfile所在文件夹 执行命令 docker build -t gotest .
docker build 是编译镜像指令
-t 指定名字和标签 格式 -t name:tag 我这里只指定了名称
. 代表当前路径
执行命令后我们再查看镜像列表 使用命令或面板都可以
我们的服务已经成功载入镜像中
第三站,启动服务
使用 docker run -p 44444:80 e0fdd56d5475 启动镜像
docker run 是固定的启动命令
-p 用于指定本地端口和镜像的暴漏端口
最后加上镜像ID,在浏览器中访问一下
我们再修改一下 启动命令
docker run --name gotest -d -p 44444:80 e0fdd56d5475
这里增加了 两个参数
--name 用于指定容器的名称
-d 用于指定容器在后台运行
容器已经启动了
我们在浏览器中看一下效果
第四站,容器和镜像的管理
如果你使用的是window版本,那么他有一个管理面板,可以轻松的对容器和镜像进行管理,然后如果是在Linux中可能就需要使用命令来操作了,这个看个人喜好
命令参考上一篇
终点站 补充总结
至此我们已经把自己的服务成功搞进docker,但是你有没有发现一个问题,生成的镜像巨大,这无疑是非常不利的,所以后续我们就来玩玩镜像的优化
最后附上 .net core Dockerfile文件内容,是vs2019自动生成的,参考一下吧
#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/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["CoreAPI/CoreAPI.csproj", "CoreAPI/"]
RUN dotnet restore "CoreAPI/CoreAPI.csproj"
COPY . .
WORKDIR "/src/CoreAPI"
RUN dotnet build "CoreAPI.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "CoreAPI.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "CoreAPI.dll"]