空っぽの環境をつくるところから学習を始める(docker)
virtual boxが立ち上がらなくなった
前回はvagrantを使って実験用の環境をローカルに確保しようと試みました。
しかしながら問題が発生。
仕事だとOSにUbuntuを使っているんですが、あるときからvirtual boxで仮想マシンを立ち上げようとすると、PCがフリーズするという事象に見舞われるようになりました。
このままだと「空っぽの環境から云々」の趣旨を達成できなくなってしまうので、回避策的にDockerでUbuntuを立ち上げてみます。
まあ、ローカルマシンで確認のためにやってることなのでここで生じる差異については許されたい。。。
仮想化とかコンテナとかの話は、また別途ちゃんと記事に書きたいと思っています。
本日はひとまずセットアップ。
20180216追記;
このフリーズ事象は解決できました。
docker-ce のインストール
ホストOSへDockerをインストールします。
ここは公式ドキュメントがしっかりしていて、もうコマンドをコピペするだけでできてしまいます。
日本語のドキュメントもあるようですね。
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なのかで書き方読み方が変わる箇所が出てくるかと思うんですが、そこはなんか備忘録なんで許してください。