Docker意味わからん。Docker知らないとヤバいとか言うけど、いつの間にそんな話になったの。
自分の備忘録です。間違いがあればお許しを。
Imageを探す – docker search –
Docker HubにあるDockerイメージを検索する。
公式のものから個人が作ったものまである。
ブラウザで検索してもいいけど、コマンドもある。
docker search centos | more
| moreをつければたくさん出てくる。つけなければ25件くらい出てくる。
Imageを引っ張る – docker pull –
公式サイトからイメージを引っ張るコマンド。
centosならば下記のように指定する。
docker pull centos
Docker Hubを見ると、検索したイメージを取得するには何というコマンド入力すればいいか書いてあるので難しくはない。
取得したImageを一覧表示する – docker images –
コマンド上で一覧で見る方法
docker images
- REPOSITORY イメージの名前
- TAG バージョンを示すタグ latestは最新
- IMAGE ID IDがこのイメージの実体
- CREATED 作られた日付
- SIZE 容量
タグが違っても同じイメージならば同じものと見ればいい。
Imageの詳細を見る – docker inspect –
命令文はdocker inspect。その後に指定するものは
- IMAGE ID
- REPOSITORY
- REPOSITORY:TAG
以上の3つになる。2はTAGの省略形でlatestを意味することになる。
使い方の例としてはこんな感じ。
docker inspect centos docker inspect centos:centos6 docker inspect 300e315adb2f
Imageの削除 – docker rmi –
イメージを削除するコマンド
イメージの指定はinspectと同じ、REPO/TAG/IMAGEIDの3つで一意に指定する。
こんな感じ。
docker rmi centos:latest
Imageからコンテナを作る – docker run –
docker runをするとimageからコンテナが作られる。
runしてコンテナを作りつつ、echoコマンドを使ってみる。イメージの指定はinspectと同じ。TAGは省略可能。
docker run centos:latest echo "hello world"
するとterminal画面にhello worldと表示される。
イメージからコンテナが作られて、コンテナ上でコマンドが実行されたということ。
なるほどcentosが立ち上がっているようですね。
- -dオプション バックグラウンドで実行させる
- -iオプション インタラクティブモードで実行させる
コンテナがどこに作られたか – docker ps –
実行中(動作中)のコンテナの一覧を見ることができる。
docker ps
上記の場合は、echo “hello world”が実行し、動作が終了したので何も表示されない。
実行済(動作終了)のコンテナも表示したい場合は
docker ps -a
表示される項目と実際に表示された内容は下記。
- CONTAINER ID コンテナのID a37c9e1ed2b4
- IMAGE イメージの名前 centos
- COMMAND コマンド “echo ‘hello world'”
- CREATED 27 minutes ago
- STATUS Exited (0) 27 minutes ago
- PORTS
- NAMES wizardly_greider
最新の5つを見たい場合とする。
docker ps -a -n=5
実行中のコンテナをストップする – docker stop | kill –
実行中のコンテナをストップするときは、
- docker stop
- docker kill
を使う。こんな感じ。
docker stop c410
止めるとdocker psでは表示されなくなり、docker ps -aで2つ表示されることになる。
ストップしたコンテナを再開する – docker start –
停止したコンテナを動かしたいときはコンテナIDを指定してstartすればいい。
docker start c410
docker ps -aで停止したコンテナも確認できる。
コンテナを削除する – docker rm –
コマンドの後にコンテナIDを指定する。
コンテナを削除するには先にdocker stopで停止しておく必要がある。動いていると削除はできない。
上記の場合は下記になる。
docker rm a37c9e1ed2b4
実行中のコンテナを作り操作してみる
さきほどはechoだけ実行したら終了してしまったので今度はfreeでメモリの状況を表示する。
コマンドは下記。-dでバックグラウンドで実行。free -s 3でメモリの状態を3秒間隔で表示。
docker run -d centos free -s 3
これでコンテナは実行中のまま継続する。
この状態なら-aオプションをを付けなくてもdocker psで見ることができる。
Docker Desktopにはさっきのechoとは別にもう一つ作られている。
コンテナのログを見る – docker logs –
コマンドの後にコンテナIDを指定する。
コンテナIDはdocker psで確認すればいい。
docker logs c410277261d8
するとfreeで実行したすべての結果が表示される。
フォアグラウンドに持ってくる – docker attach –
docker attach --sig-proxy=false c410
centOSをインタラクティブで実行する
-iオプションでインタラクティブモード、-tでターミナルを立ち上げる。
runなので対象はイメージであることに注意。
docker run -i -t centos:latest /bin/bash
root権限でlinuxに入ったかのようにlsやpwdも使えるようになる。
今回touchコマンドでtest.txtというファイルを作ってみる。
exitで抜けることができるし、抜けたら停止状態になる。
再び動かしたいときはdocker startで動かすことができるが、-iオプションを指定しないとインタラクティブで操作できない。
コンテナからイメージを作る – docker commit –
docker commit コンテナID ユーザー名/わかりやすい名前で指定する。
docker commit e8397 kouji/hello
これでイメージが作られた。
docker desktopのimagesでも確認できるし、docker imagesでも確認できる。
このイメージを元にコンテナを作る
前回コンテナでtouch test.txtを作ったものをイメージ化したので、そのイメージを元にコンテナを作ったならば、test.txtがあるはず。
やり方は同じだが、イメージの名前は先程名付けたもので指定する。
docker run -i -t kouji/hello /bin/bash
ちゃんとtest.txtが入っているのを確認できたのでイメージ→コンテナ→イメージになったのを確認できた。
Dockerfileを作る
viでDockerfileを作る。
vi Dockerfile
ファイルの中身はこんな感じ。詳しくはググるしかなさそう。
From centos MAINTAINER Kouji Hamada <hamada0365@gmail.com> # RUN : buildするときに実行されるもの。いろんなものをインストールするときに使う RUN echo "now building..." # CMD : コンテナを作るとき、runするときに実行されるもの CMD ["echo","now running..."]
ビルドする – docker build –
イメージを作る。-tはイメージ名/タグ名を指定する。最後の.はカレントのDockerfileを指定している。
docker build -t kouji/echo .
これで作ったDockerfileを元に、kouji/echoという名前のイメージが作れられる。
イメージはdocker imagesで確認できるし、docker run kouji/echoでコンテナを作ることが出来る。
Webサーバを立ち上げるDockerfile
これがWebサーバを立ち上げるDockerfile。
FROM centos MAINTAINER Kouji Hamada <hamada0365@gmail.com> RUN yum install -y httpd ADD ./index.html /var/www/html/ EXPOSE 80 CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
ADDでファイルを追加して、EXPOSEでポートを開ける。index.htmlはローカルで作る。
RUNするときは下記。コンテナの80ポートに、8080でアクセスする。バックグラウンドで走らせたいので-dオプション。
docker run -p 8080:80 -d kouji/httpd
後はlocalhost:8080にアクセスするとちゃんとindex.htmlで作った内容が表示できた。
その後にindex.htmlを修正して、再度8080にアクセスしたけど表示は元のままだった。
ということは、image内にvar/www/htmlの中身のファイル一式が保存されているようです。
Docker HubにPushする – docker login –
最初にDockerHubにユーザー登録をする必要がある。
ユーザーIDとメールアドレスとパスワードを決めて入力する。
注意点として、ユーザーIDはイメージの名前と同じにする必要があるみたい。
別にどちらかに合わせればいいので問題ないけど。
ターミナルからDockerにログインする。ユーザー名とパスワードを聞かれる。
docker login
Login Succeededと表示されたらログイン成功。
さきほど作ったものをプッシュする。これだけ。
docker push kouji/httpd
もしdenied: requested access to the resource is deniedというエラーが出たらイメージの名前とDockerHubのユーザIDの相違が原因。
合わせないとだめなのでどちらかに寄せること。
名前付きボリュームを作成する
docker volume createコマンドらしい。
docker volume create 名前
今回はdocker/getting-startedの入門にあったtodoアプリのものを指定する。
docker volume create todo-db
ボリュームマウントしてランする
ボリューム名がtodo-dbで、イメージ名がgetting-started、マウントする場所が/etc/todosとする。
docker run -dp 3000:3000 -v todo-db:etc/todos getting-started
になる。
名前付きボリュームの詳細を調べる – docker volume inspect –
docker volume inspect ボリューム名とする。
今回の場合はこうなる。
docker volume inspect todo-db
出てきたのがこんな感じ。Moutpointがデータが保存されているディスクの場所。
"CreatedAt": "2021-01-06T04:04:22Z", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/todo-db/_data", "Name": "todo-db", "Options": {}, "Scope": "local"
最後に
ふーむ、Dockerか。少しは解ったかも。
imageの中にCentOSやNginxやデータベースだけでなく、ソースコードまで含まれているのなら便利かも。
一式を別の環境に移動するのが便利そう。
コメント