系列目录html
使用docker建立只读文件系统
容器化部署对应用的运维带来了极大的方便,同时也带来一些新的安全问题须要考虑.好比黑客入侵到容器内,对容器内的系统级别或者应用级别文件进行修改linux解压rar,会形成难以估量的损失.(好比修改hosts文件致使dns解析异常,修改web资源致使网站被嵌入广告redhat linux 9.0下载,后端逻辑被更改致使权限验证失效等centos 只读文件系统,因为是分布式部署,哪些容器内的资源被修改也很难以发现).解决这个问题的办法就是建立建立一个具备只读文件系统的容器.下面介绍使用docker run命令和docker compose来建立具备只读文件系统的容器.linux
使用docker run命令建立只读文件系统
好比说要建立一个只读文件系统的redis容器,能够执行如下命令web
docker run --read-only redis
docker compose/swarm建立只读文件系统
yaml编排文件示例以下redis
version: '3.3' services: redis: image: redis:4.0.1-alpine networks: - myoverlay read_only: true networks: myoverlay:
问题:建立只读文件系统看起来很不错,可是实际上每每会有各类各样的问题,好比不少应用要写temp文件或者写日志文件centos 只读文件系统,若是对这样的应用建立只读容器则极可能致使应用没法正常启动.对于须要往固定位置写入日志或者临时文件的应用,能够挂载宿主机的存储卷,虽然容器是只读的,可是挂载的盘仍然是可读写的.docker
建立只读的 core容器
上面一节咱们讲到了建立容器只读文件系统以增长安全性,以及如何解决须要写入日志文件或者临时文件这样常见的问题.咱们尝试建立一个只读的应用时,即使不使用任何log组件(即不写入日志),仍然没法正常启动镜像.解决这个问题其实也很是简单,只须要把环境变量COMPlus_EnableDiagnostics的值设置为0便可.windows
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base WORKDIR /app EXPOSE 52193 FROM microsoft/dotnet:2.2-sdk AS build WORKDIR /src COPY . . WORKDIR "/src" RUN dotnet build "ReadOnlyTest.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "ReadOnlyTest.csproj" -c Release -o /app FROM base AS final WORKDIR /app ENV DOTNET_RUNNING_IN_CONTAINER=true ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 ENV COMPlus_EnableDiagnostics=0 COPY --from=publish /app . ENTRYPOINT ["dotnet", "ReadOnlyTest.dll"]
咱们对这些环境变量进行简单介绍后端
微软官方基础镜像里还包含一项名称叫做ASPNETCORE_VERSION的环境变量,咱们能够直接读取它,这样使用公共的环境变量一来避免息手动设置和更新的麻烦,二来便于和社区交流(本身定义约束的只能用于内部团队交流)
咱们如何使用这些环境变量呢,其它能够在程序里面暴露一个helper方法,好比
private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true";} }
这样咱们就能够根据实际的需求来使用它.
上面咱们介绍了如何使用docker run命令以及docker-compose建立只读文件系统.然而在kubernetes集群里,咱们须要使用k8s的编排方法来建立只读文件系统.那么在k8s里如何建立只读文件系统.其实这里涉及到了另外一个高级主题:那就是k8s的安全策略(Pod Security Policies)咱们将在下一节介绍它.