冷门但又非常实用的 Docker 使用技巧

简介

上一篇文章我针对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的情况的时候就可以使用这个命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值