Dockerの使い方(2)

シンプルなWEBアプリを構築してローカルブラウザで確認する。

$ docker run -dP training/webapp python app.py
$ docker ps -l

PORTSに下記が書いてある。
0.0.0.0:32768->5000/tcp
コンテナの5000ポートがdockerホストの32768に割り当てられている

$ docker-machine ip
192.168.99.100

ブラウザで192.168.99.100:32768を見るとHello Worldが表示された。

割り当てるポートを明示する場合

$ docker run -d -p 8080:5000 training/webapp python app.py

docker portで割り当て確認できる

$ docker port loving_snyder
5000/tcp -> 0.0.0.0:8080

コンテナのログを見る

 $ docker logs -f loving_snyder
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.99.1 - - [28/Mar/2017 11:37:56] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:56] "GET /favicon.ico HTTP/1.1" 404 -
192.168.99.1 - - [28/Mar/2017 11:37:57] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:58] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:58] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:59] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:59] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:38:14] "GET /users HTTP/1.1" 404 -

Dockerfileからdocker imageを作り、リポジトリに上げる。

$ mkdir hoge
$ cd hoge
$ vim Dockerfile

FROM ubuntu:16.04
MAINTAINER hoge<hoge@gmail.com>
RUN apt-get update && apt-get install -y ruby ruby-dev

$ docker build -t hoge/ruby:v1 .
$ docker iamges

タグつける
$ docker tag  c36bf8d96a58 hoge/ruby:devel 

ダイジェスト値
$ docker images --digests

$ docker login --username=hoge --email=hoge@gmail.com
$ docker push hoge/ruby

不要なコンテナを全部削除する。

停止中コンテナの一括削除

$ docker rm `docker ps -a -q`

Docker – 基本的な使い方

Windows10でDocker Toolboxを使っています。

Dockerのアップデート

今のバージョンを確認します。

$ docker -v

Docker version 1.12.2, build bb80604

まずDocker Toolbox自体をアップデートさせます。ここからWin用をダウンロードして実行したらできると思います。

$ docker -v

Docker version 17.03.0-ce, build 60ccb22
なんだこれは全然違う。半年も経ってないのに。

$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.24 (downgraded from 1.26)
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Mar  2 01:11:00 2017
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.2
 API version:  1.24 (minimum version )
 Go version:   go1.6.3
 Git commit:   bb80604
 Built:        Tue Oct 11 17:00:50 2016
 OS/Arch:      linux/amd64
 Experimental: false

Client/Serverのバージョンのようです。ちょっと前までは、docker -vとやるとサーバのバージョンが出てたけど、今はクライアントのバージョンがでているようです。

Dockerの使い方概要

Docker Hubからdockerイメージを探して、docker pullでイメージをダウンロードして、docker runでコンテナを作成・実行します。

Docker Hub

ここにDocker Hubがあります。沢山イメージがあります。

dockerイメージを落とす

docker pullコマンドでイメージをローカルに落とせます。docker pull rubyとやるとrubyのイメージがダウンロードされます。このrubyは何かというと、ここにあります。ruby:2.4.1というように、[:]の後にタグをつけることもできます。タグは、基本バージョンになります。latestというタグを使うと、最新版をpullできます。

$ docker pull ruby:latest

dockerイメージ一覧を確認する

docker imagesコマンドで、ローカルのイメージ一覧が確認できます。

$ docker images
REPOSITORY  TAG     IMAGE ID      CREATED     SIZE
ruby        latest  d2cee8adb148  5 days ago  678 M

コンテナを作成・実行する

docker runコマンドでコンテナを作ります。コマンドの使い方は下記です。

$ docker run [オプション] [–name {コンテナー名}] {イメージ名}[:{タグ名}] [コンテナーで実行するコマンド] [引数]

コンテナ名rubyのrubyイメージのコンテナを作成する場合下記になります。

$ docker run --name ruby ruby:latest

-i オプションをつけると、標準入力が開きます。rubyコンテナの標準入力を開いたらirbが起動しました。一度docker runで作成・実行したコンテナは、処理が終わるとすぐに停止しますが、コンテナとしては停止中の状態で存在しています。よって、再度上記docker runコマンドを実行すると下記のようなエラーになります。docker runコマンドはコンテナが存在しない状態で新たに作成する際に使用するコマンドです。

Error response from daemon: Conflict. The name “/ruby” is already in use by container 8504a9a10098ff4a5f3b680adc74ba625a3b39dd6cc332485d96d9cbbdac951f. You have to remove (or rename) that container to be able to reuse that name.

停止中のコンテナを再実行する場合は、docker startコマンドを利用します。使い方は下記になります。コンテナIDは、次のdockerコンテナの一覧を表示させるとCONTAINER IDというのが確認できます。

$ docker start [-i] {コンテナー名}|{コンテナーID}

先程のrubyコンテナの標準入力を開く場合は、下記のようにします。

$ dcoker start -i ruby

dockerコンテナの一覧を確認する

docker psコマンドを使います。-a オプションを使うと停止中コンテナも表示されます。

$ docker ps -a
CONTAINER ID   IMAGE        COMMAND  CREATED        STATUS                     PORTS  NAMES
8504a9a10098   ruby:latest  "irb"    2 minutes ago  Exited (0) 50 seconds ago         ruby

dockerコンテナを削除する

docker rmコマンドを使います。削除対象を指定するには、コンテナ名かコンテナIDを使います。

$ dcoker rm ruby

TensorFlowのDockerのJupyterが動かない

TensorFlowのDockerは下記です。

$ docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow

dockerコンテナを実行したら、Jupyterが動いているのですが、Dockerをローカルブラウザで見る方法がわからないです。コンテナを実行したら下記のようなメッセージがでてきました。

$ docker run -it gcr.io/tensorflow/tensorflow:latest
[I 09:38:58.768 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 09:38:58.790 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[W 09:38:58.790 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using authentication. This is highly insecure and not recommended.
[I 09:38:58.794 NotebookApp] Serving notebooks from local directory: /notebooks
[I 09:38:58.795 NotebookApp] 0 active kernels
[I 09:38:58.795 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/
[I 09:38:58.795 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

下記に対処方法が書いてありました。dockerのipアドレスを確認して、それでアクセスすればできました。
参考:Unable to start TensorFlow within Docker, on Windows

$ docker-machine ip default
192.168.99.100

上記IPでアクセスします。

http://192.168.99.100:8888/notebooks

jupyter

Dockerの使い方 (Windows10)

DockerをWindows10で使えるようにする

参考:無償の「Docker for Windows」で手軽にLinuxコンテナを利用する (1/2)
参考:Windows10マシンにDocker Toolbox を入れて個人用の開発環境を作る

私は、windows10のHomeエディションで、Hyper-vというのが使えないので、Docker Toolboxを使いました。

Docker Toolboxをインストール

DOCKER TOOLBOXからダウンロードします。現状ではバージョンは、1.12.2でした。インストールして、Docker Quickstart Terminalを起動します。すると黒い画面にクジラがでてきました。
docker_install

これでインストール完了っぽい。

Dockerの使い方

基本的な使い方は、Docker Hubからイメージを取得して、それを基にコンテナを作成・実行するらしい。UbuntuでPython3を使えるようにしてみたいと思います。

Ubuntuのイメージをダウンロード

Docker Hubで色々なイメージを探せます。

$ docker pull ubuntu:latest

実行してみる

$ docker run -it ubuntu:latest /bin/bash

これでシェルが実行されました。exitで終了します。フォアグラウンドで実行するものは終了した時点でコンテナが消えるそうです。docker runで、コンテナの作成・実行が行われます。-itでフォアグラウンドでの実行を指定できます。イメージの次に何かを書くことで引数として渡せるようです。

バックグランド実行は、run -dです。バックグラウンド実行のコンテナを確認するには、docker psコマンドを実行します。

$ docker run -d nginx:latest
$ docker ps

実行中コンテナをストップするのは、docker stopです。ストップしてもデータが残っているので削除する場合は、docker rmです。ストップ中コンテナの確認は、docker ps -aで確認できます。docker rm -f でストップ&削除することもできます。container idの指定はidの先頭数文字でOKなようです。dockerイメージの削除も、docker rmiでできます。例えば、下記のようにします。

$ docker rmi nginx:latest

イメージをつくってみる

Dockerイメージを自分で作ってみます。docker buildというコマンドを使うそうです。Dockerfileというファイルに設定を書いて、それをdocker buildするとイメージが作成されるようです。

Dockerfile

FROM ubuntu:14.04
RUN apt-get update -y && apt-get install -y python3

Dockerfileを作成したら、docker buildコマンドでイメージを作ります。

$ docker build -t test/hoge:latest .
$ docker run -it test/hoge:latest /bin/bash
> python --version

とりあえずできました。pythonのバージョンは3.4.3でした。

あと、毎回終了するとまっさらになってしまうので、ローカル環境とマウントさせて、データを保存できるようにしたい。

$ docker run -it -v /c/Users/hoge/docker:/hogehoge test/hoge:latest

-v ローカルパス:サーバパスとやるとマウントできる。

pipもインストールする

上記のDockerfileを修正して、pipも使えるようにします。python3-pipをインストールします。

Dockerfile

FROM ubuntu:14.04
RUN apt-get update -y && apt-get install -y python3 python3-pip

その他困ったこと

同じ名前でbuildしたら昔のイメージが<none>という名前になって消せなくなった

参考:How to remove unused Docker containers and images

これで一括で消せる。Repositoryとか、Tagとかがになっても、Image IDがあるので、docker rmi {Image ID}とやれば消せた。

$ docker rmi $(docker images | grep "^<none>" | awk '{print $3}')