简介
上一篇文章我针对docker和k8s做了一个基础的介绍,其中在docker部分给出了一些常用的命令,如docker run, docker stop等等。但实际上docker里还有一些相对冷门但非常实用的使用技巧,下面我就来总结一下。
操作
1. 使用多阶段构建优化镜像大小
通过多阶段构建可以大大减少最终镜像的大小,仅保留运行所需的部分。例如我们可以使用dockerfile这样构建容器:
# 第一阶段:构建
FROM golang:1.20 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二阶段:运行
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
ENTRYPOINT ["./myapp"]
2. 为容器配置内存和 CPU 限制
在资源有限的环境中,为容器设置资源限制可以提高系统稳定性:
docker run -it --memory=512m --cpus=1 nginx
上述命令限制了容器的内存为 512MB,CPU 使用最多 1 核。
3. 使用 --mount 替代 -v 绑定卷
--mount
提供了更清晰的语法和更多的功能(如只读模式):
docker run --mount type=bind,source=$(pwd)/data,target=/app/data,readonly alpine
与 -v $(pwd)/data:/app/data
类似,但更灵活且更容易阅读。
4. 利用 docker logs 定位问题
在开发调试时,通过 docker logs
实时查看容器日志,尤其是加上 -f 参数:
docker logs -f <container_id>
结合 --since
和 --tail
参数,可以高效排查问题:
docker logs --since 10m --tail 50 <container_id>
上述命令意思为查看指定容器 <container_id> 的最近 10 分钟内的日志,并只显示最后 50 行,帮助用户快速定位和调试问题。
5. 清理无用的资源
我们在使用docker容器的时候,部分容器可能会因为长期运行或被弃用产生不必要的空间垃圾,需要定期清理未使用的镜像、容器和网络,释放磁盘空间:
docker system prune -af
-a 清理所有未使用的镜像,-f 强制执行。
6. 使用 Docker 网络隔离服务
创建自定义网络,确保服务之间的通信安全且隔离:
docker network create my_network
docker run --network=my_network --name app myapp
docker run --network=my_network --name db mysql
以这样的方式,容器可以通过服务名互相访问,而无需暴露端口。
7. 利用多平台构建支持 ARM 和 x86
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multi-arch .
8. 安全性:为敏感信息使用 Docker Secret
避免在环境变量中存储密码或密钥,使用 Docker Secret 提供安全的存储方式:
echo "my_password" | docker secret create my_secret -
然后在服务中引用:
secrets:
- source: my_secret
9. docker history
当你修改了一个镜像,但是忘记了每一层的修改命令,或者你想查看一个镜像是怎么构建的时候就可以使用这个命令,比如
➜ ~ docker history traefik:v2.1.6
IMAGE CREATED CREATED BY SIZE COMMENT
5212a87ddaba 5 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 5 months ago /bin/sh -c #(nop) CMD ["traefik"] 0B
<missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["/entrypoint.… 0B
<missing> 5 months ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:59a219a1fb7a9dc8… 419B
<missing> 5 months ago /bin/sh -c set -ex; apkArch="$(apk --print-… 52.9MB
<missing> 5 months ago /bin/sh -c apk --no-cache add ca-certificate… 1.85MB
<missing> 6 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:a1906f14a4e217a49… 4.81MB
10. docker wait
这个命令可以查看容器的退出状态,比如
➜ ~ docker wait 7f7f0522a7d0
0
这样你就可以知道这个容器是正常退出的还是异常退出的了
11. docker diff
当你运行了一个容器,但是你不知道容器里修改了哪一些文件的时候可以使用这个命令,比如
➜ ~ docker diff 38c59255bf6e
C /etc
A /etc/localtime
C /var
C /var/lib
A /var/lib/registry
12. docker stats
这个是docker内置的监控命令,当你想要查看当前主机下所有容器占用内存和cpu的情况的时候就可以使用这个命令。