この記事について
■ 対象:IT初心者しょぼん君:(´・ω・`)
・初心者向け、イメージを掴むキッカケになることが目的の記事
・砕いた理解であり、一部正確ではない場合があります。
■ しょぼん君のぼやき
しょぼん君:(´・ω・`)『コンテナ化ってどゆこと』
コンテナとは
コンテナとは、OSやカーネルを共通する自己完結のソフトです。
最初はアプリケーションを動かす方法・場所とイメージしたら良いかもしれません。
コンテナ と聞くと、箱のようなイメージを持つかもしれませんね。実際に港などにあるコンテナと絡めた解説もよくあるかもしれませんが、あまり単語にこだわらなくても良いです。
これまで開発したアプリを動かす場合はどうしていたでしょうか。
しょぼん君:(´・ω・`)『実効環境にアプリを置いて動かすな』
はい、サーバー上の実効環境にアプリケーションをデプロイをして動かしたりしますよね。
この方法はポピュラーです。この時アプリケーションはどこで動いているの?というとサーバーです。そりゃそうですね。
しかし、技術は進歩し人類はアプリケーションの構成・ライブラリ・プロセスなどをまとめ1つのプロセスとして稼働させたのであります。そしてそれを「コンテナ」と名づけたのであった!
〜 終 〜
しょぼん君:(´・ω・`)『終わるな』
簡易的な図ですが、基盤となるLinuxサーバーのOS機能(カーネルなど)を使い、コンテナランタイムと呼ばれるものがサーバーからリソースなどレンタルして、アプリをプロセスとして稼働させる場を提供しています。
そして、このような技術や提供される空間のことをコンテナと呼んでいます。
しょぼん君:(´・ω・`)『サーバーとの間になんかおるんだね』
別空間という点では、仮想サーバーと似ていると感じるかもしれませんが異なります。
例えば、仮想サーバーではOSレベルで仮想環境を分離するため目的やメリットが異なります(LinuxやWindowsなど様々なOSを混在させることが可能など)
コンテナではOSを含まないことで軽量でありつつも、基盤となるLinuxサーバーのOSバージョンや他のアプリケーションの変更による影響が最小限になる点がメリットの1つです。また、別のサーバー上で同じアプリケーションを起動する際にも、コンテナランタイムが導入されていればすぐに同環境で起動することが可能であり、再利用性にも優れています。
しょぼん君:(´・ω・`)『環境依存が少ないのはいいね』
設定方法など、コンテナ起動までの流れは実際にコンテナを起動して体感してみましょう。
Docker
コンテナは、Dockerなどのコンテナランタイムを含むコンテナを管理するためのソフトウェアを導入して利用します。
(0)Dockerインストール(Docker for Mac)
まずは、Dockerをインストールします。利用するには Docker ID が必要です。
まだ持っていない場合は、以下から「Docker ID」を取得します。
ID取得後、ソフトウェアをダウンロードしましょう。
https://store.docker.com/editions/community/docker-ce-desktop-mac
ダウンロードした「Docer.dmg」を実行し、作成した「Docker ID」でログインします。
アプリケーションからDockerを起動し、ターミナルでDockerコマンドが使えるか確認してみましょう
% docker version
(1) Dockerfile を作成
コンテナは、バージョンの指定や、ディレクトリ構成などの構築設定をコードベースで管理(Infrastructure as Code)します。
Dockerでは、Dockerfileと呼ばれる、構築内容が書かれたファイル(構築内容が書かれたレシピ)をベースにして構築するため、まずは任意のディレクトリでDockerfileを作成しましょう。
今回は流れを把握するために単純なサンプルファイルを用意しました。
% mkdir Docker && cd $_ && vi Dockerfile
# 内容サンプル
FROM ubuntu:18.04
RUN echo "Hello world" > /tmp/test
FROM <レポジトリ:タグ>
コンテナの基になるイメージを指定。
FROM命令では、コンテナの基となるイメージを指定しますが、ローカルにない場合はDockerレジストリ(docker hub など)からダウンロードされます。
RUN <コマンド>
コマンドを実行
(2) Build
作成したDckerfileでビルドを実行すると image が生成されます。
これはアプリケーションや依存関係を1つにまとめたファイルで、コンテナを起動するための元になります。
しょぼん君:(´・ω・`)『じゃあ再利用したい時は image を共有したらいいんだね』
ビルドの際は、管理しやすいように名前やタグをつけるのがオススメです。
今回は、shobon_imageという名前で、タグとしてバージョン1.0をつけてみました。
% docker build -t shobon_image:1.0 .
Sending build context to Docker daemon 9.216kB
Step 1/1 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
35c102085707: Pull complete
251f5509d51d: Pull complete
8e829fe70a46: Pull complete
6001e1789921: Pull complete
Digest: sha256:d1d454df0f579c6be4d8161d227462d69e163a8ff9d20a847533989cf0c94d90
Status: Downloaded newer image for ubuntu:18.04
---> a2a15febcdf3
Successfully built a2a15febcdf3
Successfully tagged shobon_image:1.0
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shobon_image 1.0 df4620745396 16 seconds ago 64.2MB
ubuntu 18.04 a2a15febcdf3 7 days ago 64.2MB
(3)RUN_起動
作成したイメージを指定し、コンテナを起動します。
起動したら、Dockerのプロセスとして動いたか確認してみましょう。
% docker run --name shobon_contener -itd shobon_image:1.0 /bin/bash
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edb3215685ee shobon_image:1.0 "/bin/bash" 3 seconds ago Up 2 seconds shobon
Dockerfileに記載した内容で構築されたかコンテナ内部にログインして確認します。
# execコマンドでコンテナ名やコンテナIDを指定し、コンテナにログインします。
% docker exec -it shobon /bin/bash
# コンテナ内部に入れたので、作成したtestファイルが存在するか確認
root@edb3215685ee:/# ls /tmp/
test
# OSのバージョン確認
root@edb3215685ee:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Dockerfileで設定した内容で構築されていることが確認できました。
しょぼん君:(`・ω・´)『Dcokerfikeで記載した内容でDockerプロセスとしてコンテナが起動するということがわかった』
ーENDー
Tips
お掃除
Dockerでコンテナを起動していると、たくさんのimageやpsが溜まってくるので不要なものは削除します。
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edb3215685ee shobon_image:1.0 "/bin/bash" 29 minutes ago Up 29 minutes shobon
% docker stop edb3215685ee
edb3215685ee
% docker rm edb3215685ee
edb3215685ee
この時点では、image残っているため再度起動することが出来ます。
imageも消してしまいましょう。
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shobon_image 1.0 6f2828748274 34 minutes ago 63.1MB
% docker rmi 6f2828748274
Untagged: shobon_image:1.0
Deleted: sha256:6f282874827492876f496dfc26c1eb0174eec8a2ecec543f2b15d078c06f3d74
Appendix
■ リンク