Dockerコンテナ内の名前解決をプライベートIPアドレスにする

Docker Engine 24.0 Docker Compose 2.21 プライベートDNSを運用しているネットワークで、 Dockerコンテナからネットワーク内の別のホストに通信したいとき、 デフォルトではGoogle Public DNS8.8.8.8でホスト名がグローバルIPアドレスに解決されるため、 ISPやCloudflare Tunnelなどの外部を経由して通信することになり、非効率で危険な通信経路になります。 また、IPアドレスによるアクセス制限を設けている場合、 プライベートIPアドレスがソースとなる通信になるように通信経路を制御したい場合があります。 以下の設定により、コンテナ内でexample.comが192.168.0.50に解決されるようになります。 Docker sudo docker run --rm --add-host "example.com:192.168.0.50" hello-world Managing /etc/hosts - Docker run reference | Docker Docs Docker Compose services: app: image: hello-world extra_hosts: - "example.com:192.168.0.50" extra_hosts - Services top-level element | Docker Docs

2023年12月9日 · aoirint

Docker Registryをホストしてhtpasswdで認証する

registry - Official Image | Docker Hub Native basic auth - Restricting access - Deploy a registry server | CNCF Distribution htpasswdファイルの作成 htpasswdファイルを作成します。 registryイメージ(Distribution Registry)はbcrypt形式のパスワードのみサポートしているため、パスワードをbcrypt形式でハッシュ化する必要があります。 sudo apt install apache2-utils mkdir auth cd auth htpasswd -cB htpasswd myuser 永続化ディレクトリの作成 mkdir data docker-compose.ymlファイルの作成 services: registry: image: registry:2 restart: always environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm # ports: # - "0.0.0.0:5000:5000" volumes: - ./data:/var/lib/registry - ./auth:/auth コンテナの実行 sudo docker compose up -d コンテナのTCP 5000番ポートでDocker Registry HTTP APIがリッスンします。 このポート宛にCloudflaredやリバースプロキシを設定して、https://docker.example.comのようにサービスを公開します。 ...

2023年12月9日 · aoirint

Dockerコンテナのメモリ使用量を制限する

Docker Engine 24.0 Docker Compose 2.21 Docker # 100 MB sudo docker update --memory "100m" "$CONTAINER_ID" # 1 GB sudo docker update --memory "1g" "$CONTAINER_ID" # 制限を解除 sudo docker update --memory "0" "$CONTAINER_ID" Docker Compose app: image: hello-world deploy: resources: limits: memory: '1g' 参考 Update the limitation of memory/CPU for existing container in docker - Stack Overflow Runtime options with Memory, CPUs, and GPUs | Docker Docs Compose Deploy Specification | Docker Docs

2023年12月9日 · aoirint

DockerコンテナのCPU使用量を制限する

Docker Engine 24.0 Docker Compose 2.21 Docker # CPU 1個 sudo docker update --cpus "1" "$CONTAINER_ID" # CPU 0.01個(最小) sudo docker update --cpus "0.01" "$CONTAINER_ID" # 制限を解除 sudo docker update --cpus "0" "$CONTAINER_ID" Docker Compose app: image: hello-world deploy: resources: limits: cpus: '0.1' 参考 Update the limitation of memory/CPU for existing container in docker - Stack Overflow Runtime options with Memory, CPUs, and GPUs | Docker Docs Compose Deploy Specification | Docker Docs

2023年12月9日 · aoirint

Dockerfileでイメージ内の既存ディレクトリ宛にADD/COPYした場合の挙動を調べた

Docker Engine 24.0 Dockerイメージのビルド時に、イメージ内のディレクトリ構造に、同じディレクトリ構造をもつホスト側ディレクトリを追加した場合の挙動を確認したい。 cp -rやrsync -aのような挙動を期待するが、動作を検証してみた。 結果として、cp -rやrsync -aのように、既存のディレクトリ内容を維持して、新しいファイルを追加し、重複するファイルがあれば上書きする挙動をした。 ADD - Dockerfile reference | Docker Docs ADDでファイルが重複しない場合 イメージ内に以下のようなディレクトリ構造を構築する。 /hoge fuga piyo/ hogera RUN <<EOF set -eu mkdir /hoge touch /hoge/fuga mkdir /hoge/piyo touch /hoge/piyo/hogera EOF ビルドコンテキストディレクトリに以下のようなディレクトリ構造を構築する。 このディレクトリを先ほどのイメージ内の/hogeにADDする。 hoge/ fugera piyo/ hogerara ADD ./hoge /hoge/ 結果表示用のtreeコマンドをインストールするコマンドを加えて合わせると、以下のようなDockerfileになる。 # syntax=docker/dockerfile:1.6 FROM ubuntu:22.04 RUN <<EOF apt-get update apt-get install -y \ tree apt-get clean rm -rf /var/lib/apt/lists/* EOF RUN <<EOF set -eu mkdir /hoge touch /hoge/fuga mkdir /hoge/piyo touch /hoge/piyo/hogera EOF ADD ./hoge /hoge/ docker build -t doco . docker run --rm -it doco # tree /hoge /hoge |-- fuga |-- fugara `-- piyo |-- hogera `-- hogerara 1 directory, 4 files 既存のディレクトリの内容を維持したまま、新しいファイルが追加される。 ...

2023年10月13日 · aoirint

自宅サーバのDocker NetworkのIPアドレスプールが枯渇した

https://twitter.com/aoirint/status/1617993934625722368 弊自宅サーバでは、サーバソフトウェアや定期実行プログラムのデプロイに、基本的にDocker Composeを使用しています。 先日、新しいソフトウェアをDocker Composeでデプロイしようとして、以下のエラーが発生しました。 Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network Docker Networkが使用するIPアドレスプールが枯渇し、新しいIPアドレスブロックを確保できなかったという内容のエラーです。 環境 Ubuntu 20.04 $ docker -v Docker version 20.10.23, build 7155243 $ docker compose version Docker Compose version v2.15.1 原因 このエラーは、30個程度のDocker Networkを作成すると発生するようです。 Docker Composeでは通常、プロジェクト1つあたり、1つのDocker Networkが作成されます(複雑なプロジェクトでは、2つ以上使用することがあるかもしれません)。 手元の環境では、Docker Composeのプロジェクトが27個稼働しており、28個目のプロジェクトを起動したときにエラーが発生しました。 Docker Networkの一覧は、以下のコマンドで確認できます。 docker network ls Docker NetworkのIPアドレスには、いわゆるプライベートIPアドレスの範囲が使用されます。 プライベートIPアドレスの範囲は、以下のようになります(CIDR表記)。 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 作成されたDocker Networkに割り当てられたIPレンジはdocker network inspectコマンドで確認できます。 以下の記事で紹介されているコマンドが便利です。 ...

2023年1月26日 · aoirint

PIDから対応するdockerコンテナを見つける

docker-pidパッケージが便利 https://www.glia-computing.com/blog/listing-process-ids-on-docker-containers/ https://github.com/masatanish/docker-pid pip3 install docker==5.0.3 docker-pid==0.0.3

2022年5月22日 · aoirint

docker-composeでBuildKitを使う

ビルドコマンド https://stackoverflow.com/questions/58592259/how-do-you-enable-buildkit-with-docker-compose DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose build Dockerfile https://www.docker.com/blog/introduction-to-heredocs-in-dockerfiles/ # syntax=docker/dockerfile:1.3-labs

2021年11月8日 · aoirint

Docker Desktop for Mac上のX ClientをホストのXQuartz(X Window Server)で表示する

$ docker -v Docker version 20.10.0, build 7287ab3 $ brew -v Homebrew 2.6.2 Homebrew/homebrew-core (git revision ce927; last commit 2020-12-19) Homebrew/homebrew-cask (git revision eb977; last commit 2020-12-19) $ brew info xquartz xquartz: 2.7.11 (auto_updates) https://www.xquartz.org/ /usr/local/Caskroom/xquartz/2.7.11 (74.6MB) From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/xquartz.rb ==> Name XQuartz ==> Description Open-source version of the X.Org X Window System Docker Desktop for Mac 3.0.2 (50996) macOS Catalina Version 10.15.7 XQuartzのインストール(HomebrewとHomebrew Cask) 現在はbrew caskコマンドは非推奨で、brewだけでOK(あるいは--caskオプションをつける)。 XQuartzの場合は--caskをつけなくても内部で勝手にbrew caskとしてインストールしてくれた。 Homebrew CaskというのはGUIアプリケーション向けのHomebrewの拡張らしいが、Homebrewと何が違うのかわからん。 Warning: Calling brew cask install is deprecated! Use brew install [--cask] instead. The Missing Package Manager for macOS (or Linux) — Homebrew homebrew-cask — Homebrew Formulae Homebrew/homebrew-cask: 🍻 A CLI workflow for the administration of macOS applications distributed as binaries command line - What is the difference between brew and brew cask? - Ask Different homebrew-cask/USAGE.md at master · Homebrew/homebrew-cask Homebrewは、開発元からソースコードが配布されていて、そのコンパイル済みのバイナリ(またはソースダウンロード+自動ローカルビルド)を提供するもので、 Homebrew Caskは、*.dmgが配布されていてマウントして*.appを/Applicationsにコピーする操作(実際には/usr/local/Caskroomにインストールする)のを自動化する、というものなのだろうか? --caskを明示するのは両方に登録されていてもCaskを優先するみたいな指定なのか? XQuartzの場合は--caskを付けなくてもCaskとしてインストールされた。 ...

2020年12月20日 · aoirint

Dockerイメージから内容物を抽出する

docker save | Docker Documentation docker pull alpine:3 docker save -o out.tar alpine:3 mkdir out tar xvf out.tar -C out/ cd out/6709f754bd0ccbbea9a7481e92772a494cca1543b3421978edff62bc5de16662 tar xvf layer.tar -C layer/ cd layer # here is root directory

2020年12月8日 · aoirint