Docker - user000422/0 GitHub Wiki

導入

Aパターン : Docker + WSL + VSCode

構築ファイルとしては docker-compose.yml + Dockerfile で構築可能。

■Oracle19c導入 https://zenn.dev/msksgm/articles/20211225-oracle-database-19c-docker

■おすすめイメージ redhat/ubi9:latest … RHEL

基本構成

projectdir
└ .devcontainer
  └ Dockerfile
  └ devcontainer.json

コマンド

RHEL9 … OSの仕様で docker コマンドが廃止。

# 一覧
docker ps -a

# コンテンナの起動
docker start [コンテナID]
# image
docker image pull sample  # イメージをDockerHubから取得

# container
docker container run sample  # イメージからコンテナを作成し起動

# docker-compose.yml の更新を反映
docker-compose up -d

# compose 「docker-compose.yml」でDockerを起動
# -d バックグラウンド起動
# --build コンテナ未作成の場合コンテナを作成する
docker compose -f "/home/sample/docker-compose.yml" up -d --build

# cp wslからコンテナへコピー(ディレクトリも可)
# xxxxx = コンテナID
# ホスト側(Ubuntu等)でコマンド実行
docker cp /sample/sample.txt xxxxx:/tmp/sample.txt

# 再ビルド
# カレント docker-compose.ymlのあるディレクトリ
# docker-compose.ymlのサービス名を指定
docker-compose build --no-cache sample-service

# キャッシュの削除
docker builder prune

Dockerfile

Dockerコンテナの構成情報 新規構築時はRUNを複数にしたほうがよい(RUN単位でキャッシュされるため再ビルド短縮できる)

# Dockerベースイメージ
FROM ubuntu:22.04

# ビルド時のコマンド
# && … コマンドを分別(一区切り)
# \ … コマンドを続ける(Dockerfileで改行したいがコマンドを続けたい場合に指定)
RUN mkdir sampleDir

# docker run時のコマンド
CMD

# コピー
# ホスト側は上位ディレクトリを指定できない(「../」は禁止)
COPY ./sampleDir/sample.txt /tmp/sample.txt

# コンテナ最初のパス(起動時のカレントパス
WORKDIR /sample

Ubuntu 基本型 高速化について https://genzouw.com/entry/2019/09/04/085135/1718/

FROM ubuntu:22.04

RUN apt update \
 && apt-get install --no-install-recommends -y \
    unzip

docker-compose.yml(ComposeFile)

DockerComposeの設定ファイル。 コロン区切り … マッピング(ホスト側:コンテナ側)

version: '3'

services:
  ap: # コンテナ
    container_name: ap # コンテナ表示名

    # DockerFileが格納されているディレクトリ
    # ※ディレクトリを記述すること!ファイルまで記述して3時間ハマった
    build: ./sample

    ports:
      - 80:80

    tty: true  # これがないとコンテナ起動ができなかった 理由はまだ分からない

    restart: always # 毎回起動

    # volumes ローカルとコンテナのファイル(ディレクトリ)をマウント
    volumes:
      - ./sampleDir/sample.txt:/sampleDir/sample.txt

# コンテナ間で連携(AP - DB)する場合は「networks」が必要
networks:
  sample-net:

devcontainer.json(VSCode用)

コンテナ上のVSCodeに拡張機能を設定 起動の仕方によっては必要ではない(コンテナに拡張機能を設定したい時用?)

{
    // コンテナ起動に使用するDockerfileパスを記述
    "dockerFile": "./Dockerfile",

    // 【推奨】コンテナ起動のカレントディレクトリ(VScodeのディレクトリツリーでルートから見たい場合は「/」)
    "workspaceFolder": "/"
}

■(応用)Ubuntu systemctl使えない問題解消法(解消したとこまで確認できた) docker-compose.yml Dockerfileを修正する必要がある。

# docker-compose.yml
# 重要な箇所のみ
services:
  sample-container:
    privileged: true
    command: /sbin/init
# Dockerfile
RUN apt-get update \
&& apt-get install -y init systemd

Error

■ERROR [コンテナ名 internal] load metadata for docker.io ビルド時やcomposeup時に発生。 ※※※※※※※※※そんな単純な解決方法はない。昔からある驚異的で頻度の高いエラー。ネット記事の解決法を全て試しても解決しない方が多い。 Dockerをアップデートすることで解消。 2023/12 「Docker hub」でアカウント作成、ローカルのコマンドプロンプトで「docker login」でログイン

・2023/12 解決した方法 /etc/resolv.conf を下記に書き換える

[network]
generateResolvConf = false
nameserver 8.8.8.8

応用

# 同じネットワークに属していないコンテナ同士を共有ネットワークに属させる方法
# 例)docker img + ネットワークを作成している自作コンテナ
docker network connect [ネットワーク名] [共有させたいコンテナID]