2020年Docker公式ブログでよく読まれた記事TOP10をそれぞれ3行で紹介する

2020年のDockerの話題をある程度網羅できる気がしたのでまとめました。

## 出典
Docker 公式ブログ

* [Year in Review: The Most Viewed Docker Blog Posts of 2020 Part 1](https://www.docker.com/blog/year-in-review-the-most-viewed-docker-blog-posts-of-2020-part-1/)
* [Year in Review: The Most Viewed Docker Blog Posts of 2020 Part 2](https://www.docker.com/blog/year-in-review-the-most-viewed-docker-blog-posts-of-2020-part-2/)

## 1位 [Apple Silicon M1 Chips and Docker](https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/) (2020/12/16)
### 概要
* M1チップ搭載のMacで使えるDocker Desktopのプレビュー版を開発者向けに公開したよ
* amd64とarm64の混在するマルチプラットフォーム開発でDockerを活かせるよ
* もし使ってみてバグを踏んだら[docker/for-mac](https://github.com/docker/for-mac)で教えてね

### 詳細
M1チップ搭載Mac向けのDocker Desktopのプレビュー版公開についてのアナウンスです。年末のポストながら1位となり、その注目度の高さがうかがえます(具体的なビュー数を出している訳ではないので恣意的なものがあるかもしれませんが)。
対応にあたって3つ大きな課題があったようです。

1. HyperKitからVirtualization Frameworkへの移行
2. Docker Desktopの多種多様なバイナリのarm環境での再コンパイル
3. CI/CDに十分な数のハードウェアの確保

このうち1と2については大きく進捗し、このプレビュー版をリリースできるまでになったようです。自動テストについては、十分な数のハードを確保しているパートナーと組んで、12月の前半にようやくシステムを構築できたとのこと。プレビュー版リリースには、不足しているデバッグ作業を熱心なユーザに手伝ってもらいたいという意図も大いにありそうです。
プラットフォームに依存しない開発ができるというのは強いなと思います。命令セットアーキテクチャが違ってもその差異を意識せず同じイメージを使えるのは嬉しいですね。
(ただし当然ですがamd64にしか対応していないイメージはamd64でしか使えません。ARMネイティブな環境でビルドする、[Buildx](https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images)でマルチプラットフォームで使えるようにする等の対応が必要になります。)

### 参考
* [パブリックプレビューが開始されたAppleシリコン(M1)用のDockerを試してみた](https://dev.classmethod.jp/articles/docker-desktop-preview7-for-m1/)  
  プレビュー版の具体的なインストール方法を解説されています。
* [M1 Macのdocker previewでWordPressを動かしてみた](https://qiita.com/Nerosui777/items/dfef9612e4bbb86af3b5)  
  docker-composeでWordpressを起動した例を説明されています。
* [Buildx](https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images)  
  様々なプラットフォームで使えるイメージをビルドする方法の公式ドキュメントです。
  

## 2位 [Containerized Python Development – Part 1](https://www.docker.com/blog/containerized-python-development-part-1/) (2020/07/15)
### 概要
* Dockerを使ったPythonアプリ開発ハンズオン全3回のうちの1回目だよ
* Dockerfileからイメージをビルドする方法を教えるよ
* Dockerfileのベストプラクティスを紹介するよ

### 詳細
DockerでPythonのWebアプリを開発する環境をセットアップする[python-env-series](https://www.docker.com/blog/tag/python-env-series/)の1番目の記事です。

Pythonで開発したサービスをコンテナ化する方法について書かれています。Dockerfileの基本的な命令や、作成したイメージからコンテナを起動させる方法等について解説されています。
少し発展的なトピックとして、マルチステージビルドについても触れられています。

主な内容

* Flaskを使ったサービスの作成
* Dockerfileの記述方法
* Dockerfileのベストプラクティス
* コンテナの起動方法

このシリーズ自体、内容がまとまっているので手を動かしてDockerを学びたい人にお勧めです。何かの勉強会のハンズオン資料としてそのまま流用することもできそうです。Pythonになじみがあると尚良いですがPythonに触れたことがなくても理解できる内容になっています。

## 3位 [How To Use the Official NGINX Docker Image](https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/) (2020/08/13)
### 概要
* NGINXコンテナの実行方法を教えるよ
* カスタムHTMLファイルをコンテナに含める方法を教えるよ
* NGINXコンテナをリバースプロキシとして立ち上げてみるよ

### 詳細
NGINXを題材としたDockerのチュートリアルです。こちらも非常にまとまっていて、手を動かしてDockerを学びたい方におすすめです。

主な内容

* Dockerコンテナ開始のための基本操作
* NGINXをリバースプロキシとして使用
* イメージをDockerHubへプッシュ

NGINXをリバースプロキシとして使うケースは自分も色々探し回っていたことがあったので、早めにこの記事に辿り着けていればなあと思いました。
コンテナとしての利用方法もさることながら、リバースプロキシとして動かすためにconfファイルに何を書けばいいかがとても参考になりました。

## 4位 [How to deploy on remote Docker hosts with docker-compose](https://www.docker.com/blog/how-to-deploy-on-remote-docker-hosts-with-docker-compose/) (2020/03/02)
### 概要
* Docker Composeでリモートホストにアプリをデプロイするよ
* 異なるホストへのデプロイ方法のアプローチを解説するよ
* Docker Contextの使い方を教えるよ

### 詳細
リモートのDockerホストにdocker-composeコマンドでアプリをデプロイする方法についての解説です。
以下の3つの方法が紹介されています。

* docker-compose.ymlをリモートホストにコピーして、リモートホストでdocker-composeを実行する
* 環境変数DOCKER_HOSTを使用して通信するDockerホストを指定する  
  例) `DOCKER_HOST="ssh://user@remotehost"  docker-compose up -d`
* Docker Contextを利用してデプロイ先を選択する

この記事のメインはdocker-compose1.26.0-rc2で追加された Docker Contextサポートについての解説とサンプルです。
Docker Contextとは、大雑把に言うとリクエストを送るDockerホストを切り替えられる機能です。感覚としてはGitのリモートリポジトリを指定できる機能に近いです。
この機能を使うことで、ホストを切り替えることなくマルチコンテナアプリケーションをデプロイ・操作することができます。

### 参考
* [Docker Context](https://docs.docker.com/engine/context/working-with-contexts/)  
  Docker Contextの公式ガイドです。

## 5位 [How to Develop Inside a Container Using Visual Studio Code Remote Containers](https://www.docker.com/blog/how-to-develop-inside-a-container-using-visual-studio-code-remote-containers/) (2020/06/16)
### 概要
* [Jekyll](http://jekyllrb-ja.github.io/)を使った内部向けハンドブックページの作成環境をコンテナ化してチームに配布した事例を紹介するよ
* VSCode拡張の開発用コンテナには様々なテンプレートがあって、カスタマイズもできるよ
* 開発環境コンテナを作成するDockerfileやVSCodeのタスク等もバージョン管理できて良いよ

### 詳細
主にVSCodeの "Remote-Containers: Open Folder in Container" の機能の紹介です。
この機能はなかなか凄くて、あるOSや言語、フレームワークの環境をGUI操作だけで立ち上げてくれます。
記事中で紹介されているチームでの使用もさることながら、個人で勉強していて「ちょっとあの言語使ってみたいんだけど開発環境の構築が面倒」みたいな時にも力を発揮しそうです。
特別な設定をしなくても[microsoft/vscode-dev-containers](https://github.com/microsoft/vscode-dev-containers/tree/master/containers)リポジトリにあるものは選択してコンテナとして起動することができます。

## 6位 [Scaling Docker to Serve Millions More Developers: Network Egress](https://www.docker.com/blog/scaling-docker-to-serve-millions-more-developers-network-egress/) (2020/08/24)
### 概要
* DockerHubのイメージpullの回数制限について案内するよ
* 2020年11月1日から適用されるよ
* pullを行うアカウントの種類ごとに制限の内容が違うよ

### 詳細
DockerHubからのイメージpullの回数制限(pull rate limit)についての記事です。
制限の内容、制限に至った理由を説明しています。
また、理解を促進するためにイメージのpullがどのように行われているかのアーキテクチャについても触れられています。
中でも以下の情報は面白かったです。

* DockerHubのイメージダウンロードの全数の約30%は匿名ユーザの1%によって占められていた
* イメージのpullはmanifestのリクエストとblobのリクエストのコンビネーションである
* 使用帯域幅と最も相関があるのはイメージレイヤのリクエスト数だが、ユーザにとって分かりづらいためpullの回数で制限をかけることにした

残りのpull可能回数を調べる問い合わせのために1回分のpullを消費する仕様なのはどうにかならないものですかね？

## 7位 [Docker Desktop for Windows Home is here!](https://www.docker.com/blog/docker-desktop-for-windows-home-is-here/) (2020/03/05)

※この記事は既に古く、 Docker Desktop Stable 2.3.0.2以降からWSL2に対応しています。[(2020/05/11リリース)](https://docs.docker.com/docker-for-windows/release-notes/#docker-desktop-community-2302)
### 概要
* Windows Home WSL2を試験的にサポートするよ
* Windows HomeにDocker DesktopをインストールしてVSCodeで開発を始める手順を紹介するよ
* Windows Insider Preview build 19040以降のバージョンに対応しているよ

### 詳細
この記事はExperimentとしてのWSL2対応の発表でしたが、上述のとおり2020年5月の時点でStable版に組み込まれました。
インストールの手順等のドキュメントも整備されているので、今となってはこの記事を参照する必要はあまり無さそうです。
日本語情報としては、2020年のQiita DockerアドベントカレンダーにWSL2を利用してWindowsでDocker Desktopを動かした事例が2件投稿されていました。どちらも図解ありで詳しく説明されているので参考にさせていただきました。

### 参考
* [Docker for Windows release notes](https://docs.docker.com/docker-for-windows/release-notes/#docker-desktop-community-2302)  
  Docker for Windowsのリリースノートです。
* [Docker Desktop WSL 2 backend](https://docs.docker.com/docker-for-windows/wsl/)  
  公式ドキュメントです。WSL2をバックエンドとしてStable版のDocker Desktopを利用する方法がまとめられています。
* [貧弱なWindows PCでもDockerを動かしたい！（WSL2）](https://qiita.com/y9k8i/items/ed6804de727aa332e8ab)  
導入方法やトラブルシューティングについて詳細に解説されています。
* [Windows 10 HomeへのDocker Desktopインストールが何事もなく簡単にできるようになっていた (2020.12時点)](https://qiita.com/zaki-lknr/items/db99909ba1eb27803456)  
  VSCodeでのHello WorldやDocker Composeの導入まで解説されています。

## 8位 [Containerized Python Development – Part 2](https://www.docker.com/blog/containerized-python-development-part-2/) (2020/07/21)
### 概要
* Dockerを使ったPythonアプリ開発ハンズオン全3回のうちの2回目だよ
* Docker Composeで3層Webアプリケーションを立ちあげるよ
* Docker Composeのベストプラクティスを紹介するよ

### 詳細
2位の記事の続編です。
Part1でPythonのWebアプリケーションをコンテナ化する方法自体は示しており、Part2ではアプリケーションと他のコンポーネントをつなぐ方法について紹介しています。

主な内容

* Composeについての説明とファイルの作成方法
* docker-compose.ymlのベストプラクティス
* network： ネットワーク設計
* volume： 永続ボリューム
* secrets： シークレット情報

なお、最終回であるPart3ではFlaskで立てたアプリケーションサーバに対してVSCodeからリモートデバッグを仕掛ける方法について解説されています。

## 9位 [Advanced Dockerfiles: Faster Builds and Smaller Images Using BuildKit and Multistage Builds](https://www.docker.com/blog/advanced-dockerfiles-faster-builds-and-smaller-images-using-buildkit-and-multistage-builds/) (2020/04/20)

### 概要
* BuildKitっていう新しいイメージビルダについて紹介するよ
* BuildKitなら解釈できる効率的なDockerfileのパターンを紹介するよ
* BuildKitはいいぞ

### 詳細
DockerイメージをビルドするツールであるBuildKitについて紹介している記事です。
BuildKitは新しくインストールする必要があるものではなく、Docker18.09以降ならばDockerをインストールした時点でついてきます。
ただしデフォルトではオフなので以下のいずれかの方法でオンにする必要があります。(例外として、Docker Desktopでは2.4.0.0からBuildKitがデフォルトのビルダに設定されています。)

■ ある特定のビルドでのみONにしたい場合  
docker build 実行時に環境変数DOCKER_BUILDKITを設定する

```
$ DOCKER_BUILDKIT=1 docker build -t myimage .
```

■ 常時ONにしたい場合  
`etc/docker/daemon.json` にBuildKitを有効化する設定を追記する

``` daemon.json
{
    "features": {
        "buildkit": true
    }
}
```



BuildKitを有効化することで実現できることの例として以下の内容が挙げられています。

* マルチステージビルドにおいて前ステージで作成したイメージをFROM句に指定
* COPYコマンドでのDockerfile外のイメージのディレクトリの直接指定
* 並列化できるステージを並列にビルド
* FROM ASを単体で使うことによるイメージのエイリアス作成
* 不要なステージの自動スキップ
* IF/ELSEのような挙動
* プロダクション/ 開発/テスト用のDockerfileの一元化



### 参考
* [BuildKit でイメージ構築](https://docs.docker.jp/develop/develop-images/build_enhancements.html)  
  BuildKitの有効化方法などについてのドキュメンテーションです。
* [Docker Desktopリリースノート](https://docs.docker.com/docker-for-mac/release-notes/#docker-desktop-community-2400)  
  2.4.0.0の欄にBuildKitがデフォルトで有効になった旨が書かれています。


## 10位 [Announcing the Compose Specification](https://www.docker.com/blog/announcing-the-compose-specification/) (2020/04/07)
### 概要
* マルチコンテナアプリの仕様の標準を皆で決めるコミュニティを作ったよ
* 仕様を策定することでCompose系のツールのオープン性を高めるよ
* Compose Specificationのドラフトの詳細は[compose-spec.io](https://compose-spec.io/)を確認してね

### 詳細
この話は調べてみると中々に奥が深く、Dockerというプロダクトの性質とDocker社のビジネスの方針がバックグラウンドにあるようです。
Dockerには環境の構築や共通化等をサポートする開発ツールとしての側面と、アプリケーションを運用するインフラストラクチャ基盤としての側面があります。
Docker社はこのうち開発ツールとしての側面を強化していく方向に舵を切りました。その表れの例が[2019年11月に発表されたDocker EEのMirantis社への売却](https://www.mirantis.com/blog/mirantis-acquires-docker-enterprise-platform-business/)であり、今回のCompose Specificationコミュニティについてのアナウンスであるといえます。
インフラ事業へ割くリソースを減らし、開発ツールとしてのDockerに注力する動きですね。マルチコンテナアプリケーションの開発というジャンルでDocker社のプレゼンスを高める狙いもありそうです。
[2020年以降のプレスリリース](https://www.docker.com/company/newsroom/press-release-archive)には露骨に"Developers", "Development"と言った単語が頻出していて、その選択と集中の本気ぶりがうかがえます。

Compose Specificationのコミュニティ設立についての発表から半年と少し、Docker ComposeのAWS向けCLIとMicrosoft Azure向けCLIがともにGAとなりました。いずれもこのアナウンスの中で主な協力先として名指ししていたベンダーです。透明性が保たれた状況下で標準が策定され、それに則ったツールがリリースされたことで、コミュニティは一定の成果を挙げたと言えるのではないでしょうか。

### 参考
* [Docker社がエンタープライズ事業を譲渡した今、Dockerの父が思うこと](https://blog.inductor.me/entry/2019/11/22/072353)  
  Dockerの源流であるMoby Projectのメンバーの発言をかみ砕いて説明されています。Dockerの2つの側面のくだりはこちらを参考にしました。
* [マルチコンテナ環境を構成するためのオープン仕様「Compose Specification」登場。Docker、AWS、マイクロソフトらが協力して仕様拡張へ](https://www.publickey1.jp/blog/20/compose_specificationdockeraws.html)  
  Compose Specificationに見るDocker社の戦略について考察されています。
* [Docker Compose for Amazon ECS Now Available](https://www.docker.com/blog/docker-compose-for-amazon-ecs-now-available/)  
  AWS向けのDocker ComposeツールがGAになったことのアナウンスです。
* [Compose CLI ACI Integration Now Available](https://www.docker.com/blog/compose-cli-aci-integration-now-available/)  
  Azure向けのDocker ComposeツールがGAになったことのアナウンスです。

## その他
### 今年人気だったWebinar
* [From Docker Straight to AWS](https://goto.docker.com/On-Demand-From-Docker-Straight-to-AWS.html)
* [Find and Fix Container Image Vulnerabilities with Docker and Snyk](https://goto.docker.com/on-demand-find-fix-container-image-vulnerabilities.html)
* [Adding Container Security to Docker Hub](https://goto.docker.com/on-demand-adding-container-security.html)

### 今年人気だったWorkshop
* [Getting Started with Docker](https://goto.docker.com/on-demand-workshop-getting-started-with-docker-201117)
* [I Didn't Know I Could Do That with Docker - AWS ECS Integration](https://goto.docker.com/on-demand-workshop-i-didnt-know-i-could-do-that-with-docker-201124.html)
* [I Didn't Know I Could Do That with Docker - Python Developers](https://goto.docker.com/on-demand-workshop-i-didnt-know-i-could-do-that-with-docker-201208.html)

## おわりに
2020年にDockerまわりで起きた出来事や変化について、ある程度押さえられたのではないかと思います。完全に理解しているような体で書きましたが、そんなこと起きてたんだーっていうものも多くありました。間違い等あればご指摘いただければ幸いです。
簡潔に書くつもりだったのに激長記事になりましたが、色々と勉強になってよかったです。

ここまで読んでくださってありがとうございました。
よいお年を。