仕組みと使い方がわかるDocker&Kubernetesのきほんのきほん
Chapter1 Dockerとは
Docker
データやプログラムを隔離できる仕組み
データを細かい部屋(コンテナ)にわけ、管理できる
コンテナはimageから生成でき、容量が許す限り幾つでもimageは作れる
導入には、何らかの形でLinux OSが必要になる
Linux OSの上にDocker Engineが乗り、その上にコンテナが乗るイメージ
DockerはLinux OSを使うことを前提として作られている
データを隔離する理由
ソフトAとソフトBで同じディレクトリのライブラリを参照していたとする
Bの都合だけでライブラリをupdateすると、Aに不具合が起きることがある
Dockerでプログラムを隔離するとこの問題を解決できる
ソフトA用のコンテナと、A向けのverのライブラリ
ソフトB用のコンテナと、B向けの最新verライブラリ
「サーバ」の二つの意味
機能としてのサーバ
web機能を提供するwebサーバとか
物理的マシンとしてのサーバ
複数の機能を載せ、複数の人がアクセスすることの多い物理マシン
Dockerとサーバ
1つのサーバマシンには、1つのWebサーバしか載せられない
コンテナならば、コンテナごとに1つずつWebサーバーソフトを置くことができる
2つマシンを用意する必要もないし、管理も楽
コンテナは持ち運ぶことも可能
Dockerから書き出し→別のDocker上に構築
Dockerという土台があれば、意識することなくコンテナを移動できる
Dockerと仮想化技術
VirtualBox, VMware
仮想的に物理マシンを用意している
マザーボードやCPU, メモリなども
Docker
コンテナ上にOS(Linux)は置くが、それはLinuxそのものではない
OSの機能のいくつかをホストである物理マシンに託して軽い動作を実現している
コンテナは一部のOS機能をホストに依存させる
そのため、コンテナの外にも中にもLinuxをベースとしたOSが必要
EC2
AMIというイメージから作成する、「仮想化環境」
Dockerとの違いはVirtualBoxと同じ。インスタンスの配布方法は似てる
ECSなどのホスティングサービス
Amazon Elastic Container Service
作成したコンテナイメージをサーバを作ることなく運用できるサービス
Linux OSの上に積むことなく、クラウドでコンテナを動かすというイメージか
Chapter2 Dockerが動く仕組み
Dockerの仕組み
物理マシン > Linux OS > Docker Engine(Dockerのソフト) > コンテナ
コンテナの中は?
Linux OS「っぽいもの」が入っている
Linux OSでDocker Engineが動くのに、さらにOSっぽいものが載っている
Dockerの特徴の一つ
そもそも、OSとは
カーネルと呼ばれる核の部分と、その周辺部分で構成されている
周辺部分がプログラムからの連絡を受け取る
カーネルに伝えて、カーネルがハードを操作する
Dockerは
コンテナは完全に分離されている
土台のLinux OSは、コンテナの中にあるプログラムの命令は受け取れない
コンテナの「OSっぽいもの」がその命令を受け取り、土台に返す!
土台のLinux OSを使う前提の仕組みのため、Linuxでないと動かない
excelとかそういうものが動かせないのは、Linuxマシン用のツールだから
Windows / Macで動く理由
Docker Desktop for Windows
Docker Desktop for Mac
これらはDockerの実行に必要なLinuxを含むパッケージをインストールしている
Mac OS上に、さらにLinux OSを強引に入れて動かしているということ
イメージとコンテナ
コンテナ作成の素となるものが、イメージ
金型のようなもの
コンテナからイメージを、逆に作ることもできる
作ったコンテナを改造したものをイメージにまた落とし込むみたいに
いろいろなイメージが置いてある場所が、Docker Hubというwebページ
webサーバコンテナや、メールサーバのコンテナイメージが置いてあるので借りて使う
自分なりのコンテナを作ってイメージに落としてみても良い
コンテナの考え方
1コンテナに、1アプリケーション
WordPressならば
WordPress
Apache
MySQLの3つのコンテナを使って稼働させると良い
全部入りコンテナのメリット
何か動作をちょっとだけ試したいとき、すぐに動作させることができて良い
コンテナのライフサイクル
作る > 起動する > 停止する > 破棄する > 作る...
1つのコンテナをアップデートしながら作るのではない
アップデートされたソフトウェア入りの新しいコンテナを使う
→次から次へとコンテナを乗り換える
一般的にDockerは複数のコンテナを同時稼働することを想定とされている
たくさんあるコンテナを保守していては体験んあので、乗り換えてしまった方が良い
破棄したコンテナのデータ
物理的なホストのマシンにマウントし、そこに保存する
マウント
つなげて書き込めるようにした状態
Dockerが物理マシンのストレージに書き込めるようにした状態
Chapter3 Dockerを使おう
3通りの使い方
Linuxのマシンで使う
インスタンスにDockerを導入する場合はこの方法になる
VMwareなどでLinux OSの仮想マシンを作り、そこにDockerを入れる
windows / mac用のDocker (Docker for ...)を使う
今回はこのLinux OSなどの実行環境が入ったパッケージを使う
Docker Engine, Linux OS, 仮想環境(HyperKit)が入っている
Docker for Macと仮想環境上に入れるDockerの認識の違い
ユーザーが明示的に仮想環境に入れて使うのか、
Linuxを入れることを意識せずに使うのかの違い(docker for...)
OSが二つ混在することになるが、docker専用のOSであるため特に意識しなくてOK
Chapter4 Dockerを動かす
Docker Engineの起動
アプリを起動することと同義。コンテナは自動で起動しない
コマンドの基本
「何をどうする」という形で定義する
docker 上位コマンド 副コマンド -option 対象 --引数
penguinイメージをコンテナとして実行させたいなら
docker container run penguin
上位コマンドは21年時点では、12種類程なので少ない
container, imageなど
docker container run -d penguin --mode=1
-d: バックグラウンドの実行。--mode=1は、モード1で起動するという意味
省略もできる
docker run(コンテナを実行する)
これは古い書き方なので、いつか対応されなくなるかも
ライフサイクルに沿ってDockerを使う
docker runの詳細
docker pull(Docker Hubからイメージをダウンロード)
docker create
docker start
この3つの役割を担ってくれている
--nameでコンテナの名称を指定できる
-p: ポート番号の指定
-v: ボリュームのマウント
--net: コンテナをネットワークに接続する
その他
デーモンとして動くコンテナには-ditと指定することが多い
バックグラウンド実行, コンテナに操作端末(キーボード)を繋ぐ, 特殊キーを使用可能とする
ライフサイクルとそれに合うコマンド
create > start > stop > rm
コンテナを破棄するために、必ず停止すること
デーモンとして動くコンテナについて
デーモン (daemon)
UNIX, Linuxに上で動くプログラムの中でも、常に待ち受けして裏で動き続けるプログラムのこと
-dit
バックグラウンドで実行。
デーモンは待機して動き続けるプログラム
付けないと次のコマンドが打てなくなってしまう
コンテナの中身をキーボードで操作するために必要なオプション
付けないとコンテナの中身を操作できない
docker psコマンド
CONTAINER ID
64文字中の12文字が表示される。12文字でもIDとして使用できる
IMAGE
元となったイメージ名
COMMAND
コンテナにデフォルトで起動するように構成されているプログラム名
CREATED
作られてから経過した時間
STATUS
動いているならUp、動いていないならばExited
PORTS
割り当てられているポート番号
ホストのポート番号->コンテナのポート番号で表示される。
ポート番号が同じ場合であれば、->は表示されない
NAMES
コンテナの名前
Apacheをコンテナで起動してみよう
code:dockerコマンド
# apa000ex1 という名前のコンテナをバックグラウンドで作成することを実行
# Apacheのイメージ名httpdを、バージョン番号を指定せずに使用する(最新版が使われる)
docker run --name apa000ex1 -d httpd
Unable to find image 'httpd:latest' locally
docker.io/library/httpd@sha256:5fa96551b61359de5dfb7fd8c9e97e4153232eb520a8e883e2f47fc80dbfc33e: Pulling from library/httpd
e9995326b091: Already exists
ee55ccd48c8f: Pull complete
bc66ebea7efe: Pull complete
5d0f831d3c0b: Pull complete
e559e5380898: Pull complete
Digest: sha256:5fa96551b61359de5dfb7fd8c9e97e4153232eb520a8e883e2f47fc80dbfc33e
Status: Downloaded newer image for httpd@sha256:5fa96551b61359de5dfb7fd8c9e97e4153232eb520a8e883e2f47fc80dbfc33e
Tagging httpd@sha256:5fa96551b61359de5dfb7fd8c9e97e4153232eb520a8e883e2f47fc80dbfc33e as httpd:latest
87a3b4d4b6b21486a2d50ecd2b843054ab1d44d74b12d5bc877e1e9747674bf3
止める
docker stop apa000ex1
psでステータスがexitedになっていることが確認できる
削除する
docker rm apa000ex1
コンテナIDの省略形
ユニークならば、最初の2文字などでもコンテナを選択することができる
docker stop 2b
コンテナと通信する
外界と接続するポートを指定する流れ
ブラウザのアクセス→物理マシン→Linux→Docker Engine→コンテナ
まずは物理マシンが受け取ってあげて、それをコンテナで待ち受けているポート番号に伝えてあげる
ホストのポート8081とかを使う
それとコンテナのポート80を繋ぐイメージ
-p 8081:80
複数のwebサーバが並列している状態の指定
母体側のポート番号を同じにすると、どのコンテナ宛であるのかが分からなくなる
8080:80, 8081:80, ...というように母体のポート番号をずらして使う
ハンズオン
被ってそうな気がしたので8081にした
docker run --name apa000ex2 -d -p 8081:80 httpd
コンテナIDが表示される。httpdイメージを取得済みのため時間がかからない
もう動く!
使い終わったら停止→削除
いろんなコンテナを作ってみる
apacheのサーバを3台立てる
code:terminal_ex3
docker run --name apa000ex3 -d -p 8081:80 httpd
docker run --name apa000ex4 -d -p 8082:80 httpd
docker run --name apa000ex5 -d -p 8083:80 httpd
IDでも指定できるが、なるべく名前をつけることをお勧めする
nginxのサーバを立てる
docker run --name nginx000ex6 -d -p 8084:80 nginx
MySQLのコンテナを作る
docker run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql
入れる
code:txt
docker container exec -it mysql000ex7 bash
# コンテナ内
bash-4.4# mysql -p
Enter password:
mysql>
イメージの削除
コンテナを消してもイメージは溜まり続けている
イメージはイメージ名、もしくはイメージIDを指定する
そのイメージを使ったコンテナが存在する限り消すことはできない
docker image rm image_name_1 image_name_2....
docker image ls
REPOSITORY: イメージ名
TAG: ver情報。 指定していないとlatest(最新版)
ちなみに指定したい場合は
docker run --name apa000ex2 -d -p 8080:80 httpd:2.2
とかで行ける。そのイメージを消したいならば以下でいい
docker image rm httpd:2.2
IMAGE ID: イメージID。64文字だが先頭12文字のみ。
CREATED: 作られてから経過した時間
SIZE: イメージの容量
消してみる
docker image rm nginx mysql
エラーが起きた
code:txt
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 10959cc506be is using its referenced image 76c69feac34e
→業務でnginxのimageを使っているものがあるから。
コンテナID 10959cc506be が、イメージID 76c69feac34e のもの使用中だから消せないということ。
あぶない
Chapter5 複数コンテナを動かす
WordPressの環境を構築する
用意が必要になるもの
Webサーバ
DBサーバ
実行環境(PHP)
WordPress公式が提供するイメージ
WP本体、Apache、PHPが入っている
なので、別途用意するコンテナはMySQLコンテナだけでOK
Dockerネットワークの作成
WPで作成した内容はDBに保存する必要がある
仮想的なネットワークを作り、両方のコンテナを所属することでコンテナ同士を繋げる
docker network ls
ハンズオン
Dockerネットワークを作ろう
docker network create wordpress000net1
MySQLコンテナを作成する
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkundess mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
--netで作ったネットワークを紐付ける
-eでMySQLの環境変数を設定する
MYSQL_DATABASE=wordpress000db: wordpress000dbというDBをWP用のものとして使うということ
WordPressコンテナを作成する
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkundess wordpress
これでもう完成。 DBサーバに入ってチェックもできる
docker container exec -it mysql000ex11 bash
-itがないと操作できないよ
終わったら停止→削除。networkはいきなりrmコマンドでOK
docker network rm wordpress000net1
ハンズオン2: Redmine
Redmine
チケットと呼ばれる、誰が何をするのかを示したToDo管理ソフト
これもRedmineコンテナと、MySQLコンテナの用意で実装できる
ネットワークを作る
docker network create redmine000net2
MySQLコンテナを作る
docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
Redmineコンテナを作る
docker run -dit --name redmine000ex14 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine
もう動く!
ハンズオン3: RedmineとMariaDB
ネットワーク
docker network create redmine000net3
MariaDB
docker run --name mariadb000ex15 -dit --net=redmine000net3 -e MYSQL_ROOT_PASSWORD=mariarootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
network無し版
docker run --name mariadb000ex15 -dit -e MYSQL_ROOT_PASSWORD=mariarootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
Redmine
docker run -dit --name redmine000ex16 --network redmine000net3 -p 8087:3000 -e REDMINE_DB_MYSQL=mariadb000ex15 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine
完成。localhostがtypoしてて一生ミスってたので気を付ける
Chapter6 応用的な技術
コンテナとホスト間でファイルをコピーする
多くのシステムは、プログラムの他にも実行環境、webサーバ、DBで構成されている
他にも画像素材や入力データの本体なども多く含まれる
サーバに保存されていくが、ソフトを介さずにサーバと自分のPCとやり取りをする
ホストからコンテナへ
docker cp ホスト側パス コンテナ名:コンテナ側パス
コンテナからホストへ
docker cp コンテナ名:コンテナ側パス ホスト側パス
ハンズオン
docker run --name apa000ex19 -d -p 8089:80 httpd
docker cp ~/Desktop/study/docker_kihon_kihon/4_chapter/index.html apa000ex19:/usr/local/apache2/htdocs/
逆なら
docker cp apa000ex19:/usr/local/apache2/htdocs/index.html ~/Desktop/study/docker_kihon_kihon/4_chapter
ボリュームのマウント
ボリューム
ストレージの1領域を区切ったもの
マウント
取付
対象を接続してOSやソフトウェアの支配下に置くこと
USBを指すとフォルダに開けるようになるが、あれはUSBメモリをPCにマウントしている
コンテナは消すものとして扱う
マウントしてそこにデータを置いておかないと、データも一緒に消してしまう
外部にデータを逃すことが必要
最初から外に保存して、そのままアクセスして使うのが一般的
データの永続化
このデータを置く場所が、マウントした記憶領域
記憶領域のマウントのことを、ボリュームのマウントという
マウントすると、コンテナがコンテナ外のデータを操作することができるようになるss
2種類のマウント
ボリュームマウント
Docker Engineが管理している領域内にボリュームを作成
ディスクとしてコンテナにマウントする
名前だけで管理できて手軽に扱える
直接の操作がしづらイノで、消してはいけないファイルを置くのに使うことが多い
バインドマウント
DockerをinstallしたPCのドキュメント、デスクトップなどの、Docker Engineの管理していない場所の既に存在するディレクトリをコンテナにマウントする
ファイル単位でのマウントも可能
フォルダに対して直接ファイルを開いたりするので、頻繁に触るファイルはここに置く
メモリマウント
メモリをマウント先に指定して、高速に読み書きする
Docker Engineの停止やホストの再起動で消滅する
記憶領域をマウントしよう
先にその記憶領域を作っておく必要がある
記憶領域を作る→コンテナを作る(マウントする)
バインドマウントの場合
フォルダやファイルをローカルに用意する
ボリュームマウントの場合は、コマンドで作る
docker volume create ボリューム名
docker volume rm ボリューム名
runするときの紐付けかた
バインドマウント
docker run ... -v 実際の記憶領域パス:コンテナの記憶領域パス
ボリュームマウント
docker run ... -v ボリューム名:コンテナの記憶領域パス
ハンズオン:バインドマウント
フォルダ作成→コンテナ作成→初期ページ確認
docker run --name apa000ex20 -d -p 8090:80 -v ~/Desktop/study/docker_kihon_kihon/6_chapter:/usr/local/apache2/htdocs httpd
~/Desktop/study/docker_kihon_kihon/6_chapter のフォルダを
コンテナの/usr/local/apache2/htdocsにマウント!
ハンズオン:ボリュームマウント
ボリューム作成→コンテナ作成→確認
docker volume create apa000vol1
volumeを作る場所はDocker Engineが判断して設定してくれる
docker run --name apa000ex21 -d -p 8091:80 -v apa000vol1:/usr/local/apache2/htdocs httpd
作ったボリューム:コンテナ内の記憶領域
ボリュームを確認してみる
code:json
docker volume inspect apa000vol1
{
"CreatedAt": "2022-11-11T00:43:15Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/apa000vol1/_data",
"Name": "apa000vol1",
"Options": {},
"Scope": "local"
}
docker container inspect apa000ex21
# 色々出てくるが、Mountsの項目を探す
"Mounts": [
{
"Type": "volume",
"Name": "apa000vol1",
"Source": "/var/lib/docker/volumes/apa000vol1/_data",
"Destination": "/usr/local/apache2/htdocs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
SourceがDocker Engineが判断しておいた場所、
Destionationがコンテナのパス
🌟ボリュームマウントされているかチェック
apa000ex21から書き込んでみた
これを別のコンテナから参照してみる
docker run --name test_vol_mount -d -p 8090:80 -v apa000vol1:/usr/local/apache2/htdocs httpd
別のコンテナを立てても同じ内容が出力された!おお
🌟ボリュームのバックアップについて
バインドマウント
ファイルをコピーしておけば良い
ボリュームマウント
ボリューム領域自体のバックアップを取ることができない
別のLinuxコンテナを繋いで圧縮し、保存する必要がある
メインコンテナの停止を確認
Linuxのみのコンテナをvolumeと繋ぐ
tarコマンドでバックアップを取る
例
code:terminal
docker run --rm -v apa000vol1:/moto -v /Users/skoni/Desktop:/saki busybox tar czvf /saki/backup_apa.tar.gz -C /moto
--rm : すぐにこのコンテナは削除するというオプション
2つの記憶領域をマウント
-v apa000vol1:/moto ボリュームマウント
-v /Users/skoni/Desktop:/saki バインドマウント
/motoにマウントしたボリュームを、sakiに書き出すことでコンテナ外にデータを避難させる
今回の場合はバックアップ先は、ローカルのデスクトップとなる
tar czvf /saki/バックアップ名.tar.gz -C /moto .
tar形式で圧縮ファイルを作成(czvf)する
圧縮する対象(-C)は、/motoのデータ
→ motoをsaki内のバックアップ名.tar.gzというファイルとして圧縮保存する
リストアするときや詳細は書籍P177を参照する
コンテナのイメージ化
既にあるコンテナを使ってimageを作ると、他のパソコンやサーバに環境を移すことができる
1からオリジナルのイメージを作ることもできる
commitでイメージを書き出す方法
コンテナを用意して書き出す。コマンド1つで作れる
手軽だが、コンテナを作り込む必要がある。
既にあるコンテナを複製したい、移動したい時に使う
docker commit コンテナ名 作成image名
Dockerfileでイメージを作成する
Dockerfileという名前のファイルから、buildすることでイメージにする
元となるイメージや実行コマンド記載して、その通りに操作してもらう
元となるイメージ
改造する内容
設定
コンテナに入れたい画像やテキストファイル
→buldして1つのイメージにする
docker build -t 作成するイメージ名 材料フォルダのパス
code:Dockerfle
FROM image名
COPY コピー元パス コピー先パス
RUN Linuxコマンド
ハンズオン:commitでイメージ化する
コンテナ作成→書き出し→書き出されたイメージを確認
docker run --name apa000ex22 -d -p 8092:80 httpd
おさらい
-p: macの8092ポート(localhost)のアクセスすると、80番につながるということ
-d: 恐らく、daemonのd。起動プロセスをdaemonとしてバックグラウンドで動かす。
docker commit apa000ex22 ex22_original1
code:terminal
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ex22_original1 latest 64742aa884ce 12 seconds ago 145MB
ハンズオン:Dockerfileで作る
材料の用意→Dockerfile作成→buildでimage作成→imageの確認→imageをもとにコンテナ作成
材料用意
docker_kihon_kihon/6_chapter/ex22_dockerfileにindex.htmlを用意しといた
code:Dockerfile
FROM httpd
COPY index.html /usr/local/apache2/htdocs/
buldする
docker build -t ex22_original2 ~/Desktop/study/docker_kihon_kihon/6_chapter/ex22_dockerfile
-t: タグ付け。ex22_original2というタグをこのimageにつけた。
docker image lsでチェック
このimageをもとにコンテナを作ってみる
code:txt
docker run --name 221114_tst -d -p 8094:80 ex22_original2
docker: you are not authorized to perform this operation: server returned 401.
エラーが返ってきた。imageが改ざんされていないか検証する機能。
export DOCKER_CONTENT_TRUST=0
docker run --name 221114_tst -d -p 8094:80 ex22_original2
a4b843b0372d58c359699bfc5d25e29ef1a12251693de5a39a9fed9cff723490
環境変数を設定し、できた。
https://scrapbox.io/files/6371abb73818e1001df987d6.png
コラム:imageの持ち運び方
saveを使う
一旦自作のイメージにして→saveでtarファイルにする→loadでimageとして読み込む
docker save -o ファイル名.tar 自作イメージ名の指定
コンテナの改造
ファイルをコピーしたり記憶領域をマウントする方法
Linuxコマンドで操作する方法
コマンド操作について
コンテナに対してコマンドで命令するためには、shellが必要
shell: 命令をLinuxに伝えるプログラム
シェルには、bash, zshなど色々ある。コンテナのほとんどはbashが採用されている
まずはbashを起動させる。
/bin/bash
docker execやrunコマンドなどで命令する
docker exec (オプション) コンテナ名 /bin/bash
docker run (オプション) イメージ名 /bin/bash
docker run --name apa000ex23 -it -p 8089:80 httpd /bin/bash
ただしこれだとApacheが起動しない(apacheの代わりに、bashが起動するようになっている)
なので、終わった後apacheを起動させるような命令を送ろう
bashが起動したら
操作対象が該当のコンテナになる
Ubuntuやcentosなどのイメージを借りてコンテナを作り、apacheやMySQLをインストールしてみよう
PHP環境作ってみても良いかも
コンテナのベースOS
Debianをベースとすると良いと、公式が提言している
なのでDebuabm Ubuntuなどのコマンドを参考にしよう
ちなみにRed Hat系は、RHEL, CentOSなどが該当する
Docker Hubについて
イメージが配布されている場所。runはここからイメージを引っ張ってきている
作ったイメージを置いたり、プライベートなHubを作ることだってできる
Docker レジストリ
イメージの配布場所を指す
一般公開されている、いないに関わらず、「配布場所」なのであればDockerレジストリ
Docker Hub
Dockerレジストリのうち、Docker社公式が運営しているもののこと
ApacheやMySQL公式などはDockerレジストリに参加し、配布されている
つまり
大枠としてDockerレジストリがある
Docker Hubは、Docker社公式のDockerレジストリだということ
レジストリ(登記所)とリポジトリ(倉庫)
レジストリ(イメージの配布場所)をさらに区分けしたものが、リポジトリ
とある会社のレジストリがあって
ニャパッチというリポジトリ
ワンコSQLというリポジトリ、という感じ
Docker Hubの場合、リポジトリがそれぞれIDを持っている
タグとイメージ
イメージのアップロード先がDocker Hubでもプライベートレジストリであっても、タグが必要
タグ: レジストリ内で扱う上でのイメージの名前に近い
タグ名は、レジストリの場所(もしくはDocker HubならID)/ リポジトリ名:バージョン番号で表記される
code:txt
# 自分のPCのレジストリで「nyapacchi」というリポジトリ、ver13の場合
localhost:5000/ nyapacchi:13
# zoozoo.coommというドメインの時
zoozoo.coomm/nyapacchi:13
# Docker Hub IDがzoozoousagiというIDの時
zoozoousagi:/nyapacchi:13
バージョンについて
ここでバージョン指定をしておかないと、latestで最新のイメージが落とされることになる
イメージにタグ名をつける
docker tag apa000ex22 zoozoo.coomm/nyapacchi:13
apa000ex22というイメージに、タグ付け
イメージをアップロードする
docker push zoozoo.coomm/nyapacchi:13
プライベートレジストリを作る
これもDockerコンテナで運用することができる
docker run -d -p 5000:5000 registry
ただしこれはdocker psでも表示されない
Docker Hubを使う
ここのこと。
Chapter7 Docker Composeについて学ぶ
Docker Composeとは
通常のコマンドでwordpressを構築するシステムを作るのは大変
SQLコンテナ、WPコンテナ...
作るのも消すのもコンテナの数だけ作業量が倍になる
コンテナ構築に関わるコマンド分の内容を1つのテキストファイルに書き込み、一気に実行、停止、破棄できるのがDocker Compose
仕組み
構築の設定を記述した定義ファイルをYAML形式で用意して、コマンドの指示を出す
YAML Ain't a Markup Language
設定ファイルの記述に使われることが多い、データシリアライズな言語
複数要素を1列にまとめて、1個ずつ処理するということ
コンテナやボリュームをこう作りたい...という項目を書いておく
コマンド
up
runに似たコマンド。定義に沿ってimageをDLし、コンテナを作成、起動する。
ネットワークやボリュームが記載されていたらその周辺環境も作成する
down
コンテナとネットワークを停止する
削除せずに停止だけしたい場合はstopを使おう
Dockerfileとdocker-compose.ymlの違い
Dockerfile
imageを作るためのファイル。ネットワークやボリュームは作成できない
docker-compose.yml
runコマンドの集合体
作成するのはコンテナと、周辺環境(ネットワーク、ボリューム)
🌟Kubernetes
後述するが、これはコンテナを管理するためのもの
docker-composeはコンテナを作って消すだけで、管理機能はない。
table:dockerの各ファイル
技術名 Dockerfile docker-compose.yml Kubernetes
役割 imageを作る コンテナと周辺環境を作る コンテナを管理する
使い方
昔は別のソフトだった
Docker Compose V2になってから、compose機能がdockerコマンドとして使えるようになった
code:docker_commands
# 昔は別のツールだったので, dockerコマンドじゃなかった
docker-compose
# 統合されるようになったので、ハイフン無し(dockerコマンドとして)で実行できるようになった
docker compose
いずれハイフン付きの表記は無くなっていくかも?
実際の使用について
フォルダを作り、そこにdocker-compose.ymlを置く
1つのフォルダに対して、必ず1つだけ
サービスとコンテナ
docker composeでは、コンテナの集合体を「サービス」と呼ぶ
ドキュメントで「サービス」と書いていたら、コンテナと解釈してしまっていい
書こう
code:docker-compose.yml
version: "3"
services:
apa000ex2:
image: httpd
ports:
- 8080:80
restart: always
これは、docker run --name apa000ex2 -d -p 8080:80 httpdと同義
code:docker-compose.yml
version: "3"
services:
wordpress000ex12:
depends_on:
- mysql000ex11
image: wordpress
networks:
- wordpress000net1
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST=mysql000ex11
WORDPRESS_DB_NAME=wordpress000db
WORDPRESS_DB_USER=wordpress000kun
WORDPRESS_DB_PASSWORD=wkunpass
これは、docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress と同義
各解説
version: docker composeのバージョンを書く
services:コンテナのこと。docker compose, Kubernetesではコンテナの集合体をサービスと呼ぶ
networks, image, volume, ports, environment:そのまんま
depends_on: 別のサービスに依存することを示す
指定するのはコンテナ。depends_onのコンテナが作られた後に、このコンテナを作るよということ
要するに、サービスを立ち上げる順番を決められる
restart:コンテナが停止したときの再試行ポリシー(止まった時どうするか)を設定できる
no何もしない
always 必ず再起動する
on-failureプロセスが0以外のステータスで終了した場合、再起動する
unless-stopped停止した時は再起動しない。それ以外は再起動する
インデント
スペースが原則。数は幾つでもいいが、1つでインデントしたなら以降は1つが基準になる
コロン:の後ろは必ずスペースを空けること
文字列を入れる場合は、クオート" or 'で括ること。
code:docker-compose.yml
version: "3"
services:
container_name_1:
image: ...
networks: ...
# 改行して書きたいならインデントしてからハイフンを挟む
ports:
- 8080:80
container_name_2: ...
networks:
network_1: ...
volumes:
volume_1: ...
volume_2: ...
ハンズオン:wordpress環境を作る
大項目を並べる→名前を書く→MySQLコンテナの定義→WordPressコンテナの定義
大項目を並ベて名前を書こう
上からざっと書くのではなく、テンプレートに必要な情報を埋めていく感じ
code:docker-compose.yml
# ↓この大枠に埋めていこう
version: "3"
services:
mysql000ex11:
wordpress000ex12:
networks:
wordpress000net1:
volumes:
mysql000vol11:
wordpress000vol12:
MySQLコンテナを定義しよう
code:docker-compose.yml
version: "3"
services:
mysql000ex11:
image: mysql:5.7
networks:
- wordpress000net1
volumes:
- mysql000vol11:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: wordpress000db
MYSQL_USER: wordpress000kun
MYSQL_PASSWORD: wkunpass
wordpress000ex12: ...
WordPressコンテナを定義する
code:docker-compose.yml
wordpress000ex12:
depends_on:
- mysql000ex11
image: wordpress
networks:
- wordpress000net1
volumes:
- wordpress000ex12:/var/www/html
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST: mysql000ex11
WORDPRESS_DB_NAME: wordpress000db
WORDPRESS_DB_USER: wordpress000kun
WORDPRESS_DB_PASSWORD: wkunpass
コマンドを確認する
composeという上位コマンドを使う
up, down, stopを覚えておけばOK.upで作ってdownで止める
コマンドについて
code:dockerコマンド
#docker compose -f 定義ファイルのパス up オプション docker compose -f ~/Desktop/docker_kihon/docker-compose.yml up -d
docker compose up -d
名前について
docker-composeで作成した名前は、裏の名前がつく
docker composeコマンドで操作する時は、ymlで定義した名前で指定する
docker containerコマンドで操作するときは裏の名前を使う必要がある
実行しよう
code:error
docker compose up -d
service "wordpress000ex12" refers to undefined volume wordpress000ex12: invalid compose project
単純な構文エラー
今回は
volumes:
- wordpress000ex12:/var/www/html
ここが、正しくは「wordpress000vol12」だった
docker psでみてみる
code:terminal
docker ps
CONTAINER ID IMAGE ... PORTS NAMES
4ff454628505 wordpress ... 0.0.0.0:8085->80/tcp ex1-wordpress000ex12-1
74175da921a6 mysql:5.7 ... 3306/tcp, 33060/tcp ex1-mysql000ex11-1
裏の名前がついていることがわかる
できたら停止しよう
docker compose down
この時、イメージとボリュームは削除されないので、消したいなら手動で消す必要がある
docker volume ls
docker image lsとかで確認して、消す。
❗️何回か書いたほうが良さそうなので、redmineやmariaDB版も作ってみる
redmineのおさらい
ネットワークを作る
docker network create redmine000net2
MySQLコンテナを作る
docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
Redmineコンテナを作る
docker run -dit --name redmine000ex14 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine
docker-composeで作る
実際書いてわかったこと
code:docker-compose.yml
version:
services:
mysql:
image:
volumes:
-
networks:
- # ymlの下あたりで用意したネットワークやvolumeをここに入れる
apache: ...
networks:
redminenet: # <- 無記入ならこういうネットワークを作るということ
volumes:
redminevol: # <- 同じ。こういったボリュームを用意するということ
mysqlvol: # <- 同じ
Chapter8 Kubernetesについて
Kubernetes(クーベネティス)とは
k8sとも呼ぶ
コンテナのオーケストレーションツール。Dockerとは別のソフト
システム全体の統括をして、複数コンテナを管理する
誰が使うものなの
大規模システムにDockerを導入している保守エンジニア
なので、ここでは導入することでどういった恩恵を受けられるのかを覚えておく
いつ使う
Kubernetesは、複数のインスタンス(物理仮想問わず)1つ1つに、複数のコンテナがあることが前提
20個コンテナがあったら20回コマンドを実行するのは大変
docker composeでも複数インスタンスがあったらその数やらないといけないので大変
コンテナ作成や管理の煩雑さを、マニフェストファイルで定義して管理してくれるツール
マスターノードとワーカーノード
ノード: 物理的なマシンと同じようなもの
ワーカーノード上のコンテナを管理するマスターノード
実際のサーバー部分に当たる、コンテナを動かすワーカーノード
Docker Engineなどはこのノードでインストールして使用する
マスター・ワーカー構成のKubernetesをクラスタと呼ぶ
クラスタは自立して動く
マスターの内容に沿って、ワーカーを管理する
実際に使うことになったら、メモを取ろう
今やっても多分忘れそうなので...