shiba-hiro’s 備忘録

技術ブログの皮を被ったただの備忘録

空っぽの環境をつくるところから学習を始める(docker)

virtual boxが立ち上がらなくなった

前回はvagrantを使って実験用の環境をローカルに確保しようと試みました。

shiba-hiro.hatenablog.com

しかしながら問題が発生。
仕事だとOSにUbuntuを使っているんですが、あるときからvirtual boxで仮想マシンを立ち上げようとすると、PCがフリーズするという事象に見舞われるようになりました。
このままだと「空っぽの環境から云々」の趣旨を達成できなくなってしまうので、回避策的にDockerでUbuntuを立ち上げてみます。

まあ、ローカルマシンで確認のためにやってることなのでここで生じる差異については許されたい。。。
仮想化とかコンテナとかの話は、また別途ちゃんと記事に書きたいと思っています。
本日はひとまずセットアップ。

20180216追記;
このフリーズ事象は解決できました。

shiba-hiro.hatenablog.com

docker-ce のインストール

ホストOSへDockerをインストールします。
ここは公式ドキュメントがしっかりしていて、もうコマンドをコピペするだけでできてしまいます。

docs.docker.com

日本語のドキュメントもあるようですね。

http://docs.docker.jp/engine/installation/linux/docker-ce/ubuntu.html

# 必要な諸々のパッケージをインストール
$ sudo apt-get update
$ sudo apt-get install -y \
>    apt-transport-https \
>    ca-certificates \
>    curl \
>    software-properties-common

# GPG鍵の取得と設定
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# リポジトリの設定
$ sudo add-apt-repository \
>    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
>    $(lsb_release -cs) \
>    stable"

# dockerのインストール
$ sudo apt-get update
$ sudo apt-get install -y docker-ce

# サンプルイメージの起動
$ sudo docker run hello-world
...
Hello from Docker!
...

dockerでubuntuを立ち上げる

ではdockerでubuntuを立ち上げます。

$ sudo docker run -td --name ubuntu-on-docker ubuntu

イメージの取得もrunのタイミングで勝手にやってくれます。

-d は、バックグラウンドでdockerのプロセスを実行させることを命じるオプションです。
走らせたdockerには、それぞれフォアグラウンドで実行しているプロセスがあります。
(そのプロセス自体を走らせないと、コンテナが走りません)
そのプロセスを、ホストから見てバックグラウンドで実行させるためのコマンド、という感じでしょうか。

-tは擬似端末の割り当てです。これを入れてあげないとUbuntuのコンテナは走ってくれません。

--nameはコンテナ名の指定ですね。
いちいち生成されるidを使って操作するのはイケてないので、コンテナ名を付与して操作していくようにしましょう。

さて、やりたいことは「空っぽの環境の中でいろいろやる」ということです。
ここまでで、 vagrant upしたのと似たような状況になったのですが、vagrant sshに相当する操作が必要です。
そこで、次のコマンドを打って、コンテナの中に「入って」みます。

$ sudo docker exec -it ubuntu-on-docker /bin/bash

docker execはコンテナに特定のコマンドを実行させます。
このケースだと、bashを実行することで、vagrant ssh的な操作を実現します。

-tは先述のものと同様。
-iはコンテナ内の入力をホストの入力と結びつける役割を果たすもの(らしい)です。

なので、こうするとdockerのコンテナの中でbashコマンドが実行できます。

$ sudo docker exec -it ubuntu-on-docker /bin/bash

# docker コンテナ内へ操作が移る
root@5c930a81d61c:/# 

root@d36e655ec845:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

root@d36e655ec845:/# cd ~

root@d36e655ec845:~# echo "hello world"
hello world

これでほぼやりたい準備は整ったんですが、ここからあとの操作をスムーズにやるために、sudoコマンドくらいは入れておきましょう。

root@d36e655ec845:~# apt-get update
root@d36e655ec845:~# apt-get install -y sudo
root@d36e655ec845:~# rm -rf /var/lib/apt/lists/*

これで、vagrantで立ち上げたときとの微妙な差異は、インストール等行って適宜解消していけます。
参考: https://github.com/tianon/docker-brew-ubuntu-core/issues/48

docker のコンテナから抜けるときはexitを叩けばOKです。

root@d36e655ec845:~# exit
exit

# ホストOSに操作が戻る
$ 

dockerコンテナに関して、本当にとりあえず知っておけばいいコマンドは下記くらいなものでしょうか。
docker run: コンテナの起動
docker stop: コンテナの停止
docker rm: コンテナの破棄。-fオプションの併用で起動中のコンテナでも破棄できる。
docker ps: コンテナの一覧表示。-aオプションの併用で停止中のコンテナも表示できる。
docker images: 手元にあるdockerイメージの一覧表示。
docker search: 入力したtermに応じてリポジトリ内のイメージを検索、表示。

ということで、次は本当に空っぽのUbuntu内でJavaを実行してみます。

なおプライベートで利用しているPCはMacbook airで、こちらは問題なくvagrantを利用した仮想マシンの起動が利用できています。
なのでこの先、ところどころ、docker上のubuntuなのかVM上のubuntuなのかで書き方読み方が変わる箇所が出てくるかと思うんですが、そこはなんか備忘録なんで許してください。