最新docker命令行、管理、技巧、最佳实践合集
-
- 1.1. 确保CTRL-D或CTRL-C不会关闭容器
- 1.2. docker多阶段构建
- 1.3. 停留在某个构建阶段
- 1.4. 禁止docker自启动
- 1.5. 配置docker的镜像,加速docker的镜像拉取
- 1.6. 使用COPY和ADD区别
- 1.7. entrypoint.sh和CMD使用最佳实践
- 1.8. 最好一个镜像一个进程
- 1.9. 使用.dockerignore
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 也可以通过
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. 减少镜像的大小
- 使用slim,alpine等减少镜像大小
- 尽量使用多阶段编译,减少镜像层数
- 删除不必要的系统运行工具
3. docker监测
- 增加健康监测指令
HEALTHCHECK CMD curl --fail http://localhost:4243 || exit 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