自分のアプリケーションに適切な Docker イメージを作成しているかどうかについて疑問を抱いたことがない人はいないでしょうか?そうですね、私はこの質問を何度か受けましたが、ほとんどの場合、自分のやり方が正しいのか間違っているのかわかりませんでした。
この記事では、Go アプリケーション用に効率的で最適化された Docker イメージを作成するための高度な実践方法について説明します。アルパイン ベース イメージとスクラッチ ベース イメージの使用など、さまざまなアプローチを比較し、コード例とそれぞれの利点について説明します。分析パフォーマンスプロジェクトの構造
例として、私は URL 短縮アプリであるこのアプリケーションを使用しています:
リーリー
マルチステージが登場します。
マルチステージビルド
リーリー
ビルドステージ):
ベースイメージとして golang:1.22-alpine を使用します。ファイナルステージ):
ベースイメージとして alpine:latest を使用します。これははるかに小さく、バイナリを実行するために必要なツールのみが必要です。今度は、生成したばかりのこの画像のサイズも分析できます。この場合、url-shortener:alpine は ~30mb:
リーリー
でもアルパインって何?
アプリで Alpine を使用する利点のいくつかは、主に次の 3 つの柱に関連しています:
リーリー
そうですね、この場合、最終的には最大 250 MB の画像になりました...アルパインと比較すると、純粋に最大 30 MB になりましたが、これはすでに大きな違いです。そしてそれをさらに改善することはできるのでしょうか?
答えは「はい」です。詳細を見ていきましょう
2. 高度な最適化
Essa abordagem minimalista traz benefícios significativos, especialmente em termos de segurança. Ao usar Scratch, você minimiza drasticamente a superfície de ataque, já que não há pacotes ou ferramentas adicionais que possam introduzir vulnerabilidades. Seu contêiner contém apenas o essencial para a execução do aplicativo, garantindo um ambiente imutável e previsível em qualquer situação.
# syntax=docker/dockerfile:1 # Build stage FROM golang:1.22-alpine AS builder WORKDIR /app COPY . . RUN go mod download RUN go build -o url-shortener ./cmd # Final stage with Scratch FROM scratch WORKDIR /app COPY --from=builder /app/url-shortener . CMD ["./url-shortener"]
E o resultado após criar as 3 imagens, nosso ranking de menor imagem ficou assim:
O Scratch conseguiu baixar mais alguns megas no tamanho final de nossa aplicação. Isso impacta no tamanho de arquivos transferidos pela rede, hoje algumas empresas cobram pela banda que trafegamos dentro dos servidores, e também pode influenciar em nosso Horizontal Scaling da aplicação.
Deixei os 3 Dockerfiles dentro do repositório do github caso você queira testar em seu próprio pc ?
A resposta mais tranquila para essa é "quase sempre", uma dica de cara é: ele vai muito bem com linguagens como Go, Rust, ou C/C++. Mas qui estão alguns pontos para levar em consideração na hora de escolher se deve ou não usar o scratch:
Usar o cache do Docker para otimizar o tempo de build é uma técnica essencial para evitar recompilar ou baixar dependências desnecessariamente em cada build. O Docker armazena em cache as camadas de cada etapa do Dockerfile, reutilizando-as sempre que possível.
Em projetos Go, baixar dependências com go mod download pode ser um processo demorado, especialmente se houver muitas dependências. Se você recompilar todas as dependências em cada build, isso aumenta significativamente o tempo de build.
Ao copiar apenas os arquivos go.mod e go.sum em uma etapa separada antes de copiar o código-fonte completo, você permite que o Docker use o cache dessa etapa se os arquivos go.mod e go.sum não tiverem mudado. Veja como fica nosso Docker file com as mudanças:
# syntax=docker/dockerfile:1 # Build stage FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN go build -o url-shortener ./cmd # Final stage FROM scratch WORKDIR /app COPY --from=builder /app/url-shortener . CMD ["./url-shortener"]
Só de fazer esta pequena mudança já ganhamos dois pontos bem interessantes quando se trata de desenvolvimento de software, que são:
Menor tempo de build: Se não houver alterações nos arquivos go.mod e go.sum, o Docker reutiliza o cache, evitando o download das dependências e economizando tempo.
Eficiência no CI/CD: Em pipelines de integração contínua, essa técnica reduz o tempo de execução dos pipelines, aumentando a eficiência do desenvolvimento e entrega.
Então bora usar isso a nosso favor no dia-a-dia :)
Docker Scout é uma ferramenta da Docker integrada ao Docker Desktop que analisa suas imagens para identificar vulnerabilidades de segurança. Ele fornece insights sobre as dependências presentes em suas imagens e alerta sobre possíveis problemas, permitindo que você tome medidas corretivas antes de implantar suas aplicações.
Por que é importante? Manter suas imagens Docker seguras é fundamental para proteger suas aplicações contra ataques e exploração de vulnerabilidades. O Docker Scout automatiza o processo de análise, tornando mais fácil manter suas imagens seguras e atualizadas.
O Scout funciona praticamente com 2 passos, ele examina a imagem Docker, mapeia todas as dependências incluídas na imagem e verifica essas dependências em uma base de dados de vulnerabilidades conhecidas. Por fim, classifica as vulnerabilidades encontradas por severidade e fornece recomendações para corrigir ou mitigar os problemas.
Dan dengan cara ini, kami akan mempunyai pencegahan proaktif yang akan mengenal pasti dan membetulkan kelemahan sebelum imej digunakan dalam pengeluaran, membantu melindungi daripada kemungkinan eksploitasi keselamatan dan kami juga memperoleh kecekapan operasi, apakah yang saya maksudkan dengan itu? Kami boleh mengautomasikan analisis kerentanan, membenarkan DevOps atau pasukan keselamatan menumpukan pada tindakan pembetulan dan bukannya penyiasatan manual.
Dengan amalan yang telah kami terokai, anda kini mempunyai laluan yang jelas untuk membina imej Docker untuk aplikasi Go anda Menggunakan teknik seperti Binaan Berbilang Peringkat yang mengurangkan saiz imej, memilih imej asas seperti alpine atau scratch untuk meningkatkan keselamatan dan kecekapan. dengan menggunakan Docker Scout untuk memantau kelemahan, anda boleh memastikan aplikasi anda berjalan dengan cekap dan selamat.
Amalan ini bukan sahaja meningkatkan prestasi teknikal, tetapi juga membawa manfaat langsung kepada kehidupan harian anda dan kepada syarikat, menjimatkan masa dan sumber.
Jadi pada kali seterusnya anda membina imej Docker, ingatlah strategi ini. Gunakannya dan perhatikan hasilnya. ?
以上がGo + Docker: Golang アプリケーションに最適な Docker イメージを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。