Help us understand the problem. What is going on with this article?

Docker 事始め

More than 5 years have passed since last update.

docker初心者なので、環境構築、超簡単なContainerの起動、Dockerfileとdocker xxのコマンドライン辺りをチラシの裏しておきます。

Dockerfileは人様の完成品を元にカスタマイズするとハマる事なく捗ります。

Docker環境をEC2にsetupする

まずEC2を建ててDockerを動かして見ましょう。EC2はt2-microで十分です。
apt-get install docker.ioでinstallされますがv1.0系が入ってしまいます。fig等を使いたい場合には、v1.3以上が必要なので、docker.ioから直接持ってくるべし。

#curl -sSL https://get.docker.io/ubuntu/ | sudo sh
#apt-get update
#apt-get -y install sysv-rc-conf
#sysv-rc-conf docker on

#docker version でdocker clientのverを確認

# docker version
Client version: 1.4.1
Client API version: 1.16
 ...

初めてのDocker

初めての方は、まずは簡単なnginxなどのContainerを作ってみて、色々dockerコマンドを触ってみると良いです。慣れてきたらDockerfileのベストプラクティスで最適化して下さい。

以下をDockerfileという名前で保存します。Ubuntu14.04ベースにcurlとnginxが入ったContainerを作る設定。

FROM ubuntu:14.04
RUN apt-get update && apt-get -y install nginx curl
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80
CMD ["nginx"]

そうしたら、作ったDockerfileのdirectoryから、何も考えずに、以下のコマンドを流してみる。

#docker build -t test1/test:1.0 ./
#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test1/test          1.0                 55469de80222        57 seconds ago      250.3 MB
ubuntu              14.04               5ba9dab47459        12 days ago         192.7 MB

#docker run -p 25525:80 -d test1/test:1.0
#docker ps
CONTAINER ID  IMAGE          COMMAND       CREATED         STATUS         PORTS                   
b54eb8dd4253  test1/test:1.0 "/bin/sh"     8 seconds ago   Up 8 seconds   0.0.0.0:25525->80/tcp           

#curl localhost:25525

curlに対して、Welcome to nginxのhtmlが表示されたら、containerのnginxが反応してくれているので成功です!

Dockerハマりポイント

以下、Docker初心者として踏んだ地雷、ハマりポイントを列挙しておきます。

ProcessがForegroundで動いていないとContainerは終了する

これ超重要!

Docker Containerでnginxとかmongoとかelasticsearchを動かしたい場合には、DockerfileにRUN service nginx startとかじゃダメなんです!Background実行だけじゃダメ絶対!

ちなみに、上のDockerfileにあるecho "daemon off;" >> /etc/nginx/nginx.confという謎のオマジナイは、nginxをdaemon化(background実行)する事を防ぐ為の物です。『Docker』『フォアグラウンド』とかでググると、この問題に対するBest practiceが見つかります。

自分が見つけた範囲では、以下の様な解決のApproachがありました。流行はSupervisorなんですかね。
* Supervisorを使う
* 無限Loopのshell scriptを作って、DockerfileのCMDで呼び出す
* docker runでcontainer起動時に、serviceも起動する

docker run xxxして、docker psしても、起動中のContainerが見つからない場合には、これが原因の可能性があります。
docker ps -aでContainerが終了しているか確認してください。

docker containerのshellを操作したい

Containerを動かしたは良いが、しばらくしてどうも調子が良くないので、中に入ってshell操作して動作状況を確認したい、と言うケースは多々あると思います。そんなときは、docker exec を使ってください。docker v1.3からサポートされた便利ツールで、#docker exec –it <containerID> bashでOKです。

ちなみに、v1.3以前は以下の様な方法がとられていましたが、v1.3以降はdocker execで捗る様になります。

  • docker logs <containerID>でstdoutのlogを眺める
  • containerのlogを/var/logなどに吐き出す様にしておき、/var/logを docker run -vでhost側からもアクセス出来るようにする
  • containerにsshdを仕込んでおき、sshでcontainerにlogin/shell操作する
  • nsenterというtoolをcontainerに仕込んでおき、 containerのprocessに入りshell操作する

docker containerのresource消費量を知りたい

docker v1.5から、docker stats <containerID>でCPU, Memory, network trafficの量を吐き出してくれるようになりました。
docker stats <containerID1> <containerID2> <containerID3>とcontainer IDを続けて列挙すると、それら全てを纏めて吐き出してくれます。docker stats $(docker ps -q)とすると、動作中のcontainerの全てのresource消費量を吐き出してくれます。

Dockerコマンド

docker build

Dockerfileから、docker imageを作成。以下の場合、./dokcertest以下のDockerfileを見に行く

#docker build -t test1/test:1.0 ./dockertest

#docker imagesで作成したimageができているか確認

#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZ
test1/test          1.0                 407b5768bc5f        5 hours ago         467.5 MB
ubuntu              14.04               5ba9dab47459        10 days ago         192.7 MB

#docker build --no-cache -t test1/test:1.0 ./dockertest--no-cacheを付けると、強制的に再度docker imageを作成。

docker run (一番ベタな方法)

docker imageからContainerを起動 (#docker imagesで表示されたImiage IDか、Build時に-tで指定したrepository/tagを指定する)。-dでbackground実行です。

#docker run -d 407b5768bc5f
#docker run -d test1/test:1.0

docker images -q | head -1 が一番新しいimage IDをくれるので、一番直近に作ったimageを起動する場合は以下でもOK

#docker run -d $(docker images -q | head -1)

docker run (Port指定)

Containerのport80を、hostの25525にmapして起動。

#docker run -p 25525:80 -d 407b5768bc5f
#docker run -p 25525:80 -d test1/test:1.0

host上で、curl localhost:25525すると、Container上のport80に渡され、Container側のhttp serverの応答を受け取れます。(Container側で、http serverが起動する設定になっていれば)

docker run (Containerのshellに遷移)

-it を付けると、Container起動後、Containerのshellに遷移してします。DockerfileのCMDENDPOINTでforeground実行されるAppがある場合は、そのlogが表示されます。foreground実行されるAppが無い場合は、Container側のShell操作が可能です。ctl+p → ctl+qでHost側のshell操作に戻って来れます。

#docker run -it 407b5768bc5f
#docker run -it test1/test:1.0

注意点
* -itする時は、-d を付けないでください(でないとBackground起動されちゃいます)。

docker run (HostのdirectoryをContainerからもアクセスできるようにする)

-v オプションで、(host側の絶対path):(Container側の絶対path)と表記します。要絶対パス

#docker run -v /home/ubuntu:/root/test -d 407b5768bc5f
#docker run -v /home/ubuntu:/root/test -d test1/test:1.0

docker run (Containerを強制的にshell状態で起動)

#docker run -it 407b5768bc5f /bin/sh
#docker run -it test1/test:1.0 /bin/sh

docker run xxx /bin/shとかすると、Containerの起動時に(DockerfileのCMDの内容を上書きして) DockerfileのCMDの内容は行われずにContainerのshell状態になります。Containerが期待通りの動作をしない様な場合に、上記の様にdocker run -it xxx /bin/shでCMDの内容の実行を抑止しつつContainerのshellに入り、そこでCMDの内容をdebug logを沢山吐く設定で動かして見る、などで使います。

ちなみにDocker始めたたての頃、人様のDocker コマンドの記事を見ていて、docker runする時は、docker run -d 407b5768bc5f /bin/shの様に、最後に/bin/shのoptionが常時必要だと思っていました(恥ずかし)。

docker link

他のcontainerと連携させる場合に使います。長くなるので、興味のある人はこちらの記事を参照下さい。

docker ps

dockerの起動状態を確認。docker stop等で、Containerを止めたいときにContainer IDを確認するのによく使います。

#docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
NAMES
6707e5555b5a        test1/test:1.0      "/bin/sh"           3 seconds ago       Up 2 seconds        24224/tcp, 80/tcp
romantic_blackwell

docker ps -aすると、過去のContainerも含めたstatusが見れるので、containerが勝手に死んでいるなどの疑いがあるときにはこれで確認。

docker stop

docker containerの停止(#docker psで表示されたContainer IDを指定する)

#docker stop 6707e5555b5a

全ての動作中containerの停止

#docker stop $(docker ps -q)

docker logs

docker containerのstdoutのlogを表示します。Containerの調子が悪いときにstdoutのlogを見るのに使います。
docker containerの中に入って、debug等の目的でshell commandを色々実行したい場合には、docker execを使って下さい。

#docker logs 6707e5555b5a

docker exec

docker containerに入って、containerの動作状況やlogの確認をしたい場合に使います。
docker v1.3からサポートされました(超便利!) 。
それまでは、containerにsshdを仕込んで居たり、nsenterってtoolを使ったりしてましたが、docker tool側がサポートしてくれました

#docker exec –it 6707e5555b5a bash

docker rmi

docker imageの削除

#docker rmi 407b5768bc5f

REPOSITORY が <none> になっているものを強制削除する場合
#docker rmi -f $(docker images | awk '/^<none>/ { print $3 }')

全てのDocker imageを強制削除
#docker rmi -f $(docker images -q)

docker rm

docker containerの削除

#docker rm `docker ps -a -q`

参考になった記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした