Dockerってやつが便利らしいので、VMの代わりの開発環境として使ってみる。

とりあえずdebianのイメージをpullしてくる
> docker pull debian
確認
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian latest 72b624312240 8 days ago 124MB

立ち上げる前に、現在の状況を確認
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
今は何もない。
先程pullしてきたイメージからdebianを起動してみる。
> docker run -it debian
root@908d23d47128:/#
なんか別のシェル?が立ち上がったっぽい。これでdebianの中に入れたのかな?
(docker run --name hogehoge -it debian で名前をつけて作成できる)
ここからはctrl+p -> q
で抜けられるらしい。(これをデタッチと呼ぶみたい)
普通にexitするとコンテナも停止してしまうらしい。気をつけないとな。
とりあえず抜けてみる。
抜けられないとおもったら、ctrp + p -> q
じゃなくて、ctrl押しながらp押しながらqだった。
root@908d23d47128:/# >
わかりにくいけど、とりあえず抜けられた。
ここでさっきのpsコマンドで状況を確認してみる。
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
908d23d47128 debian "bash" 5 minutes ago Up 5 minutes friendly_pascal
これでコンテナは立ち上がったまま抜けられたことを確認できた。

さっき抜けたdebianに、もう一度入ってみる。このことをアタッチって呼ぶらしい。
> docker attach friendly_pascal
root@908d23d47128:/#
さっきnameをちゃんと指定しておけばよかった。けどとりあえずもう1度入れたので良しとする。
そしたら今度はexitしてみる。
root@908d23d47128:/# exit
exit
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
普通にexitできた。docker ps
コマンドで確認してもちゃんと終了されているっぽい。
-aで立ち上がってないコンテナも確認できるらしいので試してみる。
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
908d23d47128 debian "bash" 10 minutes ago Exited (0) About a minute ago friendly_pascal
ちゃんと表示されてる。

さっきexitしたコンテナをもう1度起動してみる。
今度はrunではなくstartをするらしい。
> docker start friendly_pascal
friendly_pascal
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
908d23d47128 debian "bash" 13 minutes ago Up 7 seconds friendly_pascal
これで再度起動できた。
docker stop
コマンドもあるらしいけどとりあえず起動したままやりたいことをやっていく。

このスクラップの目的が、Dockerを使ってVMの代わりに開発環境として使ってみることなので、さっきのdebianにアタッチしてc言語のコードを書いてコンパイルするまでやってみる。
とりあずホームディレクトリに移動
root@908d23d47128:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@908d23d47128:/# cd
root@908d23d47128:~# ls
root@908d23d47128:~#
vimでhello worldを書いてみる。
root@908d23d47128:~# vim hello.c
bash: vim: command not found
vimが入ってないらしい。
ならばインストールしよう。
root@908d23d47128:~# sudo apt install vim
bash: sudo: command not found
ほう。
sudoつけなくてもapt updateとapt upgradeはできそうなのでした。
というかrootでログインされてるのか。
普通にapt install vim
でインストールできた。

気を取り直して、cのコードを書いていく。
root@908d23d47128:~# cat hello.c
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return (0);
}
コンパイルしてみる。
> gcc hello.c
bash: gcc: command not found
ですよね。
apt install gcc
でインストール
気を取り直して
root@908d23d47128:~# gcc hello.c
root@908d23d47128:~# ./a.out
Hello, World!
root@908d23d47128:~#
いけた!

そしてこのファイルは保存されるのか気になるので、exitしてみる。
root@908d23d47128:~# exit
exit
root@908d23d47128:~# exit
exit
>
何故か1回では抜けられなかったけど一応抜けれた。
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ちゃんとコンテナは終了できたっぽい。
再度起動してさっきのファイルが残ってるか確認してみる。
> docker start friendly_pascal
friendly_pascal
> docker attach friendly_pascal
root@908d23d47128:/# cd
root@908d23d47128:~# ls
a.out hello.c
root@908d23d47128:~#
ちゃんと残ってた。
dockerって、必要なものとかは全部Dockerfileに書いておかなきゃいけなくて、再起動するたびに全部元に戻るみたいなイメージがあったけど、そんなことはないらしい。
これなら私の用途的には普通にVMの代わりに使えそう。
他にも色々試してみたいことはあるけど今日はここまで。

参考にさせていただいたページ
参考というかやってることはほぼそのまま。

コンテナの消去
docker rm [コンテナid]