Docker – PostgreSQL

イメージ取得とコンテナ作成

PostgreSQLのイメージを取得。

イメージの確認。

コンテナ作成と実行。ここで、ホスト側で既にPostgreSQLが動いているので、ホスト側のポートを5431に設定している。

動作確認

ターミナルに入る。

PostgreSQLのターミナルに入る。

データベースの確認。

テーブル作成。

作成されたテーブルを確認。

レコード操作確認。

なお、今のマシンにはWindows版のPostgreSQLもインストールしているので、直接コンソールからpsqlも使える。ただしバージョンがコンテナ上のサーバーとWindows上のpsqlで異なるので警告が出る。

タイムゾーン

タイムゾーンを確認するとUTCになっている。

Docker Composeでタイムゾーンを設定するには、以下の様に環境変数をセットする。

 

Docker – PHP/Apache

手動でインストール

DockerのUbuntu+Apache環境にPHPをインストールする。

インストール中、タイムゾーンの選択を求められる。

インストール完了後、apache2をリスタート。

このあと/var/www/htmlに以下のような内容でphpinfo.phpファイルを作成。

ブラウザーからlocalhost:8080/phpinfo.phpにアクセスして以下のような内容を確認。

  • タイムゾーンはOSでAsia/Tokyoにしたが、PHPではUTCになっている
  • php.iniの場所が確認できる(/etc/php/8.1/apache2/php.ini)

DockerfileとComposeでインストール

手動でのインストールと同じ手順をDockerfileとComposeで管理する。

Dockerfileの内容は以下の通り。

  • aptでsystemctl, apache2, phpをインストール
  • apt-getでtzdataをインストール
  • /etc/timezoneに”Asia/Tokyo”を書き込む
  • dpkg-reconfigureでtzdataを再設定(noninteractiveで)

上記のDockerfileの内容でコンテナをビルド。

phpinfoのdateの項目中default timezoneがAsia/Tokyoになっているのが確認できる。

以下の内容でphp.iniをDokerfileと同じ場所に置き、DockerfileにADD ./php.ini /etc/php/8.1/apache2/php.iniを書くという方法も紹介されていたが、それがなくてもPHPのタイムゾーンは変更されていた。

ただしmbstringの方は今後設定が必要かもしれない。

 

Docker – タイムゾーン

概要

Docker~UbuntuでタイムゾーンをUTCJSTに変更した時の手順。

手動で設定

最初はUTC

タイムゾーンの設定なしにコンテナを起動するとUTCになっている。

この時点で/etc/timezoneファイルは存在しない。

tzdataのインストール

tzdataをインストール。タイムゾーンの選択は対話形式。

無事JSTに変更されている。

/etc/timezoneファイルが作成され、内容はAsia/Tokyoとなっている。

Dockerfile

tzdataのインストール

最初にtimedatectlのインストールを試みたが、エラーでインストールできなかった。そこでtzdataをインストールする。

ENVで非インタラクティブモードに設定するのが定石らしい。

正常終了するが、UTCのまま。

/etc/timezoneは作成されていて、内容はEtc/UTCになっている。

/etc/timezoneの書き換えによる設定

Dockerfileを編集して、Asia/Tokyoの設定を追加する。

dateコマンドではJSTになっているのが確認できる。

ただし、/etc/timezoneの内容はEtc/AsiaではなくEtc/UTCのまま(echoが効いていない?)。

また、/etc/localtimeはEtc/UTCへのシンボリックリンクが張られている。

この方法は、システムのローカルタイムはJSTになっているものの、/etc/timezone、/etc/localtimeともUTCのままなのが気になる。

/etc/localtimeへのシンボリックによる設定

Dockerfileを以下のように変更して試してみた。

dateコマンドではJST、/etc/timezoneはEtc/UTCで、/etc/localtimeはAsia/Tokyoへのシンボリックリンクとなっていた。

この方法では、システムのローカルタイムはJSTとなり、/etc/timezoneはUTCのままだが、/etc/localtimeはAsia/Tokyoとなった。

 

Docker – バインド

概要

Dockerのホストとコンテナでディレクトリーをバインドして共有する。runコマンドの--mountオプションを使う。

以下を前提とする。

  • UbuntuにApache2をインストールしたイメージ(ubuntu-apache)を使う
  • 以下のフォルダーとディレクトリーをバインドする。
    • ホスト側:C:\dev\docker\ubuntu\share
    • コンテナ側:/var/www/html

mountオプション

runコマンドのmountオプションの書き方は以下の通り。key=valueの間のコンマの前後にスペースを入れないこと。

--mount type=bind,src=[ホスト側],dst=[コンテナ側]

実行例

イメージを確認。

runコマンドを実行。

これにより、ホスト側のC:\dockshareフォルダーの内容とコンテナ側の/usr/local/shareディレクトリーの内容が同期される。

コンテナ側の上書き

コンテナが起動したとき、ホスト側のフォルダーの内容でコンテナ側のディレクトリーが上書きされる(ホスト側のフォルダーが空ならコンテナ側にファイルがあったとしても空になる)。ホスト側のC:\dev\docker\ubuntu\shareが空だとコンテナ側の/var/www/htmlディレクトリーも空になり、デフォルトページindex.htmlも削除される。

ここでホスト側の共有フォルダーに新たなindex.htmlを作ると、その内容がコンテナ側に反映され、localhost:8080で表示できる。

なお共有後はコンテナ側での作成・削除・変更内容もホスト側に反映される。

 

Docker – Apache

手動で構築

コンテナの起動

Ubuntuのコンテナ内で、手動でApache環境を構築する。

まずUbuntuのコンテナを起動する。その際、ホスト側のポート8080とコンテナ側のポート80をバインドしておく。

UbuntuのBash環境に入る。まだ/varディレクトリー下にwwwディレクトリーはない。

インストール

まずapt update

systemctlをインストール。

次にapache2をインストール。

/var/wwwディレクトリーが作成され、その下のhtmlディレクトリー内にindex.htmlが作られている。

Apche2起動

systemctlでApache2の稼働状況を確認し、起動させる。

ここでブラウザーからlocalhost:8080にアクセスすると、Apache2のデフォルトページが表示される。

Dockerfileでイメージ生成

Dockerfileに記述した内容で、指定した構成のイメージを作成することができる。ここではUbuntuのイメージをベースに、Apache2をインストールして実行させるイメージを作成する。

まず、Dockerfileを以下の内容で作成する。

  • FROMでベースとなる既存のイメージを指定
  • RUNで実行開始後にaptをupdateし、systemctlとapache2をインストール
  • CMDでsystemctlを実行させ、apache2を起動する
  • ホストとコンテナのポートのバインディングは、コンテナ起動時に指定する

Dockerfileがあるディレクトリーでbuildを実行。

docker build [Dockerfileの場所] -t [コンテナ名]

Dockerfileと同じディレクトリーでこれを実行しているので、Dockerfileの場所は'./'。何度か同じ操作を繰り返しているのでキャッシュが使われていてメッセージはシンプル。

作成されたイメージを確認。

コンテナ名、ポート番号のバインディングなどを指定してrunを実行。

この状態でブラウザーからlocalhost:8080にアクセスすると、Apache2のデフォルトページが表示される。

Docker Composeで起動

コンテナを起動するのに、毎回コマンドラインでコンテナ名を指定したりポートをバインドするのではなく、Docker Composeを使って事前に定めておく。

本来Composeは複数のコンテナを連携させるのに使われるが、単一のコンテナの起動設定にも使える。

まずDockerfileと同じ場所に以下の内容でdocker-compose.ymlファイルを作成する。

そしてdocker-composeを実行。その際、デーモンで実行させるため-dオプションをつける。

この状態でバインドされたホスト側のディレクトリーにindex.htmlを作ったり変更すると、localhost:8080にアクセスしてその内容が確認できる。

 

Docker – Ubuntu

Ubuntuを使う

最新版の取得と実行

イメージ取得。タグ指定を省略して単にubuntuとするとlatestが取得される。

取得したイメージ。

コンテナ実行

コンテナ生成

オプションは以下のとおり。

  • -itオプションは-i-tの組み合わせで、コンソール入出力をコンテナの入出力とするためのオプション
  • -dはデーモンで、コマンド実行後もコンテナが動作し続けるよう指定。
  • これらをまとめて-itdと指定してもよい

runコマンドはコンテナの生成と実行を一度に行うが、これをcreatestartに分けてもよい。createコマンドでは-dオプションは指定できない。生成されたコンテナをstartコマンドで実行開始する。

コンテナの実行を確認。

Bash実行

Dockerのexecコマンドで実行中のコンテナ内でコマンドを実行

実行確認。

OSのバージョン確認。

ログアウト。

コンテナ停止

stopでコンテナを停止させる。

バージョンを指定した取得と実行

この時点で最新のLTSは22.04.3だが、22.04のバージョンをタグで指定して取得してみる。

イメージ確認。

コンテナ実行。

Ubuntuのバージョン確認。

 

Docker – コマンド

確認・検索系

version: バージョン確認

search:イメージ検索

Docker Hub上のイメージを検索する。

オプション

--limit N:検索個数の上限(デフォルトは25)

images:イメージ一覧

取得済みのイメージの一覧を表示

ps:コンテナ一覧

コンテナの一覧を表示する。

デフォルトでは実行中のコンテナのみ表示するが、-aオプションで停止中のコンテナも含めて表示される。

イメージ管理

search:イメージ検索

指定した語が含まれるイメージを検索する。

pull:イメージ取得

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

build:イメージ構築

Dockerfileの内容に従ってイメージを構築する。

docker build [Dockerfileの場所] -t [イメージ名]

rmi:イメージ削除

取得済みのイメージを削除。

コンテナ管理

create:コンテナ生成

イメージからコンテナを生成して実行可能な状態にする。-dオプションは指定できない。

docker create --name [コンテナ名] [イメージ]

start:コンテナ実行

既に存在するコンテナを実行

start [オプション] [イメージ]

指定できるオプションは-a-iのみ。

run:コンテナ生成・実行

実行するたびに新たなコンテナが生成・追加されて実行される。

オプション

  • -d:デーモンで実行
  • -it:コマンドラインで対話的な操作を可能にする(--interactive--ttyの2つのオプションを短縮形で同時指定)
  • --name:コンテナのNAMEを指定(指定しないとDocker側で適当に付与される)
  • -p:ポートのバインディング(-p [ホスト側ポート]:[コンテナ側ポート]

stop:コンテナ停止

実行中のコンテナを停止

exec:実行中コンテナのコマンド実行

たとえばLinux系でシェルを実行させるなど。

docker exec -it [コンテナ名] /bin/bash

rm:コンテナ削除

コンテナを削除。

Compose

compose:Docker Composeでコンテナを作成・起動

予め作成したymlファイルに従ってコンテナを作成し、起動する。

docker compose up -d

 

Docker – インストールほか

インストール

インストール開始

  1. Get Dockerからインストーラーをダウンロード
  2. インストーラーを実行
  3. 再起動
    • サブスクリプション同意のダイアログ
    • 無償条件は小規模事業(従業員250人未満かつ年間収益1,000万ドル未満)、個人利用、教育、非商用オープンソースプロジェクト)
    • 個人利用ならキャンセル

WSLでエラー

インストール中にWSL (Windows Subsystem for Linux)のバージョンが低すぎるとエラーになった。

docker_error_installation_wsl

WSLをアップデート。

再起動。

Docker Desktop起動

WindowsのアプリケーションからDocker Desktopを起動後、コンソールでバージョンを確認。

イメージやコンテナは空っぽの状態。

Learning Center

Welcome

Docker DesktopのLearning centerを試してみる。まずWelcomeをGitHubからクローン。

得られたフォルダー。

ターゲットのフォルダーに移動してビルド。welcomeの画面が表示される。

multi-container-app

GitHubからクローン。

フォルダー構成。

compose.ymlの内容。

compose実行。

localhost:3000にアクセスして結果確認。

Persisting Data

GitHubからクローン後、compose.ymlを確認。

compose実行。

これでコンテナーを停止/削除してもデータが保存される。なお、volumeの実体の保存場所はWindowsの場合以下の場所で、エクスプローラーのアドレスバーに\\wsl$と入力してたどっていける。