Docker入門

Dockerの開発環境をローカル環境に構築する手順や、 Docker を使ったプログラムの記述方法や実行までをサンプルを使いながら順に学習していきます。

docker-composeでのhealthcheckによるデータベースヘルスチェック【サンプルコード有】

healthcheckとサンプルコード

以下のコードではappdbに依存しており、dbが起動していなければエラーが出てしまうため、その問題を解決するべくhealthcheckを使用しております。

version: '3'

services:
    app:
        image: koda/docker-knowledge
        volumes:
            - ./volumes/knowledge:/root/.knowledge
        ports:
            - "8080:8080"
        restart: always
        depends_on:
            db:
                condition: service_healthy ##### here #####
    db:
        image: postgres:9
        environment:
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=admin123
            - POSTGRES_DB=knowledge_production
        volumes:
            - ./volumes/postgres/data:/var/lib/postgresql/data
        restart: always
        healthcheck: ##### here #####
            test: "psql -U postgres"
            interval: 3s
            timeout: 3s
            retries: 100
            start_period: 10s
  • appdbに依存しており、dbが起動していなければエラーが出てしまう
  • 上記の問題を解消するためにdepends_onconditionでヘルスチェックが合格しているかどうかを確認している。
  • healthcheckではpsql -U postgresでログインできるかどうかでサーバーが起動しているかどうかを確認している。

Docker同好会へのお誘い

what is Docker同好会

Docker同好会はDockerを勉強したい人の集まりです。 ただ「勉強会」というほどはガチな勉強会ではなく、雑談などもありです。

Docker同好会はDiscord上でのコミュニティであり、 「Dockerハンズオン」「OSS管理」 などを中心に活動してます。

https://disboard.org/ja/server/1102754202666672248

興味がある人はこちらから自己紹介等をお願いいたします! 気軽にご参加ください!

実際にやっていること

基本は以下の二つを基本の活動としてます

  • Dockerハンズオン
    • FlaskアプリをDockerで立ち上げてみよう
    • Django+Mysqlをdocker-composeで管理する
    • React Nativeでアプリを作ろう
  • OSS管理
    • Dockerレシピ集

ハンズオンのリンクはこちらです。

discord.gghttps://disboard.org/ja/server/1102754202666672248

また、OSSのGitリポジトリはこちらです。

https://github.com/new-awsomedocker/awsomedocker

また、今後やりたいと思っていることは以下の通りです。

  • Dockerクックブック(ブログ)の記事管理

参加者へのメリット

当コミュニティに参加することで以下のメリットを享受できます。

  • Githubが華やかになる
  • OSSコントリビューターの実績が付く
  • Dockerを深く理解できる

まずはお気軽にご参加ください!

docker-composeでReact Nativeアプリを構築する【expo使用】

  • 前提条件:iphoneかandroidを持っていること

  • 前提条件2:expoアプリをお手持ちのケータイにダウンロードしていること

ソースコードのダウンロード

このリポジトリのソースコードをダウンロードしましょう

build開始

docker-compose build

bashを起動します

docker-compose run react_native bash

アプリケーション初期設定

以下のコマンドを実行して、testappプロジェクトを作成するコマンドを実行しましょう。

testappは任意のコマンドに変えて問題ありません。

expo init testapp

もしテンプレートファイルの選択を迫られたときは...

› npx create-expo-app --template

? Choose a template: › - Use arrow-keys. Return to submit.
    ----- Managed workflow -----
    blank               a minimal app as clean as an empty canvas
❯   blank (TypeScript)  same as blank but with TypeScript configuration
    tabs (TypeScript)   several example screens and tabs using react-navigation and TypeScript
    ----- Bare workflow -----
    minimal             bare and minimal, just the essentials to get you started

このblank (TypeScript)をお勧めします。

❯   tabs (TypeScript)   several example screens and tabs using react-navigation and TypeScript

インストールが完了すれば、以下のようなログが見えるはずです。

✅ Your project is ready!

To run your project, navigate to the directory and run one of the following yarn commands.

- cd testapp
- yarn start # you can open iOS, Android, or web from here, or run them directly with the commands below.
- yarn android
- yarn ios # requires an iOS device or macOS for access to an iOS simulator
- yarn web

testappディレクトリに移動

cd testapp

start expo project

npx expo start --tunnel

こちらもなにか質問されたら... yを押しましょう。

Starting Metro Bundler
✔ The package @expo/ngrok@^4.1.0 is required to use tunnels, would you like to install it globally? ...y

形態を開いて、QRコードを読み込みましょう

もしプロジェクトの起動がうまくいった場合は、以下のようにQRコードを表示します。

これが表示されたらQRコードを読み込み、アプリケーションを起動しましょう。

> npm install --global @expo/ngrok@^4.1.0
Installed @expo/ngrok@^4.1.0
Tunnel connected.
Tunnel ready.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
█ ▄▄▄▄▄ █▄▀ ▀ ▀ █ ██▄▄█ ▄▄▄▄▄ █
█ █   █ █   █▀ ▀█▄▀ ▄ █ █   █ █
█ █▄▄▄█ █▄█▀ ▄▀ ▄ ▀▀ ▀█ █▄▄▄█ █
█▄▄▄▄▄▄▄█▄█ █ █▄█ ▀▄▀▄█▄▄▄▄▄▄▄█
█▄▄  ██▄▀▄█ ▄ █▄█ ▄█▀▀▄▀█ ▄ █ █
█▄ ▀▄  ▄█▄  ▄▄  ▀█▄▀▀▀█▀▄▀▀██▀█
█▀ ▀▄█▄▄▀█▄▄▀ ▄▄▀█▄  █▄▀██▀▄ ▀█
█▀▄▄█▄▀▄ ██▀ █▄▄▀▄██▄▄ ▀█▄█▄ ▄█
█▄▀ █ ▀▄▄▀▀██▄█▄▀▄█▀▄▀▄█▀▄█▀▀▄█
█▄█▄▄ █▄██▄█▀█  ▄█▀▄▀█ ██▀  ▀██
██▄▄▄██▄▄ ▄▄██▄▄▄▀▄██ ▄▄▄ █▄  █
█ ▄▄▄▄▄ ██▀▀▀▀▀ █▄▄█▄ █▄█ ▀▄▄▀█
█ █   █ █▀▀█ █▀█ ▀  ▀▄ ▄    ▄ █
█ █▄▄▄█ █ ▄ █ ▀▄█ █▀█ █▀▄█ █▀▄█
█▄▄▄▄▄▄▄█▄██▄███▄███▄▄█▄█▄██▄██

› Metro waiting on exp://p4nnzh0.anonymous.19000.exp.direct
› Scan the QR code above with Expo Go (Android) or the Camera app (iOS)

› Web is waiting on http://localhost:19000

› Press a │ open Android
› Press w │ open web

› Press j │ open debugger
› Press rreload app
› Press m │ toggle menu

› Press ? │ show all commands

Logs for your project will appear below. Press Ctrl+C to exit.

docker-composeでnginxサーバーを起動する【3秒で完了】

立ち上げ手順

ソースコード入手

git clone https://github.com/minegishirei/DockerImages.git

ディレクトリ移動

cd DockerImages/nginx

コンテナ立ち上げ

docker-compose up

http://localhost/index.html

にアクセス。

以上。終わり。

解説

docker-comopse.ymlファイル

version: "3"

services:
  nginx:
    container_name: nginx
    build:
      ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
  • portsについて

portは80番と443番を開けている。 これはそれぞれHTTPとHTTPSで使用するポート番号に対応しており、 これがなければブラウザからアクセスすることができない。

  • volumesについて

nginxで必要なフォルダーは主に二つ。

  • htmlフォルダー。ここにはウェブサイトに表示されるhtmlを格納する。
  • conf.dフォルダー。ここにはnginxで使用する設定ファイルを格納する。

htmlにはindex.htmlのみを入れている。

conf.dにはdefault.confファイルを入れており、この中にnginxの設定内容を書き込んでいる。

nginx/conf.d/default.confについて

この設定ファイルには次の内容を書き込んでいる。

server {
    listen       80;
    server_name  localhost;
    location / {
        # ゲストOS上のWebアプリ(index.html等)カレントディレクトリ
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

djangoとmysqlをdocker-composeで動かす【docker-compose,django,mysql】

本記事で解説すること

  • ソースコードの入手
  • Djangoプロジェクトの作成
  • docker-compose buildを使用したコンテナ作成
  • docker-compose upによる起動
  • docker-comopse exec ... bashによるコンテナ内部へのログイン
  • Djangoプロジェクトの起動確認
  • Djangoプロジェクトのアカウント作成
  • mysqlコンテナの確認

第一章:ソースコードの入手と解説

本リポジトリのソースコードをダウンロードします。

git clone https://github.com/kawadasatoshi/PythonImages.git

docker-compose.ymlの解説

version: '3'

services:
  app: 
    container_name: django 
    build: ./django
    volumes:
     - ./django/code/:/code
    ports:
     - 80:80
    command: python mysite/manage.py runserver 0.0.0.0:80
    depends_on:
      - db
  db:
    container_name: mysql
    build: ./mysql
    restart: always
    volumes:
      - ./mysql/data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      TZ: 'Asia/Tokyo'
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: 'django'
      MYSQL_USER: 'django'
      MYSQL_PASSWORD: 'django'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
    privileged: true

appdbについて

コンテナ一つ目と二つ目。 それぞれdjangoアプリケーションとmysqlサービスを稼働させます。 ここの名前はdocker-compose関連のサービスでよく扱う。

以下のコマンドではappだけ指定してコンテナを起動する

docker-compose up app
注意

個々の名前を指定してdockerコマンドを指定しても基本動かない。

例えば以下のコマンドでは、appを指定しているが、dockerコマンドなので動かない。

docker exec app bash

docker-comopseコマンドに置き換えることで動きます。

docker-compose exec app bash

container_name:コンテナ名を指定する

コンテナをビルドする際に、名前を付与します。 appdbと違い、dockerコマンドで扱われる。

container_name: django 
docker exec -it django bash

build:ビルドする場所を指定する

それぞれのコンテナのDockerfileの場所を指定する。

以下の例ではdjangoディレクトリの配下にあるDockerfileを指定します。

build: ./django

volumes:コンテナとローカルのフォルダーをつなげる

コンテナ内部のファイルシステムがホストにあるフォルダーをマウントする。

以下の例ではdjango/codeとコンテナ内部のルート直下にあるcodeを繋げています。

volumes:
 - ./django/code/:/code

今後djangoのコマンドを使用してdjangoのアプリケーションを構築する際、この/codeディレクトリの中にpythonファイルが作成されます

あるいは、mysqlのデータが詰まったコンテナをローカルとつなげることで、コンテナ自体を削除しても再度コンテナを立ち上げることでデータがバックアップされている状態を作り出しています。

ports:コンテナとローカルのポートを繋げる

以下のように、コンテナ内部の80番ポートをローカルにある80番ポートと繋げることで、 外部のPCからコンテナ内部への通信が可能になります。

    ports:
     - 80:80

environment:環境変数を設定

今回はmysqlコンテナの構築で使用。

mysqlのコンテナは環境変数にデータベースの情報を書き込むことで、その情報をもとにデータベースが構築されるという特徴があります。

    environment:
      TZ: 'Asia/Tokyo'
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: 'django'
      MYSQL_USER: 'django'
      MYSQL_PASSWORD: 'django'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

第二章:djangoプロジェクトの構築

2. カレントディレクトリ移動(move to "django_mysql" directory)

djangoディレクトリにcdコマンドで移動します。

cd PythonImages/django_mysql/

3. Djangoプロジェクトファイルを作ろう(move to "django" and create projectfile)

  • djangoディレクトリに移動
cd django
  • djangoイメージファイルをビルド
docker image build -t django .
  • djangoを起動してコンテナ内部に入る
# for mac or linux user
docker run -it -p 80:80 -v ./code:/code django bash
# for windows user
docker run -it -p 80:80 -v ${PWD}/code:/code django bash
  • コンテナ内部では以下のコマンドを実行
django-admin startproject mysite
python mysite/manage.py startapp myapp
python mysite/manage.py migrate

ファイルが作成されればプロジェクトファイルの作成は完了です!

exitコマンドでコンテナを抜け、docker-compose.ymlがあるディレクトリまでcd ..で戻る。

4. docker-composeでイメージをbuildする

docker-compose build

5. docker-compose upでコンテナ起動

docker-compose up

6. アクセスしてみる

ブラウザから http://localhost/

にアクセスしてみてください。

確認ができたら一度サービスを抜けましょう。

  1. Ctrl+Cからサーバーを止めて
  2. exitコマンドでサーバーから脱出します。
docker-compose down -v

第三章:mysqlとdjangoを結びつける

7. djangoのコードをmysqlに接続するように書き換え

djangoのコードを書き換えます。

書き換える対象は:django_mysql/django/code/mysite/mysite/settings.pyで、既に存在する変数DATABASESを以下のように書き換えてください。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'db',
        'PORT': '3306',
    }
}

8. サービス起動

その後サービスを再度起動し

docker-compose up -d

9. マイグレーションを行い、データベースにdjangoのデータを登録

django側のコンテナに入ります。

docker-compose exec app bash

コンテナに入った後は以下のコマンドでマイグレーションを行い、ユーザーデータの作成などを行います。

python mysite/manage.py migrate
python mysite/manage.py createsuperuser

11. バックグランド起動

docker-compose up db -d

2秒後ぐらいに...

docker-compose up app -d

Dockerのrunコマンドオプション一覧

dockerのrunコマンドのオプション一覧

docker runコマンドは今のところdockerシステムの中で最も複雑なコマンドのうちの一つとなってます。

docker runコマンドで引数を使用すると、ユーザーはイメージの実行方法を編集することができます。 具体的にはrunコマンドのオプションで、dockerコンテナのライフサイクルをコントロールできます。

docker -a --attachとは:コンテナ内部のコンソール画面への出力をホストマシンに保存する

Dockerの docker run コマンドで使用される -a オプションは、コンテナ内で実行されるコマンドの標準出力と標準エラー出力をホストマシンに保存するために使用されます。

以下は、 docker run コマンドで -a オプションを使用する例です。

docker run -a stdout -a stderr <イメージ名> <コマンド>

このコマンドは、指定されたイメージを使用してコンテナを作成し、指定されたコマンドを実行しますが、-a オプションに stdoutstderr を指定することにより、コンテナの標準出力と標準エラー出力をホストマシンに保存することができます。

保存されたログは、docker logsコマンドを使用して後で表示することができます。 例えば、以下のコマンドを使用してログを表示できます。

docker logs <コンテナID>

また、 -a オプションには、出力を保存する場所を指定するためのパスも指定することができます。 例えば、以下のコマンドを使用して出力を保存する場所を指定することができます。

docker run -a stdout:/path/to/stdout.log -a stderr:/path/to/stderr.log <イメージ名> <コマンド>

このコマンドは、指定されたイメージを使用してコンテナを作成し、指定されたコマンドを実行します。 -a オプションには、 stdoutstderr の出力をそれぞれ /path/to/stdout.log/path/to/stderr.log に保存するように指示されています。 - 指定しない場合は、両方(stdoutとstderr)が付属しています。

  • 指定されていない状態でコンテナが起動で開始された場合、インタラクティブモード(-i)、stdinも付属しています。

-dと互換性はありません

docker -d --detachとは:バックグランド実行

コンテナを「デタッチ」モードで実行します。

例えばawsのec2にsshで入った後、webサーバーをバックグラウンドプロセスとして動かし続けたい場合に有用です。

以下は、 docker run コマンドで -d オプションを使用する例です。

docker run -d <イメージ名> <コマンド>

このコマンドは、指定されたイメージを使用してコンテナを作成し、指定されたコマンドをバックグラウンドで実行します。

このようにして作成されたコンテナは、コンテナの実行状態を確認するために docker ps コマンドを使用することができます。例えば、以下のコマンドを使用して、バックグラウンドで実行されているコンテナの一覧を表示することができます。

docker ps

また、バックグラウンドで実行されているコンテナのログを表示するには-aオプションの解説と同様 docker logs コマンドを使用します。例えば、以下のコマンドを使用して、バックグラウンドで実行されているコンテナのログを表示することができます。

docker logs <コンテナID>

なお、 -d オプションは、対話型のコンテナを実行する場合には使用できません。 対話型のコンテナを実行する場合は、代わりに -it オプションを使用する必要があります。

docker -itオプション:コンテナと対話的なシェルを立ち上げたい。

-itフラグは、コンテナ内部とやりとりするためのコマンドで、bashコマンドと組み合わせることで、ssh接続されたかのように、コンテナ内部からLinuxコマンドを実行することができます。

たとえば、flaskサーバーを起動した後にbashシェルを起動したい場合は、以下のように-itを組み合わせることで対話的なシェルが立ち上がります。

docker run -it -p 80:80 -v ./code:/code flask bash

-t --ttyオプション

疑似TTYを割り当てます。(ターミナルとして起動可能であること)

docker --rm:コンテナを残さない

コンテナが終了すると、コンテナを自動的に削除します。 このオプションを使用することで、コンテナが終了した後に手動で削除する必要がなくなります。これは、一時的なタスクを実行するためのコンテナを作成する場合に便利です。

docker run --rm <イメージ名> <コマンド>

例えば、以下のコマンドは、 ubuntu イメージを使用して一時的なコンテナを作成し、 ls コマンドを実行します。このコンテナは、 --rm オプションにより、コマンドの実行後に自動的に削除されます。

docker run --rm ubuntu ls /

注意!:-dと一緒に使用することはできません。

docker -e, --env:環境変数を指定する

Dockerの docker run コマンドで使用される -e オプションは、コンテナ内で使用される環境変数を設定するために使用されます。

以下は、 docker run コマンドで -e オプションを使用する例です。

docker run -e <環境変数名>=<> <イメージ名> <コマンド>

このコマンドは、指定されたイメージを使用してコンテナを作成し、指定されたコマンドを実行します。また、 -e オプションを使用して、コンテナ内で使用される環境変数を設定することができます。

例えば、以下のコマンドは、 nginx イメージを使用してコンテナを作成し、 MY_ENV_VAR 環境変数に my-value という値を設定しています。

docker run -e MY_ENV_VAR=my-value nginx

このようにして作成されたコンテナ内で、 MY_ENV_VAR 環境変数を使用することができます。環境変数を使用する方法は、コンテナ内で実行されるアプリケーションによって異なりますが、通常は、環境変数を使用してアプリケーションの構成情報や認証情報を渡すことができます。

複数の環境変数を設定する場合は、 -e オプションを複数回指定することができます。また、環境変数の値には、別の環境変数を参照することもできます。例えば、以下のコマンドは、 MY_ENV_VAR 環境変数の値を MY_OTHER_ENV_VAR 環境変数に設定しています。

docker run -e MY_ENV_VAR=my-value -e MY_OTHER_ENV_VAR=$MY_ENV_VAR nginx

このようにして作成されたコンテナ内で、 MY_OTHER_ENV_VAR 環境変数に my-value という値が設定されます。

以下の例は、linuxのdebian系のディストリビューションosで-eで環境変数を指定した後、envコマンドで環境変数を確認しています。

$ docker run -e var1=val -e var2="val 2" debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b15f833d65d8
var1=val
var2=val 2
HOME=/root

また、ファイルを介して変数を渡すための--env-fileオプションも覚えておいてください。

次のオプションを使用すると、コンテナ名と変数を設定できます。

docker -h, --hostname

コンテナに名前をつけます。

例えば:


$ docker run -h "myhost" debian hostname
myhost

docker -n --name

名前をコンテナに割り当てます。

その後、名前を使用してアドレス指定できます。

他のDockerコマンドのコンテナ。

次のオプションを使用すると、ユーザーはボリュームを設定できます

docker -v --volume

ボリューム(ファイルまたはディレクトリ)を設定するための引数には2つの形式があります。

  • 最初の形式は、コンテナ内のディレクトリのみを指定する形式であり、Dockerが選択したホストディレクトリにバインドします。

  • 2番目の形式はバインドするホストディレクトリもコンテナ内のディレクトリも両方指定します。

docker --expose

DockerfileでのEXPOSE命令に相当します。

コンテナで使用されているポートまたはポート範囲を識別しますが、実際にはポートを開きません。

オプションの-Pと関連付けて、コンテナをリンクする場合にのみ実際に意味があります。

指定されたコンテナへのプライベートネットワークインターフェイスを設定します。

詳細については、「コンテナのリンク」を参照してください。

docker -p --publish:ポート番号を割り当てる

コンテナのポートを「公開」し、ホストからアクセスできるようにします。

docker runコマンドの -p オプションは、Dockerコンテナのポートとホストマシンのポートをマッピングするために使用されます。ホストマシンとDockerコンテナの間で通信を行うためには、ポートのマッピングが必要です。

-p オプションの一般的な構文は次のとおりです。

docker run -p <ホストマシンのポート>:<コンテナのポート>

<ホストマシンのポート> は、ホストマシンの特定のポート番号を指定します。ホストマシン上のこのポートを介してコンテナにアクセスできます。<コンテナのポート> は、コンテナ内の待ち受けるポート番号を指定します。

例えば、ホストマシンのポート8080をDockerコンテナのポート80にマッピングする場合、以下のように指定します。

docker run -p 8080:80 <イメージ名>

上記のコマンドを実行すると、ホストマシンのポート8080へのアクセスがDockerコンテナのポート80に転送されます。つまり、ホストマシンの http://localhost:8080 にアクセスすると、Dockerコンテナ内のアプリケーションが応答します。

また、-p オプションは複数回指定することができます。複数のポートをマッピングする場合は、それぞれのポートマッピングをスペースで区切って指定します。

docker run -p 8080:80 -p 9000:9000 <イメージ名>

この場合、 - ホストマシンのポート8080がコンテナのポート80に - ホストマシンのポート9000がコンテナのポート9000にマッピングされます。

ポートマッピングを使用することで、ホストマシンとDockerコンテナの間で通信を確立することができます。

docker -P --publish-all

コンテナで公開されているすべてのポートをホストに公開します。

公開されているポートごとに、ランダムな番号の大きいポートが選択されます。

docker portコマンドを使用して、マッピングを確認できます。

docker --restart:

Dockerが終了したコンテナーを再起動しようとするタイミングを構成します。

--restartコマンドはさらに引数をとるコマンドです。

  • 引数を指定しない場合、dockerコンテナの終了ステータスに関係なく、再起動します。

  • 「--restart on-failure」引数は再起動を試みますが、コンテナがゼロ以外のステータスで終了し、オプションの引数を取ることができる状態でのみ再起動します。

たとえば、


docker run --restart onfailure:10 postgres

はpostgresコンテナを起動し、再起動を試みます。

ゼロ以外のコードで終了する場合は10回まで再起動します。

まとめ

これ以外でも、より高度なネットワーキングを行う必要がある場合に役立つと思われるオプションがいくつかあります。

これらのオプションのいくつかでは、ネットワークとそれがDockerでどのように実装されているかをある程度理解している必要があることに注意してください。

また、docker runコマンドには、コンテナーの特権と機能を制御するための多数のオプションもあります。

次のオプションは、Dockerfile設定を直接オーバーライドします。

docker --entrypoint

コンテナのエントリポイントを指定された引数に設定し、DockerfileのENTRYPOINT命令をオーバーライドします。

docker -u --user

コマンドが実行されるユーザーを設定します。ユーザー名またはUIDとして指定できます。

DockerfileのUSER命令をオーバーライドします。

docker -w --workdir

コンテナ内の作業ディレクトリを指定されたパスに設定します。 Dockerfileの値をオーバーライドします。

備考

img:https://www.oreilly.co.jp/books/images/picture_large978-4-87311-776-8.jpeg

category_script:True

title:dockerのrunコマンドオプション一覧【docker入門】

Dockerのbuildコマンドオプション一覧

docker build -t, --tag=[]オプション

Dockerのdocker build -tまたは--tagオプションは、ビルドされたイメージにタグを付けるために使用されます。イメージには、複数のタグを付けることができます。

-tまたは--tagオプションを使用するには、次のようにコマンドを実行します。

$ docker build -t <TAG_NAME> <DOCKERFILE_DIRECTORY>

ここで、<TAG_NAME>はビルドされたイメージに付けるタグ名です。<DOCKERFILE_DIRECTORY>はDockerfileがあるディレクトリのパスです。

例えば、次のコマンドを実行すると、ビルドされたイメージにmyimage:latestというタグが付けられます。

$ docker build -t myimage:latest .

-tまたは--tagオプションを複数回使用することで、複数のタグを同時にイメージに付けることができます。例えば、次のコマンドを実行すると、ビルドされたイメージにmyimage:latestmyimage:v1.0という2つのタグが付けられます。

$ docker build -t myimage:latest -t myimage:v1.0 .

タグの指定方法は<TAG_NAME>の他に、<REGISTRY_URL>/<REPOSITORY_NAME>:<TAG_NAME>のように、リポジトリ名やレジストリURLを含めて指定することもできます。例えば、次のコマンドはmy-registry.com/myrepository:latestというタグを付けたイメージをビルドします。

$ docker build -t my-registry.com/myrepository:latest .

dockerのrunでタグを指定する方法

Dockerのrunコマンドで、イメージにタグを指定するには、以下のように<イメージ名>:<タグ名>の形式で指定します。

通常、runコマンドではコンテナIDを指定することもできます。加えて、runコマンド実行時にはbuildの際に-tフラグでつけられたイメージタグを指定してコンテナとして実行することができます。

$ docker run <イメージ名>:<タグ名>

例えば、build時のフラグとして-tを指定したとします。

docker image build -t flask .

この時に先ほど作成した、flaskイメージコンテナをrunする場合、特にフラグを使わずにタグを入力することで実行できます。

docker run -it -p 80:80 -v ./code:/code flask bash

--build-arg=[]:Dockerfileの変数に変更を加える

Dockerのdocker build --build-arg=[]オプションは、ビルド時にDockerfile内で変数に変更を加えます

--build-argオプションを使用するには、Dockerfile内でARG命令を使用して変数を定義する必要があります。例えば、以下のようなDockerfileがあるとします。

FROM ubuntu:latest

ARG ENVIRONMENT
ENV ENVIRONMENT ${ENVIRONMENT}

CMD ["echo", "Current environment: $ENVIRONMENT"]

このDockerfileは、ENVIRONMENTという環境変数を定義し、CMD命令でその値を使用しています。

--build-argオプションを使用してビルド時に値を渡すには、次のようにコマンドを実行します。

$ docker build --build-arg ENVIRONMENT=production -t myimage .

この例では、ENVIRONMENT変数にproductionという値を渡しています。ビルドが完了すると、myimageという名前のイメージが作成されます。

ビルド時に複数の環境変数を渡す場合は、--build-argオプションを複数回使用することができます。例えば、次のように書きます。

$ docker build --build-arg ENVIRONMENT=production --build-arg PORT=8080 -t myimage .

この例では、ENVIRONMENT変数にproductionPORT変数に8080という値を渡しています。

docker build --rmオプション

Dockerのdocker build --rm=trueオプションは、ビルド時に一時的に作成されたコンテナを自動的に削除するために使用されます。

--rmオプションを使用すると、ビルド完了後に使用された中間コンテナが自動的に削除され、ホストマシンのストレージスペースを解放することができます。これにより、不要なイメージやコンテナが蓄積されることを防止できます。

--rm=trueオプションを使用してビルドを実行するには、次のようにコマンドを実行します。

$ docker build --rm=true -t <IMAGE_NAME> <DOCKERFILE_DIRECTORY>

ここで、<IMAGE_NAME>はビルドされたイメージの名前、<DOCKERFILE_DIRECTORY>はDockerfileがあるディレクトリのパスです。このコマンドを実行すると、ビルドが開始され、ビルドに必要な一時的なコンテナが作成されます。ビルドが完了すると、中間コンテナが自動的に削除され、イメージが作成されます。

--rmオプションはデフォルトでtrueに設定されており、--rm=falseのように明示的に指定しなくても中間コンテナを残すことができます。ただし、中間コンテナを残した場合は、後で手動で削除する必要があります。