docker使用最佳实践

2022-01-01
2分钟阅读时长

最新docker命令行、管理、技巧、最佳实践合集

1. docker命令行用法

1.1. 确保CTRL-D或CTRL-C不会关闭容器

#如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器
docker attach --sig-proxy=false dockerName

1.2. docker多阶段构建

当我们编译目标镜像需要安装编译环境时候,每条指令会增加一层,要让镜像最小化、让编译结果保留时候,可以使用多阶段构建 针对某个阶段构建用来做调试,测试

#给多阶段构建命名
## FROM xxx as builder 
FROM golang
WORKDIR /go/src/github.com/abc/
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest  ·
RUN apk --no-cache add ca-certificates
WORKDIR /root/
#from 0也可以通过 --from=builder
COPY --from=0 /go/src/github.com/abc/app .
CMD ["./app"] ·

1.3. 停留在某个构建阶段

针对某个阶段构建用来做调试,测试

docker build --target builder -t abc/img.latest .

1.4. 禁止docker自启动

例如使用docker-compose 将docker设置restart = always,想要禁止自启动

docker update --restart=no my-container

1.5. 配置docker的镜像,加速docker的镜像拉取

默认使用的是dockerhub的官方镜像,镜像更新走国际网络,速度慢 可以申请dockerdao、bat、microsoft azure,青云,amazon云的docker云加速服务 配置docker linux下配置 /etc/docker/daemon.json mac下配置$HOME/.docker/config.json 也可以通过图 4

docker for mac/windows 的ui的preferences进行配置

{
    "registry-mirrors": ["https://m20uyoaxxxx.mirror.aliyuncs.com"],
    "log-driver": "json-file",
    "log-opts":{"max-size":"500m", "max-file":"3"}
}

1.6. 使用COPY和ADD区别

ADD 除了COPY存粹的拷贝本地文件含义,还有拷贝外部文件如http://,进行拷贝后文件的解压等

COPY 单纯的拷贝文件

1.7. entrypoint.sh和CMD使用最佳实践

使用CMD: 最好使用数组,使用字符串的话,docker会使用bash来启动命令行,导致无法正确处理外部信号,因为shell不会把信号传递给子进程

ENTRYPOINT: 无法通过dockerfile覆盖,只能增加参数,但可以通过docker run –entrypoint 重新指定,而CMD可以在dockerfile中覆盖父dockerfile的CMD指令

#使用数组、
CMD ["pm2", "start", "app"]
ENTRYPOINT ["pm2", "start", "app"]

1.8. 最好一个镜像一个进程

单进程容易扩展、打日志、打补丁和调试

1.9. 使用.dockerignore

当要忽略添加文件到镜像中时候

docker build -t abc .

2. 减少镜像的大小

  1. 使用slim,alpine等减少镜像大小
  2. 尽量使用多阶段编译,减少镜像层数
  3. 删除不必要的系统运行工具

3. docker监测

  1. 增加健康监测指令
HEALTHCHECK CMD curl --fail http://localhost:4243 || exit 1

  1. docker-compose增加监测
 healthcheck:
      test: curl --fail http://localhost:4243 || exit 1
      timeout: 15s
      interval: 15s
      start_period: 15s
      retries: 5

4. 安全

4.1. 不要使用root权限

使用普通用户 利用gosu提升账户权限 普通账号权限不够用,建议使用gosu来提升权限,而不是sudo,因为gosu提权的进程会 gosu创建的进程会替换gosu,只有一个进程可以做到PID等于1 sudo会先创建sudo进程,然后该进程作为父进程去创建子进程,sudo成了1号PID

#使用普通用户
user commonUser

4.2. 不要把密码保存到dockerfile中

或者密码文件存放到镜像中,可以通过环境变量指定,或者编译参数–build-arg指定

docker run --detach --env "DB_PWD=password" php
ENV DB_PWD abcd

4.3. 使用hadolint来检查扫描自己的Dockerfile,减少错误、漏洞等保证安全

还可以用Snyk,Clair,Trivy

5. 进行cpu、mem、磁盘等的资源限制