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]