会社で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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。