Open5

Docker

Dockerが実現したこと

  • アプリケーションを実行するために必要なすべてをDockerイメージに入れられる
  • Dockerイメージに含むアプリケーションをDockerコンテナとして実行できる
  • Dockerコンテナはマシン上の他のプロセスやコンテナの影響を受けず実行できる
  • Dockerイメージは他のPCに移動できる

Dockerコンテナ

  • Linux上の特別なプロセス、コンテナとして起動するアプリケーション(実体はプロセス
  • アプリケーションを簡単なコマンドで操作可能
  • Dockerコンテナは仮想化技術ではなく、Linux上のプロセスを特別な状態で実行できるようにする技術
    • コンテナはLinuxカーネルが提供する隔離機能、プロセスを隔離された特別な状態として起動する
  • LXCを利用
    • LXCとは:仮想マシンを作り出すのではなく、OSが利用するリソースを隔離することで複数の環境を並立させることを可能にする
    • https://knowledge.sakura.ad.jp/2108/

Dockerイメージ

  • Dockerコンテナを起動する際に必要となるファイルシステムとメタ情報を含む概念
  • アプリケーションのパッケージ化や環境間の移動が簡単にできる

Dockerのセキュリティ

Rootless

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Oct 22 09:53 /var/run/docker.sock

https://drgripa1.hatenablog.com/entry/2021/05/08/195822
https://medium.com/nttlabs/rootless-docker-12decb900fb9

通常のDocker (rootful) を共有環境で使用すると、次のような問題があります。

docker run --user 42などとしないと、コンテナがrootで実行される*2
1つのデーモンをrootで実行し、そこに全ユーザがアクセスするという形になっているため、他人のコンテナに自由に触れる
デーモンはrootで実行されるため、セキュリティ上様々な懸念が発生する

Docker 20.10より、Dockerのrootlessモードが正式対応されました。これはデーモンとコンテナを非rootユーザで実行する技術で、以下のようなメリットがあります。

デーモン・コンテナを各ユーザで実行するため、ユーザ間で完全に独立したDockerを使用できる
各コンテナの中ではrootユーザとして振る舞えるので、ライブラリのインストールなども可能
これはホストのroot権限とは異なる、見せかけのroot権限である
デーモンもユーザ権限で実行されるので、Dockerの脆弱性や設定ミスによるセキュリティ上の脅威が軽減できる

  • CMD
    • 主な目的は、コンテナ実行時のデフォルトを指定するため
    • イメージを実行する時、コンテナに対して何もオプションを指定しなければ、自動的に実行するコマンドを CMD 命令で指定
  • ENTRYPOINT
    • コンテナで必ず実行したいコマンドや引数
    • CMD命令が ENTRYPOINTで指定したコマンドに対する引数として機能させることもできる
    • Dockerfileには少なくとも一回はENTRYPOINTかCMDを記載すべき

https://pocketstudio.net/2020/01/31/cmd-and-entrypoint/

エラー時の挙動を明示する

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]
  • SHELL命令は何も指定しない場合は SHELL ["/bin/sh", "-c"] がデフォルト値となる
  • パイプ中のあらゆる段階でエラーがあれば失敗とするため、pipefailオプションを明示的に指定

makefile

「$ make xx」コマンドでdocker-composeコマンドが長くなる場合短縮できます。

up:
	docker-compose down
	export UID && \
	export COMPOSE_PROJECT_NAME=web && \
	docker-compose up -d
ログインするとコメントできます