Tag: Docker

Gentoo distccd Docker

背景

Gentoo の Docker イメージが作りたい。が、

  1. オフィシャルの gentoo/stage3-amd64 の更新頻度が低い( 2021/08/08 時点で以前のアップデートが 1 年前だった )
  2. portage 用のイメージ gentoo/portageがあり、こちらは毎日更新されている。
  3. コマンドや glibc などが置かれているビルド済みの領域は gentoo/stage3-amd64 に置かれているため、実際に使うときには emerge –update –deep –newuse @world とリビルドが必要
  4. リビルドするとイメージのサイズがかなり増える

が、できればコンパクトなイメージにしたい。

結論(2021/08/17 時点)

docker-slimを使ってイメージをコンパクトにする方法が一番コンパクトになった。

手法サイズ備考
ダウンサイジング前3.04GB
不要なディレクトリの削除1.8GBemerge が一時的に使うファイル郡
(上記ディレクトリ削除に加えて)不要なパッケージの削除983MBパッケージ一覧を見ながら不要そうなパッケージを削除
docker-slim39MB

Dockerfile サンプル

ここに公開した

手法の比較

不要なディレクトリ削除は emerge が一時的に使うファイル郡を削除するだけなので安全に使える。

不要なパッケージの削除だが、これはパッケージ名の変更やパッケージ同士の依存関係の変更があると 必須ではないが、都度 Dockerfile の修正が必要になり長期間の運用を考えると、運用コストが上がる。

docker-slim を使った方法が一番コンパクトになった。ただ docker-slim は必要なファイルを動的に解析して必要なファイルのみを残すので、解析できるように準備する必要がある。

portage 用のイメージ gentoo/portageを使った方が良いのか?

RUN emerge –sync でも同様な事はできるので… と思ったが、毎回 emerge –sync に時間が取られるのは無駄。 もし「Docker のキャッシュで古い状態でビルドされるのが嫌だ」という場合でも、キャッシュを使わないオプションで docker build すれば最新の状態でビルドできる。

Read more...

cheatsheet/docker

やりたいことコマンド備考
Github Container Registry にログイン`echo $CR_PATdocker login ghcr.io -u exampleuser –password-stdin`環境変数 $CR_PAT にパーソナルアクセストークンが入っているものとする 参考
イメージのリストアップ`docker imagestac`
タグ付けdocker tag イメージID ghcr.io/exampleuser/genpi64-distcc-docker:latest
pushdocker push ghcr.io/exampleuser/genpi64-distcc-docker:latesthttps://github.com/[GithubのID]?tab=packages で docker レポジトリにアクセス可能
ポート開いて実行docker run -p 3632:3632 ghcr.io/exampleuser/genpi64-distcc-docker:latest
Read more...

cheatsheet/docker-slim

オプション効果
–state-pathdocker-slim の状態が保持されるパス、docker-slim コマンドが書き込めるパスにする
–target元のイメージ
–tagスリムになったイメージのタグ
–http-probeデフォルトは enable、ただ distcc の場合、HTTP ポートではないので false にしている
–execdocker-slim が動的にアプリケーションの振る舞いを解析する際に実行するシェルスクリプト

time docker build  . -t genpi64-distcc-large:latest
docker-slim --state-path ~/tmp/docker-slim build --target genpi64-distcc-large:latest --tag ghcr.io/exampleuser/genpi64-distcc-docker:latest --http-probe=false --exec "/need.bash"
docker push ghcr.io/exampleuser/genpi64-distcc-docker:latest

参考

オフィシャル

Read more...

docker

リファレンス 

オフィシャル

Dockerfile の見直す時に参考にする場所

Dockerfile のベストプラクティス その 1 ) 下記以外にもあるが私が忘れやすいポイントだけ

  • .dockerignore ファイルを使う
  • レイヤの数を最小に
  • 複数行の引数 <= 引数はアルファベット順に
  • 構築キャッシュ <= docker build で –no-cache=true とすると既存キャッシュを使わない
  • CMD <= 常に CMD [“executable”, “param1”, “param2”…] のような形式で使うべきです。
  • WORKDIR <= 明確さと信頼性のため、常に WORKDIR からの絶対パスを使うべきです。
  • Distroless が使えないか検討する

その 2

  • LABEL <= ロジェクト内でのイメージ管理をしやすくしたり、ライセンス情報の記録や自動化の助けとするなど、さまざまな目的があります。

参考

マルチステージビルドの利用
現実に効果的な Dockerfile を書くためには、
いつもながらトリッキーなシェルのテクニックや、
レイヤーができる限り小さくなるようなロジックを考えたりすることが必要でした。
つまり各レイヤーは、それ以前のレイヤーから受け継ぐべき生成物のみを持ち、
他のものは一切持たないようにすることが必要であったわけです。
本来 2 つあるRUNコマンドを Bash の&&オペレーターによって連結しています。
これを行うことで、イメージ内に不要なレイヤーが生成されることを防いでいます。
ただこれでは間違いを起こしやすく、保守もやりづらくなります。

保守がやりづらくなる、という認識は docker にもあるようだ。

Read more...

docker-compose/セキュリティ関連

Privileged(特権)ではない方法で、必要な分だけセキュリティを緩める

背景

Privileged(特権)を持った Docker コンテナは root 権限を備えたコンテナであり、 2021 年の Docker では Linux のセキュリティコンピューティングモード(secure computing mode; seccomp)と呼ばれる機構で制限がかけられている。 現在は 300 以上あるシステムコールのうち 44 が制限されている。

どのように制限をかけるか簡単に確認してみた。

環境

docker-compose の実行は Ubuntu Studio 21.04 コンテナは gentoo/stage3-amd64

docker-compose.yml に追加
  1. 制限する profile.json の雛形をダウンロード
  2. 雛形を修正
  3. docker-compose.yml 修正
  4. docker-compose を起動し直し

手順

wget https://raw.githubusercontent.com/moby/moby/master/profiles/seccomp/default.json

default.json を確認する。このリストはホワイトリストで、このリストに含まれていない場合、ブロックされる。 つまり「何か権限が足りない場合」、「このリストに追加」したい。

ただ 2021/08/04 に確認した所、 CAP_SYS_PTRACE に process_vm_readv は追加されていたので、 一旦、修正は加えず、 profile.json を持ちいて起動するように docker-compose.yml を修正して起動する。

docker-compose の修正

version: "3"
services:
  distcc:
    build:
      context: ./
    container_name: 'distcc'
    security_opt:                     # <= security_opt を追加
      - seccomp:default.json          # <= docker-compose.ymlと同じディレクトリにjsonファイルを置いた
    command: >
      bash -c "/bin/bash"
    volumes:
      - ./make.conf:/etc/portage/make.conf
発生していたエラー
/var/tmp/portage/sys-libs/glibc-2.33-r1/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/sln /var/tmp/portage/sys-libs/glibc-2.33-r1/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/symlink.list
 * /var/tmp/portage/sys-apps/sandbox-2.18/work/sandbox-2.18/libsandbox/trace.c:do_peekstr():134: failure (Operation not permitted):
 * ISE:do_peekstr:process_vm_readv(104259, 0x00007ffe29debd20{0x00007fd68a110010, 0x535}, 1, 0x00007ffe29debd30{0x00000000ff9a1acb, 0x535}, 1, 0) failed: Operation not permitted
/bin/sh: line 1: 89178 Aborted                 make -r PARALLELMFLAGS="" -C /var/tmp/portage/sys-libs/glibc-2.33-r1/work/glibc-2.33 objdir=`pwd` install

↑ この ↓ の部分が気になる

Read more...

cheatsheet/docker-compose

便利な

Docker Compose V2 では docker compose を使う。古い環境では docker-compose の場合があるが、新規手順では docker compose を優先する。

オプション効果
imagesイメージ一覧
logsログ
port web 3000ポート表示
buildYAML に「build:」があれば、そのイメージをまとめてビルド
pullYAML に「image:」があれば、そのイメージをまとめてプル
up -dpull して build してからデーモンとして まとめて起動
up -d hogehoge と依存するデーモン だけ を起動
stopまとめて終了
rmまとめて削除

キャッシュ使わないでビルド

docker compose build --no-cache

既存のコンテナを作り直す

docker compose up --force-recreate minecraft-touhou

参照

docker-compose コマンドまとめ - Qiita

docker-compose を使うと複数コンテナの管理が便利に - Qiita

Docker Compose - docker-compose.yml リファレンス - Qiita

Read more...

AWS ECR へCLIでイメージをアップする

dockerコンテナをECR repository( 以下、ECR )にアップする

まず、Web UIにログインした後、上部メニューの[ サービス ]->[ Elastic Container Registry ]->[ リポジトリ ]->[ リポジトリの作成 ] からリポジトリを作成する。

リポジトリ名

『リポジトリ名は英字で始まる必要があり、小文字、数字、ハイフン、アンダースコア、スラッシュのみを含めることができます。』というルールがある。 スラッシュがつけられるので、組織名をつけた。Githubのレポジトリ名は大文字を許容するが、ECRは許容しないので小文字に変更する。

example/Hoge_Web -> example/hoge_web

AWS CLIがインストールされていなければインストールして、アカウント設定する

ECRへのアクセス設定をする

( これはリポジトリ作成時に説明が表示されます。一度、空のリポジトリを作成すると流れがより良く分かるかもしれません )

ECRにログインする

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

上記コマンドはそのまま実行できる形なので、出力を別途実行する必要はありません。

Dockerイメージをビルドする

カレントディレクトリにあるDockerfileを用いてイメージ作成。Dockerfileにある場所に移動してから docker buildする。

docker build -t example/hoge_api .

イメージにタグを付ける

docker tag example/hoge_api:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/example/hoge_api:latest

Dockerレポジトリを作成

aws ecr create-repository --region us-east-1 --repository-name hoge

実行例。 これは2017/12に出たばかりの fargateモードで検証するため、バージニア北部リージョンにレポジトリを作成している

Read more...