dockerの使い方

よくrunとstartとかがごっちゃになるのでメモ。


# 用語
- dockerイメージ  
  実行する前の塊。公式に登録されているubuntu:latest等をdockerhubなどから引っ張ってきて利用したり、自分で作ったりできる。
- dockerコンテナ  
  イメージを元に自分のマシンで実行したもの。



# 実行方法。
- インストール  
  以下参照しdocker-ceをインストール。  
  https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository
- 元となるイメージ取得
  以下でubuntu16.04が起動できる。
  でもわざわざpullしなくても、runの時になければ勝手に取ってきてくれる。

    ```
    docker pull ubuntu:latest
    ```
- イメージのリストを表示

    ```
    docker images
    ```
- コンテナ初期起動
  - 以下で起動。exitすれば勝手にコンテナも止まる。

        ```
        docker run -it --name ubuntu_mycontainer --hostname ubuntu_mycontainer ubuntu /bin/bash
        ```
  - デーモンとして起動したければ「-d」をつける。
    ただrunでは指定できるがexecでは指定できないっぽい。
  - ポート指定は以下。

    ```
    docker run -it -p 12345:22 --name ubuntu_mycontainer --hostname ubuntu_mycontainer ubuntu:latest /bin/bash
    ```
  - HOSTのディレクトリをマウントするなら以下。

    ```
    docker run -it -v /home:/home --name ubuntu_mycontainer --hostname ubuntu_mycontainer ubuntu:latest /bin/bash
    ```
- bash実行
  以下で起動。exitすると止まる。

    ```
    docker exec -it ubuntu_mycontainer bash
    ```
- コンテナを再度起動

    ```
    docker start (コンテナ名 or コンテナID)
    ```
- 起動しているコンテナの状態取得

    ```
    docker ps
    docker top (コンテナ名 or コンテナID)
    ```
- 起動していないものも含めてコンテナのリスト表示

    ```
    docker ps -a
    ```
- 裏で動いているコンテナをとめる

    ```
    docker stop (コンテナ名 or コンテナID)
    ```
- コンテナを削除

    ```
    docker rm (コンテナ名 or コンテナID)
    ```
- イメージを削除

    ```
    docker rmi (イメージ名 or イメージID)
    ```
- 一度作ったコンテナにあとからポート割り当てやマウントディレクトリを指定することは出来ないみたい。
  docker startにオプションがない。
  やるなら一度イメージを作り直して、再度コンテナにする際にオプション指定する。

    ```
    docker stop mycontainer
    docker commit mycontainer temporal_image
    (temporal_imageはmycontainerのベースになっているので消せない)
    docker rm mycontainer
    docker run -it -p 20022:22 --name mycontainer --hostname ubuntu_mycontainer temporal_image /bin/bash
    ```



# Dockerfile
- 参照リンク  
  http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
- 例えばubuntuベースでpython開発用のイメージを作りたい場合、以下のようなDockerfileを用意する。

    ```
    FROM ubuntu

    ENV PATH $PATH:/usr/local/bin/:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin

    RUN printenv
    ADD setting.tar.gz /root/
    RUN apt-get update
    RUN apt-get dist-upgrade
    RUN apt-get install -y python3 python3-pip
    RUN apt-get clean
    ```
- ADDするためカレントディレクトリにsetting.tar.gzを用意する。
  ADD命令で勝手に解凍までしてくれる。
- 以下でイメージのビルド。

    ```
    docker build -t summer4an/ubuntu_myimage:1.0 ./
    ```
- 以下で起動。

    ```
    docker run -it --name ubuntu_mycontainer --hostname ubuntu_mycontainer summer4an/ubuntu_myimage:1.0 /bin/zsh
    ```
- 何かミスしていたら以下で削除。

    ```
    docker rm ubuntu_mycontainer
    docker rmi summer4an/ubuntu_myimage:1.0
    ```
- 出来上がったコンテナを別マシンに持っていきたいなら以下。
  - (イメージを直接exportすることは出来ない？)イメージを固めたものを作成。

        ```
        docker export ubuntu_mycontainer -o docker_exported.tar
        gzip docker_exported.tar
        ```
  - 別マシンにdocker_exported.tar.gzを持っていって以下。

        ```
        docker import docker_exported.tar.gz summer4an/ubuntu_myimage:1.0
        docker images
        ```



# 参照リンク
全般

- http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html
- http://paiza.hatenablog.com/entry/docker_intro
- https://www.qoosky.io/techs/0a0bd52cd3

Dockerfile

- http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html