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

GitLab CI, DockerイメージをビルドしてContainer Registryにpushする(2023年版)

前回の記事(2021年版)から、以下の内容でアップデートしました。 Docker Engine 24.0 BuildKit レイヤーキャッシュ(Registry cache) タグによるバージョン付け 注意:Self Hosted GitLab RunnerでのDockerデーモンを使ったイメージビルドは推奨しません DinDでのビルドのため、ホストOSのroot権限が取得可能な、コンテナの特権実行(--privileged)、またはDockerソケットのマウント(DooD)が要求されます。 GitLab.comのShared Runnerは使い捨てのGCPインスタンスで提供されるため、コンテナブレイクアウト等によりホストのroot権限が取得されても、 Dockerエンジンのホストである仮想マシンごと破棄されますが、そのような工夫をしていないRunner(VPSやベアメタル)では、 CIジョブの実行により、ホストのroot権限で悪意ある操作が実行され、また、その影響が持続する危険性があります。 Dockerデーモンを必要としない、代替ソフトウェアによるDockerイメージビルドを検討してください。 リポジトリ構造 .gitlab-ci.yml Dockerfile .gitlab-ci.yml # License: CC0-1.0 stages: - build build: stage: build image: docker:24.0 services: - docker:dind rules: # Release - if: $CI_COMMIT_TAG variables: DOCKER_IMAGE_NAME_AND_TAG: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}" DOCKER_CACHE_FROM: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache" DOCKER_CACHE_TO: "" # Default branch - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH variables: DOCKER_IMAGE_NAME_AND_TAG: "${CI_REGISTRY_IMAGE}:latest" DOCKER_CACHE_FROM: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache" DOCKER_CACHE_TO: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache,mode=max" script: - apk add --no-cache git - docker buildx create --use - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" - > docker buildx build . -t "${DOCKER_IMAGE_NAME_AND_TAG}" --cache-from "${DOCKER_CACHE_FROM}" --cache-to "${DOCKER_CACHE_TO}" --push ※ docker buildx buildのコマンドは複数行になっていますが、2行目以降を1行目と異なるインデント数にしないでください。2行目以降が別のコマンド扱いになり、動作しなくなります。 docker buildx create --use docker buildx build実行時に、以下のようなエラーが出るため追加しています。 ...

2023年5月18日 · 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

ARK: Survival Evolved Dedicated Server

以下のDockerイメージを使う。 https://hub.docker.com/r/hermsi/ark-server/ docker-compose.yml イメージのタグは適宜最新のものに更新する。 version: '3.8' services: ark: image: hermsi/ark-server:tools-1.6.61a restart: always volumes: - ./ark-server:/app - ./ark-server-backups:/home/steam/ARK-Backups environment: - SESSION_NAME=${SESSION_NAME} - SERVER_MAP=${SERVER_MAP} - SERVER_PASSWORD=${SERVER_PASSWORD} - ADMIN_PASSWORD=${ADMIN_PASSWORD} - MAX_PLAYERS=${MAX_PLAYERS} - UPDATE_ON_START=${UPDATE_ON_START} - BACKUP_ON_STOP=${BACKUP_ON_STOP} - PRE_UPDATE_BACKUP=${PRE_UPDATE_BACKUP} - WARN_ON_STOP=${WARN_ON_STOP} ports: # Port for connections from ARK game client - "0.0.0.0:7777:7777/udp" # Raw UDP socket port (always Game client port +1) - "0.0.0.0:7778:7778/udp" # RCON management port - "127.0.0.1:27020:27020/tcp" # Steam's server-list port - "0.0.0.0:27015:27015/udp" .env SESSION_NAME=my-ark-session-name SERVER_MAP=TheIsland SERVER_PASSWORD=myserverpasword ADMIN_PASSWORD=myadminpassword MAX_PLAYERS=10 UPDATE_ON_START=false BACKUP_ON_STOP=false PRE_UPDATE_BACKUP=true WARN_ON_STOP=true ポート公開 詳細は調査中。 ...

2022年7月30日 · aoirint

GitHub ActionsでDocker RegistryにDockerイメージをpushする(latestタグ、GitHub Release連携でバージョン付け)

https://blog.aoirint.com/entry/2021/github_actions_docker_io_token/ 上の記事のWorkflowテンプレートをちょっと改良した。 Docker Hub以外のDockerレジストリに対応 GitHub Release作成時にリリースタグをイメージタグにしてpush レジストリURL Docker Hub: docker.io GitHub Container Registry: ghcr.io GitLab Container Registry: registry.gitlab.com GitHub Secrets DOCKER_USERNAME DOCKER_TOKEN GitHub Workflow .github/workflows/docker.yml https://github.com/docker/login-action https://github.com/docker/build-push-action name: Push to Docker registry on: push: branches: - main release: types: - created env: IMAGE_NAME: docker.io/username/imagename IMAGE_TAG: ${{ github.event.release.tag_name != '' && github.event.release.tag_name || 'latest' }} jobs: push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Docker Buildx id: buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Registry uses: docker/login-action@v2 with: registry: docker.io username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and Deploy Docker image uses: docker/build-push-action@v3 env: IMAGE_NAME_AND_TAG: ${{ format('{0}:{1}', env.IMAGE_NAME, env.IMAGE_TAG) }} with: context: . builder: ${{ steps.buildx.outputs.name }} file: ./Dockerfile push: true tags: ${{ env.IMAGE_NAME_AND_TAG }} cache-from: type=registry,ref=${{ env.IMAGE_NAME_AND_TAG }}-buildcache cache-to: type=registry,ref=${{ env.IMAGE_NAME_AND_TAG }}-buildcache,mode=max

2022年6月24日 · 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