概要
GUIの無いUbuntu Server上でDocker使うのにメモ.
変更履歴
2024/05/21: ymlファイルの扱い
docker-compose.ymlファイルの推奨ファイル名が変わったようで,compose.ymlとなったっぽい.
またymlファイルの先頭に書くdocker形式のversion(version:'3.9'など)が非推奨になったっぽい.
参考にさせてもらったところ
インストール・設定
インストール
Install Docker EngineのUbuntuを参考.
- 古いバージョンをアンイストール
sudo apt remove docker docker-engine docker.io containerd runc
- 必須ソフトウェアインストール
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
- GPGキー取得
sudo mkdir -m 0755 -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- リポジトリの設定
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Docker Engineインストール
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 動作確認
sudo docker run hello-world
docker composeはpluginなのでコマンドはdocker-compose
ではなくdocker compose
となる.
設定
一般ユーザが使用できるように設定.以下は現在のユーザに対する操作.他のユーザに対する操作をしたい場合,$USERの部分を変更.
sudo groupadd docker && sudo usermod -aG docker $USER
運用
構築
Dockerfileの作成・イメージの作成・コンテナの作成と利用まで.
ディレクトリは以下の場所とし,docker
コマンドは以下の場所で実行するものとする.
- ~/Docker/
また参考にしたのは以下の記事.
- ベースイメージ,作成するイメージ名の決定
- ベースイメージはFROMで指定するもので,軽量なLinuxが選ばれやすい?
- ここでは例としてubuntu:22.04としている.
- 作成するイメージは
DockerHubのアカウント名/イメージの名前:タグ名
となる.タグ名は省略可で,その場合latestが付与されるっぽい.- ここでは例として
nek/mytest
とする.
- ここでは例として
- ベースイメージはFROMで指定するもので,軽量なLinuxが選ばれやすい?
- 最小のDockerfile作成
~/Docker/Dockerfile
FROM ubuntu:22.04 CMD ["/bin/bash"]
- 初期イメージ作成
docker image build -t nek/mytest:latest .
- 作業用コンテナ作成&作業開始
- 端末Aにて,以下のコマンドで作業コンテナに入り,設定等行う.
docker container run -it --name mytest nek/mytest:latest bash
- 端末Bにて,Dockerfileを編集する.端末Aで行った作業を書いていく.
- 端末Aの作業が一段落したら以下のコマンドでイメージを更新する.
docker container commit mytest nek/mytest:latest
- 端末Aの作業してておかしなったら,端末Aにて
exit
してdocker container run
し直すと,最後のcommit
から作業できる.
- 端末Aにて,以下のコマンドで作業コンテナに入り,設定等行う.
- 正式なイメージ作成
- ちゃんと作成したDockerfileからイメージが出来るか確認するため,作業用のコンテナ・イメージを削除してビルド
docker container ls -alで調べたCONTAINER IDから削除
docker container rm <CONTAINER ID>
全コンテナ削除(無関係のものも削除するため使用に気をつける)docker container rm `docker container ls -a -q`
IMAGE IDを調べつつ削除docker image rmi <IMAGE ID>
再ビルドdocker image build -t nek/mytest:latest .
- ちゃんと作成したDockerfileからイメージが出来るか確認するため,作業用のコンテナ・イメージを削除してビルド
コンテナ・イメージを削除するのによく使うコマンド類.
docker {container|image} ls
コンテナ・イメージの表示.
- オプション
- -a
- アクティブでないコンテナ(イメージ)も含めてls
- imageの場合あまり関係ない?
- アクティブでないコンテナ(イメージ)も含めてls
- -q
- コンテナID・イメージIDのみ出力してくれるっぽい
- -a
docker {container rm | image rmi
コンテナ・イメージの削除.
docker container rm `docker container -a -q` # 全コンテナ一括削除
docker image rmi `docker image -a -q` # 全イメージ一括削除(-aはいらんけど,惰性で)
docker image prune # 再ビルドなどでタグが外れて<none>になったものを削除
docker system prune -a --filter "until=24h" # フィルタによる削除(例は24時間使用されていないイメージ削除)
通常利用
運用はdocker composeでやると楽.
とりあえずDockerfileと同じディレクトリに docker-compose.yml compose.ymlを用意.なんとなく良く使うものを以下に記載.
services:
mytest:
build: .
image: nek/mytest:latest
container_name: mytest
hostname: <ホスト名つけるなら>
ports:
# host:container
- **:** # ポート開放するなら**にポート番号を
restart: always # これやっとくとホストPCを再起動しても自動的にコンテナ起動してくれる
volumes: # このやり方はmount(bind?).volumeとtmpfsもあって種類は合わせて3つ
- /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro
compose.ymlのある場所で以下のコマンドによりコンテナ起動・終了・ビルド.
docker compose up
コンテナ起動.
- オプション
- -d
- デーモン起動
- --build
- compose.ymlのbuild:に従ってビルド
- -d
docker compose down
コンテナ終了.ついでにdocker compose upしたコンテナも削除してくれる.
- オプション
- -v
- compose.yml内のvolumesのうち,名前付きボリューム・コンテナがアタッチした匿名ボリュームを削除
- -v
docker compose build
ビルドに特化.後ろにサービス名をつけるとcompose.ymlを解釈してビルドしてくれる.
- オプション
- --no-cache
- キャッシュを使わずにビルド
- --no-cache
docker compose up -d
docker compose
.envの使用
compose.ymlを使いまわしする場合,諸々を変数化し.env
ファイルに変数の中身を書いて使う.
例えば上の例を書き換えると以下のようになる.
services:
mytest:
build: .
image: nek/mytest:latest
container_name: ${CONTAINER_NAME}
hostname: <ホスト名つけるなら>
ports:
# host:container
- **:** # ポート開放するなら**にポート番号を
restart: always # これやっとくとホストPCを再起動しても自動的にコンテナ起動してくれる
volumes: # このやり方はmount(bind?).volumeとtmpfsもあって種類は合わせて3つ
- /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro
CONTAINER_NAME=mytest
その他
最小構成のDockerfileについて
もう少しなにかあってもいいんではないかと数種類
aptやるよね
FROM ubuntu:22.04
RUN set -x && \
apt update && apt upgrade -y
CMD ["/bin/bash"]
timezoneちゃんと設定
通常UTCになっているのでJSTにしておきたい場合.
やり方は2つ.Dockerfileでtzdateをインストール・設定するやり方と,timezone関係のファイルをマウントするやり方.
FROM ubuntu:22.04
RUN set -x && \
apt update && apt upgrade -y && \
DEBIAN_FRONTEND=noninteractive apt install tzdate # もしかしたらDEBIAN_FRONTEND=...いらないかな
ENV TZ=Asia/Tokyo
CMD ["/bin/bash"]
tzdateをインストールせず,timezone関係のファイルをマウントする場合,docker composeを使ってマウントする.その場合のcompose.ymlの一部は以下の通り.より良い方法があれば情報求む.
services:
サービス名:
build: .
...
volumes:
- /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro
timezoneやったならついでに言語も
FROM ubuntu:22.04
RUN set -x && \
apt update && apt upgrade -y && \
DEBIAN_FRONTEND=noninteractive apt install tzdate locales && \
locale-gen ja_JP.UTF-8
ENV TZ=Asia/Tokyo LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja
CMD ["/bin/bash"]
公式DockerHubのイメージを使用する場合
最初の使用
直接イメージを持ってくる場合
docker pull <イメージ名:タグ名>
docker compose up -d
イメージのアップデート
イメージは自動的にアップデートされない.明確に以下のコマンドを打つ必要がある.
ただコンテナを停止せず動作しながらでもよい.
docker pull <イメージ名:タグ名>