Docker初心者のUbuntuコンテナ起動1(Mac)

スポンサーリンク
Moby-logo Docker
この記事は約9分で読めます。

こんにちは!TomoOne(@TomoOne4)です。

僕は、IT企業でマーケティングやセールスをやっています。

Dockerについての第2回目投稿です。

今回は、「Docker ImageでUbuntuのコンテナを構築し、コンテナの中を見てみる」までをやってみます。

UbuntuはLunuxのOSですのでこの上でWordPressなども動かす事ができますよ。

今回のポイント

  1. docker runの流れと意味
  2. Ubuntuイメージをコンテナで構築
  3. イメージレイヤーとは

ここで書く内容は、Udemy で受講できる、
かめ れおんさんの米国AI開発者がゼロから教えるDocker講座

で学んだ内容を自分の中で定着するために調べたり考えたりした内容を踏まえて進めていきます。

導入は文章より動画のほうがすっと入ってくる人も多いと思いますので、少し記事を読んでいただき

「Docker面白そうだし、簡単そう」

と思った人はぜひUdemyで米国AI開発者がゼロから教えるDocker講座を受けてみてください。

スポンサーリンク

復習

復習をしておくと、

Dockerとは、

Docker はアプリケーションを開発(developing)・移動(shipping)・実行(running)するための、オープンなプラットフォームです。

Docker 概要

また、Dockerの特徴としては以下のようなものがあります。

  1. 動作するOSは1つなので、消費リソースが少なくて済む。
  2. コンテナ起動は、OS的には単純にプロセスが起動しているだけなので、起動がとても速くなる。
  3. 1コンテナ1プロセスの環境が作れる。

Dockerやコンテナ、仮想化については第1回に書いておりますのでこちらをみてみてください!

Dockerの運用の概要

まずはDockerを運用する際の実際の開発側の動きを見ていきます。

一見、

ローカルでDocker Imageからコンテナっていうのを作って、開発をして、それを開発環境にあげて検証して、それからコンテナはおいておく?

みたいな疑問が出てくる人もいると思います。

Dockerで開発の環境を見事にかんたんに同じにする

実際には、

開発者の環境は必ず同じ環境にしておかないといけないわけですが、コンテナを使わない場合は、

開発者それぞれの環境に開発環境を構築するために様々なライブラリやソフトウェアを入れて、同じにしてくという作業になります。

でも、開発者がみんな同じPCの環境を維持しているというのはかなり難しいですよね。。。

そこで、Dockerとコンテナの登場です。

Docker上で、同じコンテナをDocker Imageから構築し、開発をしていけば「はい。完了!」

にできるからです。

同じDocker Imageからそれぞれのコンテナを作って、

自分のコンテナで新しいDocker Imageを作ったらそれをDocker Hubに上げれば別の人が使えるようにできる。

ここが本質になります。

共有テスト環境の使い方

また、コンテナは、つねにテスト環境に置いておくわけではありません。

自分の開発環境で作ったものをテスト環境でテストする場合は、そのコードと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

を実行してみます。

docker runは指定したイメージがホストにあるかどうかを確認し、なければDocker Hubからpullしてくるので便利!

するとなんか色々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-main

さて、

ここで今回、docker runをした際に

色々pullしてきたものがあったかと思います。

それが、イメージレイヤーというもので、実はDocker Imageはイメージレイヤーという層の重なりで構成されています

同じDocker Imageからpullされたイメージレイヤーでは当然同じイメージレイヤーが存在します。

その上で開発をしていくわけですが、開発後にできる新しいDocker Imageでイメージレイヤーが追加されていた場合、そもそものDocker Imageにあるイメージレイヤーを参照するため、同じイメージレイヤーを何度も作るようなことはしない、非常に効率的になります。

新しくイメージレイヤーが追加された場合は、

すでにあるレイヤー + 新しく追加されたイメージレイヤー

が保存されることになります。

これは、

同じDocker Imageから複数のコンテナを作るときに、

複数のコンテナで同じイメージレイヤーをシェアするようになるのでスペースの節約ができるのです。

まとめ

今回は、実際に手を動かすところは少なかったですがDockerでの開発の流れと、UbuntuのDocker Imageをrunしてbashでコマンド打ってみるところ、

そして、肝となるイメージレイヤーについて取り上げてきました。

だんだん分かってくると面白いですよね!

次は、runしたUbuntuを使っていきます!

教材と参考資料

米国AI開発者がゼロから教えるDocker講座
AI開発のプロが徹底的に現場目線でわかりやすく教えます.Dockerを使って超本格的なデータサイエンスやWeb開発の環境が作れるようになります.
Dockerイメージのレイヤの考え方とイメージの軽量化について
Dockerイメージのレイヤの考え方と、Dockerイメージの軽量化について分かりやすく解説しています。
【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜 | SIOS Tech. Lab
こんにちは、サイオステクノロジー技術部 武井(Twitter:@noriyukitakei)です。タイトルが少々長いのですが、今回はこれからコンテナ、Docker、Kubernetesを始める人のための、入り口的なブログを書こうと思っております。つまり、コンテナとかDockerとかKubernetesって言葉は聞いたあ...
タイトルとURLをコピーしました