DamienKarrus’s blog

プログラミングとクライミングの足跡

ボリュームのバックアップ docker入門-6

コンテナがマウントしたボリュームに格納されたデータをバックアップする。バックアップ方法はバックアップ用コンテナからtarを発行して、マウントされたホスト側ディレクトリにtarファイルを生成する。リストアはリストア用コンテナからtarコマンドを発行して、該当するディレクトリにバックアップデータを復元する。またここではバックアップやリストアで使用するコンテナは、非常に軽いlinuxコンテナであるbusyboxを使用する。

動作検証の為、DBにあらかじめデータをインサートしておく

$ docker volume create vol01
$ docker container run -dit --name db01 --mount type=volume,src=vol01,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
$ docker container exec -it db01 /bin/bash
# mysql -p
mysql> create databse exampledb;
mysql> create table exampletable(id int,note char(4));
mysql> insert into exampletable(id,note)values(1,'kaki');
mysql> insert into exampletable(id,note)values(2,'taka');
\q
exit

バックアップ方法

ボリュームをバックアップするにはバックアップ作業を担当するコンテナを作り、このコンテナから該当するボリュームをバックアップする。
バックアップ対象のコンテナがどのボリュームを利用しているか分からない場合もあるので volumes-from オプションを使用して、自動的に紐付けするように指定する。

(1)必要に応じてコンテナを停止

$ docker container stop db01

(2)軽いlinuxシステム(イメージ名:busybox)を利用してtarコマンド発行

$ docker container run --rm --volumes-from db01 --mount type=bind,src="$PWD",dst=/dest busybox tar czf /dest/backup.tar.gz -C /var/lib/mysql .
・--rm : プロセス終了後コンテナ自動削除
・--volumes-from db01 : db01コンテナが利用しているボリューム(複数)を全てマウント
・--mount type=bind src="$PWD",dst=/dest : bind形式でdockerホストのカレントディレクトリをコンテナの/destにマウント
busybox : このコンテナのイメージ名はbusybox
・tar czf /dest/backup.tar.gz -C /var/lib/mysql . : /var/lib/mysqlにcd してからこのディレクトリ以下を全てtarする。バックアップファイルは/dest/backup.tr.gz
これによって、dockerホストのカレントディレクトリにbackup.tar.gzが出来る

リストア方法

(1)旧ボリュームの削除

docker volume rm vol01

(2)リストア用ボリュームの作成

docker volume create vol01

(3)tarファイル解凍

$ docker run --rm --mount type=volume,src=vol01,dst=/var/lib/mysql --mount type=bind,src="$PWD",dst=/dest busybox tar xzf /dest/backup.tar.gz -C /var/lib/mysql

(4)確認

$ docker container run -dit --name db01 --mount type=volume,src=vol01,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
$ docker container exec -it db01 /bin/bash
# mysql -p
mysql> use exampledb;
mysql> select * from exampletable;

これで最初に作成したレコードが2つ表示されるはずである。

 

次の記事

コンテナのネットワーク docker入門-7 - DamienKarrus’s blog (hatenablog.com)

コンテナからデータを分離させる docker入門-5

 マウント(バインドマウント)によるデータの分離

コンテナ内のデータはコンテナを破棄した時点でコンテナと共に破棄されてしまう。そこで一般的にはホスト側のリソースをマウントする。-v オプションを使用する。

-v マウント元 : マウント先

-v オプションは複数指定できるので、apacheのconfigファイルやコンテンツ本体などを

 -v aaa:bbb -v ccc:ddd -v eee:fff

などのように列記できる。マウントの対象はディレクトリだけではなく、ファイルを指定することもできる。

コンテナ起動用の runコマンドを httpd:latest などとしておけば、起動時にいつもhttpdの最新イメージで起動することもできる。

また、複数のコンテナからおなじディレクトリをマウントすることもできる。

なお、Dockerホストとコンテナ間でのcopyコマンドもある。

docker container cp コピー元 コンテナ名:コピー先

使用例

# docker container cp /tmp/index.html my-apache-app:/usr/local/apache2/htdocs/

ボリュームマウントによるデータの分離

ボリュームマウントとは、ホスト上のディレクトリではなく、Docker Engine上で確保した領域をマウントする方法である。

$ docker volume create volume01(任意のvolume名)

作成したボリュームの確認

$ docker volume ls

コンテナの起動例

$ docker container run -dit --name db01 -v volume01:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7

であるが、-v オプションではボリュームが存在しない場合は自動的に作られてしまうため、意図しない結果になる場合がある。また、バインドなのかボリュームなのかも不明瞭なため、現在では mount コマンドが推奨されている。

バインド:--mount type=bind,src=マウント元パス,dst=マウント先

ボリューム:--mount type=volume,src=volume名,dst=マウント先

上記のコマンドは以下と等価である

$ docker container run -dit --name db01 --mount type=volume , src=vokume01 , dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7

 

バインドマウントとボリュームマウントの使い分け

両者に優劣があるわけではなく、使い分けが必要である。

(1)バインドのほうがよい場面

・設定ファイルをコンテナに参照させてたい場合

・ホスト側のファイル修正をリアルタイムに反映したい場合(開発中など)

(2)ボリュームのほうがよい場面

dockerホストから触る必要のない(触れてはいけない)データを保管する場合に適している。

・データベースのデータクラスタ本体など

ボリュームはデフォルトではDockerホスト上のストレージであるが、ボリュームプラグインをインストールすれば、AWSのS3やNFSを利用することもできるようになる。

(3)tmpfs マウント

データをコンテナ上にもホスト上にも保存したくない場合(大量のテンポラリデータを扱う場合)や高速に処理したい場合などはマウント元をRAMディスクにすることができる。tmpfs-size で容量を、tmpfs-mode でファイルモード0700などを指定できる。コンテナ破棄と共にデータも破棄される。

 

次の記事

ボリュームのバックアップ docker入門-6 - DamienKarrus’s blog (hatenablog.com)

 

コンテナにログインする docker入門-4

-dit オプションについて

-d デタッチ バックグラウンドで実行する

-i インタラクティブ 標準入出力をコンテナに連結する

-t ターミナル(端末)を割り当てる

デタッチ←→アタッチの切り替え方法

アタッチ状態で ctrl+P 、ctrl+Q を順に打つ

デタッチ状態で docker container attach

 

コンテナに入り込む

(1)m-apache-appが存在しない状態で

※ps -a で m-apache-app が存在しない状態で

$ docker run -it --name my-apache-app httpd:2.4 /bin/bash

コンテナがアタッチモードで起動される。

※-itオプションが最初にないとctrlキーが効かない

実行すると、プロンプトが

root@15ab6f08e163:/usr/local/apache2#

のように変化する。lsするとapache2以下のファイルが表示される

ctrl+P 、ctrl+Q を順に打つとデタッチされ、ホスト側のコマンドプロンプトが返ってくる。

$ docker container ps -a

で、コンテナが稼働中であることがわかる

再びコンテナに入る

$ docker container attach my-apache-app

※caught SIGWINCH, shutting down graceffully と出てしまうことがある。これはhttpdコンテナがデタッチ/アタッチに対してそのような仕様になっているためで、操作的な問題ではない。

(2)コンテナが稼働している状態で

コンテナをデタッチモードでコンテナを起動しておく

$ docker run  -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

execコマンドでbashを起動する

$ docker container exec -it my-apache-app /bin/bash

プロンプトが変わりコンテナに入ることができた

bashを終了する

# exit

コンテナの状態を確認すると、コンテナは稼働中であることがわかる

$ docker container ps
CONTAINER ID   IMAGE       COMMAND              CREATED          STATUS          PORTS                                   NAMES
6ee4986d3d70   httpd:2.4   "httpd-foreground"   39 minutes ago   Up 39 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   my-apache-app

run と exec の違い

run コンテナ停止時に使用 終了時はコンテナ終了

exec コンテナ稼働時に使用 終了時もコンテナは稼働のまま

 

次の記事

コンテナからデータを分離させる docker入門-5 - DamienKarrus’s blog (hatenablog.com)

 

 

 

 

 

 

DockerでWebサーバを作ってみる Docker入門-3

  1.  「Dockerのイメージを使って環境構築する

ホストOSにapacheをインストールせずに、Webサーバを構築し、不要になったらDockerイメージを削除してもホストOSになんらの影響も与えない。
ここではDockerで類似するイメージを探してインストールし、動作確認をした後、削除してみる

(1)イメージを探す

https://hub.docker.com/
左上のsearch でhttpdを検索するとhttpdというイメージが見つかる
Supported tags のところに配布しているバージョンがかかれている
イメージ名称とバージョン(タグ)を:でつないでイメージの名称として使用する

$ docker pull httpd:2.4

/* Amazon EC2でいきなりこのコマンドを打つとpull access denied for http レジストリがないかdocker login が必要,,, などとでる。 原因調査中

(1)pull(2)create startを一度にやるrunコマンドなら動作する

docker run -dit my-apache-app -p 8080:80 -v "$PWD":/usr/local/pache2/htdocs/ httpd:2.4

Windows11+WSL2上のUbuntu20.04ではすんなり動く

*/

(2)イメージをダウンロードし、Dockerコンテナを生成、起動する

コンテナを生成する。イメージを指定する(ダウンロードされていなければ自動的にダウンロードされる

$ docker container create --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

 ※ホストOSのport8080をコンテナの80にマッピングする

 ※カレントディレクトリ($PWD)を/usr/local/apache2/htdocs にマウントする

 ※root権限で実行しないと/usr/local下にはdirectoryはできないので、一般権限でコンテナを作るときはディレクトリを作っておいて書き込み権限を入れておかないとダメかもしれない

コンテナを起動する

$ docker container start my-apache-app
psで稼動確認する
このコンテナの名称を my-apache-app と名づけたので、以降この名称を使用する
$ docker container ps
ブラウザでEC2インスタンスIPアドレスにアクセスするとapacheが稼動していることが確認できる

(3)コンテンツの作成

カレントディレクトリが/usr/local/apache2/htdocs にマッピングされているので、index.htmlを作ればブラウザにその内容が表示される

(4)コンテナの停止と再開

$ docker container stop my-apache-app
ブラウザでEC2インスタンスIPアドレスにアクセスするとapacheが停止していることが確認できる
再び起動するには
$ docker container start my-apache-app

(5)ログの確認

実行中のログは以下のコマンドで確認できる
 docker container logs my-apache-app

(6)コンテナの破棄

コンテナは停止した後であれば rm コマンドで消去できる
$ docker container stop my-apache-app

$ docker container ps -a でSTATUSがEXITEDになっていることを確認する
$ docker container rm my-apache-app

$ docker container ps -a でmy-apache-appがないことを確認する

(7)Dockerイメージの破棄

ダウンロードしたイメージの確認
$ docker image ls でダウンロード済みのイメージを確認
$ docker image rm httpd:2.4
$ docker image ls で消去されたことを確認

次の記事

コンテナにログインする docker入門-4 - DamienKarrus’s blog (hatenablog.com)

Amazon EC2 に docker をインストールする Docker入門-2

AWSでEC2のインスタンスを作る

無料の範囲を超えないように以下の構成とした。
  OS: ubuntu 18.04 LTS(HVM)
  vCPU: 1
  memory: 1GB
  ストレージ: 20GB

 セキュリティ: 22,443,80,8080-8082,30000を開けた
キーペアを発行し、秘密キー(pem)をクライアントマシンに保存
SSHで接続(認証にはRSAで秘密キーを使用)

ここまででEC2に仮想サーバができた

Dockerのインストール

Dockerインストールに必要なソフト、コマンドのインストールをする

$ sudo apt-get update
$ sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Docker公式からGPGキーをダウンロードしtrusted.gpg.dにキーを追加(docker.gpg)
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg >> docker.gpg
$ sudo gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/docker.gpg --import docker.gpg 
$ sudo chmod 644 /etc/apt/trusted.gpg.d/docker.gpg
$ sudo rm /etc/apt/trusted.gpg.d/docker.gpg~
$ rm docker.gpg

リポジトリにDockerの最新版をダウンロードする

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Dockerの最新版のダウンロード後、Dockerをインストールする

$ sudo apt-get update
$ sudo apt-get -y install docker-ce docker-ce-cli containerd.io

root以外でもdockerが使えるようにする

$ sudo gpasswd -a ubuntu docker

ログオフして再ログイン後dockerコマンドが使用可能

$ docker version

もし、

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

というエラーが出た場合は、サービスをリスタートさせる。

$ sudo service docker stop

$ sudo service docker start

rootのパスワード設定

$ sudo su -

# passwd

XXXXXXX

 

次の記事

DockerでWebサーバを作ってみる Docker入門-3 - DamienKarrus’s blog (hatenablog.com)

「コンテナ」の基礎 Docker入門-1

「コンテナ」とは

コンテナとはシステム上にある隔離された空間を作った時のその空間のこと。
システムとはLinuxWindowsMacOSなどで、このケースではホストOSと呼ばれる。
ホストOS上に空間を作り、その空間の中でこれから開発をしようとするシステムを動かす。
利点は、ホストOSに依存せず、全く同じイメージを構築できること。そしてチームで開発する場合は、構築した環境をリポジトリとして登録しておけばチーム内の全員が同じイメージを使用して開発できる。納品先にもコンテナを用意しておけば、イメージとして納品することも可能。

「Docker」とは

コンテナを実現する代表的なソフトにDockerがある。DockerコンテナはDocker Engineによって動作する。そしてこのDocker Engineを操作するためにDockerコマンドやDocker Composeといったインターフェイスが用意されている。
コンテナを利用するに際して、まずコンテナの元となるDockerイメージを用意する。これはDocker Hubにリポジトリとして公開されており、それを利用する。イメージは多数存在し、アプリケーション入りのイメージや、Linux単体のイメージなど数多くある。通常はLinux単体イメージを使用し、自社内で必要な作業をして、その後のイメージをプライベートなDocker Hubにアップして関係者に配布する。AWSにはAmazon ECRというプライベートなDockerレジストリサービスもある)

WindowsでDockerを使用する場合、Hyper-Vを有効にしてDocker DesktopやDocker Toolboxを使用することがDocker社から推奨されているが、Hyper-VはProにしか搭載されておらずHomeエディションでは使用できない。また、これらのツールはVirtualBoxVMwareと同居できない。そこでWSL2を使ってLinuxサブシステムを構築し、このサブシステム上でDockerエンジンを動かすのが現在最もよい方法である。WSL2はwindows10 2004以降もしくはwindows11で使用可能。旧タイプのCPUで2004にするためには「CPUのチェックをしない」というキーをレジストリに登録すれば2004にアップグレード可能である。具体的な方法はネット上に豊富にある。

「Dockerの本番運用」

コンテナを本番機で使用する場合、過負荷でも停止しないことが求められる。安定運用にはDockerホスト自体の安定稼働が必要である。AWSの場合、EC2という仮想サーバサービスがあるがこれを自分で構築するとそのホスト自体の運用管理の問題がある(手間がかかる)。そこでAmazon ECSというコンテナを運用するマネージドサービスがあって、これには負荷分散機能もあり、必要に応じてスケーリングしてくれる)。さらにクラスタサービスを利用することもできる。Kubernetes(クバネティス)というオーケストレーションソフトがあって、複数台のサーバでクラスタを構成し、負荷に応じて必要なだけコンテナを自動生成してくれる(らしい)。AWSにもAmazon EKSというKubernetes互換のマネージドサービスがある。これを利用すればかなり堅牢なシステムを構築できる。まあ、クライアントの予算次第といったところ。

 

次の記事

Amazon EC2 に docker をインストールする Docker入門-2 - DamienKarrus’s blog (hatenablog.com)

カレントユーザの特定カラムの情報を取得する方法

ログイン中のユーザの、ユーザテーブルから特定のフィールドのデータを取得する方法は以下の通り

まず、ユーザIDを取得する

$user_id = get_current_user_id();

取得したユーザIDを使って、特定のフィールド(point_hamalove)のデータを取得する

echo get_user_meta( $user_id , 'point_hamalove' , ture );