2019/05/26

Docker再び (1)

会社でdockerを使う人が増えてきた。
そろそろ、普通に使えるようにならないとまずい気がしている。

「普通に」というのは、gitと同じくらいに、という目標だ。
未だにgitは最低限の使い方しか分かっていないのだが、一連の使い方だけは何とかわかっている。
そのくらいにdockerも使えるようになりたい。


まず、インストール。
Windowsで使うのは面倒そうだから、VirtualBoxに入っているUbuntu18.04を使う。

$ sudo snap install docker

aptでもよさそうだったが、たまにはsnapを使ってみた。意味は無い。


会社の人が作ってくれたdockerの環境?があって、「docker-compose upで使えます」と書いてあったのだが、エラーになってしまった。

ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.

では、とstartの方をやってみるも、

$ docker-machine start default
Docker machine "default" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.

といわれ、

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

となり、何も入っていないから?じゃなかろうかと思い至った。


こちらがわかりやすそうだし、記事も新しい。

初心者による初心者のためのDocker入門 その1 dockerコマンド編 - Qiita
https://qiita.com/k5n/items/2212b87feac5ebc33ecb

まねしてみよう。

$ docker --version
Docker version 18.06.1-ce, build e68fc7a

$ docker info
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/info: dial unix /var/run/docker.sock: connect: permission denied

infoの方は、sudoすると大丈夫だった。
これは、wiresharkみたいにgroupに入ってないとsudoがいるとか、そんな状況だろうか?と一度ログアウトしたが、groupsには変化無し。

Post-installation steps for Linux | Docker Documentation
https://docs.docker.com/install/linux/linux-postinstall/

やってみたのだが・・・ダメだ。
logoutだけじゃダメなのか?と再起動させたらうまくいった。
dockerのインストール直後だったからとか、そんな理由だろうか。



まずは、Dockerfileを書いて動かしてみる。

01: FROM ubuntu:18.04
02: 
03: WORKDIR /home/test1
04: 
05: COPY ./hello.sh .
06: RUN chmod u+x hello.sh

$ ls
Dockerfile  hello.sh

こういう状態だ。

いろいろやる前に、作った後に残ってしまうものを見ておこう。

$ docker ps -a
$ docker images
$ docker volume ls

psはコンテナ、imagesはイメージ、volumeはボリューム。

$ docker build .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
6abc03819f3e: Pull complete
05731e63f211: Pull complete
0bd67c50d6be: Pull complete
Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
Status: Downloaded newer image for ubuntu:18.04
  ---> 7698f282e524
Step 2/4 : WORKDIR /home/test1
  ---> Running in 6550de92a4f1
Removing intermediate container 6550de92a4f1
  ---> be4621850690
Step 3/4 : COPY ./hello.sh .
  ---> c8ed39d84c87
Step 4/4 : RUN chmod u+x hello.sh
  ---> Running in 975768131ed3
Removing intermediate container 975768131ed3
  ---> 4fca424e9a1f
Successfully built 4fca424e9a1f

この後でpsなどを見てみると、imagesだけ追加されていた。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              4fca424e9a1f        18 seconds ago      69.9MB
ubuntu              18.04               7698f282e524        10 days ago         69.9MB

「docker rmi <IMAGE_ID>」で消せるらしい。

$ docker volume ls
DRIVER              VOLUME NAME
hiroshi@hovbox:~/Docker/test1$ docker rmi 4fca424e9a1f
Deleted: sha256:4fca424e9a1fd6df28749d8b1ae9d706102f00d66d0d24262cca979695873123
Deleted: sha256:9be2fcbef0ecb97b76eb0e86a2799056ec5a70ee00c059f22e5d694a051385a1
Deleted: sha256:c8ed39d84c87339175b4a8887a2d8c9edcde49c2a8978e2cdf96892ab62689d9
Deleted: sha256:16bbca6f39f10b7662157dbc172f173eae465f7c811f68e80c0e94bddec690f2
Deleted: sha256:be4621850690eacc45bb36d325d78792401fbaecbfe28fd112ffc01bf6d95132
Deleted: sha256:ea36e6278c0cecf6bfda420169372579ce9dee75c0b1ac91b78f1c77bdd4d793

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               7698f282e524        10 days ago         69.9MB

消えた。
「docker rmi $(docker images -q)」などとすると、全部消してくれるようだ。
今回のように遊んでいる場合には助かるな。


docker buildコマンドはイメージを作るコマンドだった。
C++とかでいうところのclassみたいなもので、イメージから作ったインスタンスがコンテナという呼び名になるようだ。

というわけで、次はコンテナの作成(実行?)だ。

$ docker run -i <IMAGE_ID>

こうすると、docker psで見えるようになった。

$ docker exec -it 8bf1dbf1b61d /bin/bash
root@8bf1dbf1b61d:/home/test1#

-iはstdinを開け続けたままになるらしい。
-tは疑似tty。

-iだけだと何も出てこないのだが、そのままlsみたいなコマンド入力ができて結果も返ってくる。
まあ、せっかくだから-itと両方指定しておこう。


ちなみに、docker runの-iも同じ意味のようで、そこにコマンドを打つと結果が返ってきた。
-itにすると疑似コンソールもセットで動いてくれて便利だ。
どちらも無しの場合は、するっと終わってしまってpsにも出てこないようだった。


ここまでやると、コンソールでログインしたような感じになる。
exec直後は/home/test1にいるので、DockerfileのWORKDIRがデフォルト位置なのだろう。
hello.shも普通に実行できる。
touchなんかでファイル作成もできる。

この状態から抜けるには、exitと打つ。
そうすると、docker psにも出てこなくなる。
ただ、もう一度runしても作ったファイルは消えている。


が、docker ps -aと打つといろいろ出てきた。
動かしたコンテナの一覧というか、履歴が見えるのか。

では、そのコンテナIDでdocker execできるかというと、そういうわけでもないようだ。
何に使う一覧なのだろう?
まあいいや。



ps -aで見えるコンテナを全部消したいときは、こうやるとよいそうだ。

Dockerコンテナを一発ですべて削除する - かべぎわブログ
https://www.kabegiwablog.com/entry/2018/07/24/140000

groupに追加しているのでsudoはいらないが、ともかく全部消せるのは助かる。


さて、ここまでで追加されなかったvolume。
これはファイルを残しておきたい場合らしい。
毎回消えると不便なものもあるし。

$ docker run -it 1c5488890354 --mount type=volume,src=masao,dst=/home/tmp /bin/bash
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"--mount\": executable file not found in $PATH": unknown.

むむ?

$ docker run -it --mount type=volume,src=masao,dst=/home/tmp 1c5488890354 /bin/bash
root@7d6aef092f85:/home/test1#

引数の順番の問題だった。

コンテナに/home/tmpはできていたのだが、そこにファイルを置いてもカレントディレクトリに作ったmasaoフォルダには入っていない。
が、コンテナを入り直しても/home/tmpに作ったファイルは残っている。

ということは・・・。

$ docker volume ls
DRIVER              VOLUME NAME
local               masao

なるほど、srcに書くのはパスではなくてボリューム名なのだな。
-vを使ってフルパス指定できるそうだ。

http://docs.docker.jp/engine/userguide/dockervolumes.html#id5

$ docker run -it -v `pwd`/masao:/home/tmp 1c5488890354 /bin/bash


検索していると、-vと--mountが使われていたのだが、何が違うのだろうか?

https://docs.docker.com/storage/volumes/#choose-the--v-or---mount-flag

-vは--volumeのshort optionらしい。
で、中身はあまり読んでいないが--mountでやってみよう、とわざわざ書いているので、私もそうしよう。

$ docker run -it --mount type=bind,src=`pwd`/masao,dst=/home/tmp 1c5488890354 /bin/bash


まだネットワーク周りなどは調べていないが、最初はこのくらいにしておこう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。