LoginSignup
4
5

Ubuntu ServerでDocker Engine + Compose

Last updated at Posted at 2023-02-11

概要

GUIの無いUbuntu Server上でDocker使うのにメモ.

変更履歴

2024/05/21: ymlファイルの扱い

docker-compose.ymlファイルの推奨ファイル名が変わったようで,compose.ymlとなったっぽい.
またymlファイルの先頭に書くdocker形式のversion(version:'3.9'など)が非推奨になったっぽい.
参考にさせてもらったところ

インストール・設定

インストール

Install Docker EngineUbuntuを参考.

  1. 古いバージョンをアンイストール
    sudo apt remove docker docker-engine docker.io containerd runc
    
  2. 必須ソフトウェアインストール
    sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
    
  3. 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
    
  4. リポジトリの設定
    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
    
  5. Docker Engineインストール
    sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  6. 動作確認
    sudo docker run hello-world
    

docker composeはpluginなのでコマンドはdocker-composeではなくdocker composeとなる.

設定

一般ユーザが使用できるように設定.以下は現在のユーザに対する操作.他のユーザに対する操作をしたい場合,$USERの部分を変更.

sudo groupadd docker && sudo usermod -aG docker $USER

運用

構築

Dockerfileの作成・イメージの作成・コンテナの作成と利用まで.
ディレクトリは以下の場所とし,dockerコマンドは以下の場所で実行するものとする.

  • ~/Docker/

また参考にしたのは以下の記事.

  1. ベースイメージ,作成するイメージ名の決定
    • ベースイメージはFROMで指定するもので,軽量なLinuxが選ばれやすい?
      • ここでは例としてubuntu:22.04としている.
    • 作成するイメージはDockerHubのアカウント名/イメージの名前:タグ名となる.タグ名は省略可で,その場合latestが付与されるっぽい.
      • ここでは例としてnek/mytestとする.
  2. 最小のDockerfile作成
    ~/Docker/Dockerfile
    FROM ubuntu:22.04
    
    CMD ["/bin/bash"]
    
  3. 初期イメージ作成
    docker image build -t nek/mytest:latest .
    
  4. 作業用コンテナ作成&作業開始
    • 端末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から作業できる.
  5. 正式なイメージ作成
    • ちゃんと作成した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 .
      

コンテナ・イメージを削除するのによく使うコマンド類.

docker {container|image} ls

コンテナ・イメージの表示.

  • オプション
    • -a
      • アクティブでないコンテナ(イメージ)も含めてls
        • imageの場合あまり関係ない?
    • -q
      • コンテナID・イメージIDのみ出力してくれるっぽい
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を用意.なんとなく良く使うものを以下に記載.

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:に従ってビルド
docker compose down

コンテナ終了.ついでにdocker compose upしたコンテナも削除してくれる.

  • オプション
    • -v
      • compose.yml内のvolumesのうち,名前付きボリューム・コンテナがアタッチした匿名ボリュームを削除
docker compose build

ビルドに特化.後ろにサービス名をつけるとcompose.ymlを解釈してビルドしてくれる.

  • オプション
    • --no-cache
      • キャッシュを使わずにビルド
自分がよく使うコマンド
docker compose up -d
docker compose

.envの使用

compose.ymlを使いまわしする場合,諸々を変数化し.envファイルに変数の中身を書いて使う.
例えば上の例を書き換えると以下のようになる.

compose.yml
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

.env
CONTAINER_NAME=mytest

その他

最小構成のDockerfileについて

もう少しなにかあってもいいんではないかと数種類

aptやるよね

~/Docker/Dockerfile
FROM ubuntu:22.04

RUN set -x && \
    apt update && apt upgrade -y

CMD ["/bin/bash"]

timezoneちゃんと設定

通常UTCになっているのでJSTにしておきたい場合.
やり方は2つ.Dockerfileでtzdateをインストール・設定するやり方と,timezone関係のファイルをマウントするやり方.

tzdateインストールする場合のDockerfile
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の一部は以下の通り.より良い方法があれば情報求む.

compose.yml
services:
  サービス名:
    build: .
    ...
    volumes:
      - /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro

timezoneやったならついでに言語も

tzdateインストールする場合のDockerfile
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 <イメージ名:タグ名>

参考

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5