こんにちは!TomoOne(@TomoOne4)です。
僕は、IT企業でマーケティングやセールスをやっています。
Dockerについての第2回目投稿です。
今回は、「Docker ImageでUbuntuのコンテナを構築し、コンテナの中を見てみる」までをやってみます。
UbuntuはLunuxのOSですのでこの上でWordPressなども動かす事ができますよ。
今回のポイント
- docker runの流れと意味
- Ubuntuイメージをコンテナで構築
- イメージレイヤーとは
ここで書く内容は、Udemy で受講できる、
かめ れおんさんの米国AI開発者がゼロから教えるDocker講座
で学んだ内容を自分の中で定着するために調べたり考えたりした内容を踏まえて進めていきます。
導入は文章より動画のほうがすっと入ってくる人も多いと思いますので、少し記事を読んでいただき
「Docker面白そうだし、簡単そう」
と思った人はぜひUdemyで米国AI開発者がゼロから教えるDocker講座を受けてみてください。
復習
復習をしておくと、
Dockerとは、
Docker はアプリケーションを開発(developing)・移動(shipping)・実行(running)するための、オープンなプラットフォームです。
Docker 概要
また、Dockerの特徴としては以下のようなものがあります。
Dockerやコンテナ、仮想化については第1回に書いておりますのでこちらをみてみてください!
Dockerの運用の概要
まずはDockerを運用する際の実際の開発側の動きを見ていきます。
一見、
ローカルでDocker Imageからコンテナっていうのを作って、開発をして、それを開発環境にあげて検証して、それからコンテナはおいておく?
みたいな疑問が出てくる人もいると思います。
Dockerで開発の環境を見事にかんたんに同じにする
実際には、
開発者の環境は必ず同じ環境にしておかないといけないわけですが、コンテナを使わない場合は、
開発者それぞれの環境に開発環境を構築するために様々なライブラリやソフトウェアを入れて、同じにしてくという作業になります。
でも、開発者がみんな同じPCの環境を維持しているというのはかなり難しいですよね。。。
そこで、Dockerとコンテナの登場です。
Docker上で、同じコンテナをDocker Imageから構築し、開発をしていけば「はい。完了!」
にできるからです。
ここが本質になります。
共有テスト環境の使い方
また、コンテナは、つねにテスト環境に置いておくわけではありません。
自分の開発環境で作ったものをテスト環境でテストする場合は、そのコードとDocker Imageをテスト環境に置きます。
すると、テスト環境では、コード実行のプログラムがありそれが実行されてExitします。
テスト完了。
というような使い方になります。
DockerでUbuntuコンテナを作成、操作
さて、ここからは実際にubuntuのDocker Imageを使ってみましょう。
コマンドはこちら1発でOKです。
docker run -it ubuntu bash
docker runコマンドにオプション -itというのがつけてあります。
コマンドにはオプションが用意されていることが多く、そのオプションを使うことでより細かい命令を伝えることができます。
かめさんの動画と、Dockerリファレンスのdocker run部分をあわせてみてみると、
- -i:input・・・インプット可能にする
- -t:表示がきれいになる(Allocate a pseudo-tty)
※ttyというのはWikipediaによるとこう書いてあります。昔の名残の名前のようです。
ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。
tty
ということですが、表示がきれいになるで覚えておいていいと思います。
さらに、リファレンスではこう書いてあります。
(シェルのような)インタラクティブなプロセスでは、コンテナのプロセスに対して tty を割り当てるために、 -i -t を一緒に使う必要があります。後の例で出てきますが -i -t は -it と書けます。
Docker run リファレンス
-itで覚えましょう。
その後ろにあるbashですが、
コンテナの起動時に実行させるプログラムとして、bashを指定しています。ubuntuのbashを起動させるということになります。
※コンテナの中のbashに対してコミュニケーションを取るためのbashを実行させている。
それでは、
docker run -it ubuntu bash
を実行してみます。
するとなんか色々pullされて、
root@7d63192d0439:/#
のような表示が出てきます。
これで、rootユーザーでDocker上のコンテナに入ってbashを実行させているという状態ができました。
※今は、
OSはMacOSではなくUbuntuになっています。
@の後ろは、コンテナのIDになっています。
確かめてみましょう。
まずは現在いるディレクトリを確認。(コマンド:pwd)
root@7d63192d0439:/# pwd
/
ルート直下にいます。
続いて、そこにあるファイルとディレクトリ一覧を見やすく確認。(コマンド:ls -l)
root@7d63192d0439:/# ls -l
total 48
lrwxrwxrwx 1 root root 7 Jul 3 01:56 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 15 11:09 boot
drwxr-xr-x 5 root root 360 Aug 9 02:25 dev
drwxr-xr-x 1 root root 4096 Aug 9 02:25 etc
drwxr-xr-x 2 root root 4096 Apr 15 11:09 home
lrwxrwxrwx 1 root root 7 Jul 3 01:56 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Jul 3 01:56 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Jul 3 01:56 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Jul 3 01:56 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Jul 3 01:57 media
drwxr-xr-x 2 root root 4096 Jul 3 01:57 mnt
drwxr-xr-x 2 root root 4096 Jul 3 01:57 opt
dr-xr-xr-x 179 root root 0 Aug 9 02:25 proc
drwx------ 2 root root 4096 Jul 3 02:00 root
drwxr-xr-x 1 root root 4096 Jul 6 21:56 run
lrwxrwxrwx 1 root root 8 Jul 3 01:56 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Jul 3 01:57 srv
dr-xr-xr-x 12 root root 0 Aug 9 02:25 sys
drwxrwxrwt 2 root root 4096 Jul 3 02:00 tmp
drwxr-xr-x 1 root root 4096 Jul 3 01:57 usr
drwxr-xr-x 1 root root 4096 Jul 3 02:00 var
ルート直下なので、重要なシステムファイルがたくさん出てきますね。
自分のMacにはないファイルやディレクトリということがわかると思います。
コンテナに構築したUbuntu上にいることがわかりますね。
色々ここでコマンド打って見ると面白いです!
壊したら消せばいいだけなので(^^)
Docker Imageはイメージレイヤー
さて、
ここで今回、docker runをした際に
色々pullしてきたものがあったかと思います。
それが、イメージレイヤーというもので、実はDocker Imageはイメージレイヤーという層の重なりで構成されています。
同じDocker Imageからpullされたイメージレイヤーでは当然同じイメージレイヤーが存在します。
その上で開発をしていくわけですが、開発後にできる新しいDocker Imageでイメージレイヤーが追加されていた場合、そもそものDocker Imageにあるイメージレイヤーを参照するため、同じイメージレイヤーを何度も作るようなことはしない、非常に効率的になります。
新しくイメージレイヤーが追加された場合は、
すでにあるレイヤー + 新しく追加されたイメージレイヤー
が保存されることになります。
これは、
同じDocker Imageから複数のコンテナを作るときに、
複数のコンテナで同じイメージレイヤーをシェアするようになるのでスペースの節約ができるのです。
まとめ
今回は、実際に手を動かすところは少なかったですがDockerでの開発の流れと、UbuntuのDocker Imageをrunしてbashでコマンド打ってみるところ、
そして、肝となるイメージレイヤーについて取り上げてきました。
だんだん分かってくると面白いですよね!
次は、runしたUbuntuを使っていきます!