初めに
仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん
上記参考書を拝読し、勉強した内容をアウトプットのため投稿する
Dockerとは
MySQLやNginx等のプログラムをコンテナ化(独立した環境)して動かすことができる
また、Dockerを使用するには、Docker Engineが必要である
Dockerをコンテナ化するにはimage(isoファイルのような物)が必要になる
Dockerを使用するメリット
複数のシステムから連携されているシステムのバージョン管理
複数のシステムで同じシステムを参照している場合に、どちらのシステムも同じバージョンを使用かどうかは限らない
その場合に、参照しているシステムをコンテナ化してバージョンを複数用意できる
例:Webアプリが複数あり、同じRDBを参照している
しかし、WebアプリごとにRDBのバージョンを変更したい
その際に、RDBをDockerを使用してコンテナ化をすることで、異なるバージョンのRDBを参照できる
開発環境の差異を埋めることができる
Dockerはコンテナを配布することができる(配布される人もDockerを使用できるようになっていないといけない)
そのため、異なるOSで開発をしていても同じ環境で開発を行うことができる
また、同じようにコンテナを配布することで開発環境と本番環境の差異を埋めることもできる
Dockerの仕組み
構造
DockerはLinux上にDocker Engineを載せてその上でコンテナを動かす
また、コンテナの中には、Lixun OS(カーネルを除く)の一部機能を取り入れたものが入っている
これは、コンテナが独立した環境であるため、コンテナ内に何もなければLixunとのやりとりができないからである
カーネルを除いたOSの一部機能を導入しているためコンテナは動作が軽くなる
冒頭に記述した参考書ではコンテナに入っているOSのことを
OSっぽいもの
と記述している
これは、カーネルがないためそのような呼び方になっており、厳密なOS(カーネルが入っているもの)ではない
image
1つのimageから複数のコンテナを作成可能であり、コンテナからimageを作成することもできる
コンテナを使用する際の考え方
Dockerは、基本的に独立したコンテナをアップデートすることはなく、既存のコンテナを捨てて新しいコンテナを作成する
これは、コンテナの作成は容易であるDockerの特徴を生かした考え方である
コンテナを削除する際に、必要なデータが一緒に消えてしまうと困るので、その際には、物理マシンにマウントしてデータを保存して使う
Dockerの導入
導入方法
以下サイトを参照に導入できる
※ 2022年3月20日時点 MacOSでの導入
https://docs.docker.com/desktop/mac/install/
簡単な使用方法
Docker Engineは、コンテナ全体の管理に関わる操作(起動や停止)を行うもので、インストールと同時に起動している
コンテナはDocker Engineが停止していると一緒に停止するので、必要に応じて設定を変更する必要がある
macの場合は、ターミナルを開いてDockerの操作を行う
※DockerコマンドはWindowsでもMacでも共通である
Docker Engineは、Dockerコマンドを使用する
基本的なコマンドは以下
docker 「何を」「どうする」 (オプション) 「対象」 (引数)
「何を」の部分には以下が入る
container
image
volume
network Docker
checkpoint
node
plugin
secret
service
stack
swarm
system
普段使いしそうなコマンド
Dockerのバージョン確認
docker version
コンテナ系
イメージのダウンロード、コンテナの作成、起動を一括で行う
docker run --name (コンテナ名)
実際に走るコマンド
docker pull
docker create
docker start
コンテナ一覧
docker ps
コンテナ一覧(停止状態含む)
docker ps -a
コンテナ停止
docker stop (コンテナ名)
コンテナ削除
コンテナの削除を行う場合は、コンテナが停止していないといけない
また、コンテナの削除をしてもイメージは残る
docker rm (コンテナID)
イメージ系
イメージ一覧
docker image ls
イメージ削除
イメージ削除の際は、コンテナが削除されていないとエラーになる
docker image rm (イメージID)
ネットワーク系
ネットワークの作成
docker network create (ネットワーク名)
ネットワークの削除
docker network rm (ネットワーク名)
ファイルのコピー
ホストからコンテナへコピー
docker cp ホストのパス コンテナ名:コンテナ側パス
コンテナからホストへコピー
docker cp コンテナ名:コンテナ側パス ホストのパス
ボリュームのマウント
用語に関して
ボリューム・・・ストーレージの一部を切り取ったもの
マウント・・・記憶領域をフォルダ等に取り付ける
マウントする理由
Dockerでは、コンテナをアップデートすることはなく、削除して新たに作成することが多い
コンテナを削除するとデータも一緒に消えてしまうので、データを残しておけるようにマウントする
ボリュームマウント
Docker Engine管理下の領域にボリュームを作成し、コンテナにマウントする
特徴は以下
・誤って削除することなどが少ない(コンテナを経由しないと確認できない)
・使用しているパソコンのOSに依存しない(パスなど)
・Dockerが推奨している
バインドマウント
Docker Engine管理外の、DockerをインストールしたOS等に対して、フォルダやファイルをマウントする
コンテナを経由しなくとも確認できることが特徴
tmpfsマウント
デイスクではなく、メモリをマウントする
アクセスが高速になることが特徴
マウント系の普段使いしそうなコマンド
ボリュームの作成
docker volume create (ボリューム名)
ボリュームの削除
docker volume rm (ボリューム名)
ボリュームの一覧
docker volume ls
ボリュームの詳細
docker volume inspact (ボリューム名)
バインドマウントの例
docker run -v 実際のパス:コンテナのパス
ボリュームマウントの例
docker run -v ボリューム名:コンテナのパス
コンテナのイメージ化
コンテナをイメージ化することによって、コンテナを複製したり、他のパソコン等に移動できる
comiitでイメージを書き出すか、Dockerfileでイメージを作成する方法がある
commit利用時のコマンド
docker commit コンテナ名(任意) イメージ名(任意)
Dockerfile利用時のコマンド
Dockerfile自体には、元にするイメージ、イメージに追加したファイルなどの情報を記載する
docker build -t イメージ名(任意) フォルダのパス(任意)
作成したイメージは、saveコマンドでtarファイルにする
docker save -o ファイル名.tar 作成したイメージ名
Docker・コンテナへの命令
Docker Engineに対しての命令では、今までのようにdockerコマンドを使用していたが、コンテナに対してはshellを利用する
bashを起動させるコマンド
docker exec -it コンテナ名 /bin/bash
bashを起動させた後はdockerコマンドを使用できないため以下のコマンドで一旦bashから抜ける必要がある
exit