【Docker】コマンド整理/まとめ

忘れたとき用のメモ。

オプションなどの意味も整理。

container/image周り

※コマンドのdocker container/image などのcontainer/imageは省略できたりするが、敢えて省略しないほうがどういうコマンドを打っているのかがわかりやすいため、長い方が推奨されている。

docker container run イメージ名

指定したイメージからコンテナを起動する。

イメージ名の後ろに:タグを入力可能。

docker container run -it イメージ名 bash

対話的な入力が必要なbashプロセスを実行できる。

-itは対話的な入力をするというオプション。

-p ホスト側ポート:コンテナ側ポート

とすることでポートフォワーディングができる。

ポートフォワーディングとは、ホストマシンのポートとコンテナポートを紐付けるもの。

例えばコンテナ内に公開されたポートがあったとしてもそれはコンテナポートと呼ばれるもので、コンテナの外からは利用することができない。(コンテナ内からならOK)

仮にHTTPリクエストを受けるようなアプリケーションの場合、外からのリクエストをコンテナ内まで到達させる必要がある。

そこで利用するのがポートフォワーディングという機能。

この機能を使うことで、ホストマシンのポートをコンテナポートに紐付け、通信することができる。

docker container run -d -p 9000:8000

上のようにした場合、ホストマシンのポート9000へ何らかを送信すると、コンテナポートの8000へ行き着く。localhost:9000へgetリクエストを送るとコンテナポートの8000に送ったことになる。

因みにホストマシン側のポートは省略することができ、その場合は空いているポートが自動的に割り当てられる。どのポートに割り当てられたかは、後述するdocker container lsで確認できる。

docker container exec -it コンテナID bash

起動しているコンテナにbashで入る。

docker container ls -a

コンテナ一覧表示

-aを付けない場合は実行中のコンテナのみを表示する。

docker container stop コンテナ名 #コンテナの停止
docker container rm コンテナ名 #コンテナの削除
docker container restart #コンテナ再起動
docker image pull イメージ名

DockerHubからイメージをローカルに取得。

runをしたとき、イメージを取得していなかったら、自動でpullが実行されるので、このコマンドを実行する機会は少ない。

docker search イメージ名

イメージの検索

docker images

現在ローカルにあるイメージの一覧を表示

docker image build

Dockerfileからdocker imageを作成。

-t 名前 でimageに名前をつけれる。タグ名の指定も可能、省略した場合はlatestになる。

DockerHubに上げる場合は後述する命名方法に則って付ける。

さらにその後にはDockerfileを配置しているディレクトリのパスを記載する。

現在の場所であればドットを入れる。

docker image build ディレクトリの起点場所 -t イメージ名:タグ名

docker image rm イメージ名 #イメージの削除

DockerHub関連

docker login

dockerhubへログイン

usernameとpassword入力を促される。

docker image tag 変更するイメージのイメージ名 変更後のイメージ名(username/イメージ名)

Dockerhubにイメージを上げるとき、イメージを命名する例。

username/イメージ名 という形がDockerhubの命名規則なので、既にローカルに存在するイメージをDockerhubに上げる場合は、一度こういった命名のイメージを作る。

docker image push username/イメージ名

上のtagを用いて作ったimageをアップロードする。

docker image pull username/イメージ名

DockerHubから作成したイメージの取得。

そのままrunでも可

DockerfileのDSL

必須なものだけリストアップ。

  • FROM…ベースとなるDockerImageの指定(普通は公式提供のImageを使用する) ここで指定したImageはベースイメージと呼ばれる。

  • ENV…Docker内で使用する環境変数の定義 ( 例:ENV PASS_ENV=abcde )

  • WORKDIR…Dockerfileでコマンド実行時に基準となるディレクトリを指定する。

  • COPY…Docker内へファイルやディレクトリをコピーする。 ( 例:COPY ホスト側のディレクトリ Docker側のディレクトリ )

  • RUN…Docker内でコマンドを実行する。

  • USER…作成したDockerImageを起動したとき、ログインするユーザーを指定する。 デフォルトではrootが設定されている。

  • CMD…Docker起動時に実行されるコマンドを定義する。 ここで定義したコマンドが実行されている時間=コンテナがrunningの状態である時間 コマンドは配列のような形で各。

    $ go run /echo/main.go

    であれば

    CMD ["go", "run", "/echo/main.go"]

    のように書く。

ここから重要度が低かったり、扱いを選んだり、可読性を考えるDSL

  • EXPOSE…Dockerがどこのポートを使用するかを記述する。 指定したポートをホスト側で公開するにはrun使用時に-Pを付ける必要がある。 ※書いておくと読みやすい。

    docker run -P nginx

  • VOLUME…Volumeを作成する。

  • ARGS…Dockerfileビルド時、変数を使用するためのコマンド。 ※複雑になるので、基本使わないほうが良い。

  • ADD…COPYの上位互換。COPYと同じコピー機能、URL指定でそのURLからファイルダウンロードしコピー、そのファイルがtagかtag.gzのときは解凍する。 ※COPYを使えるならCOPYを使うべき。URLを指定すると、もしそのURLが変わってしまったときなど複雑になったりするので、なるべく使わない方が良い。

  • ENTRYPOINT…コマンドの実行。docker run時に指定したコマンドをこれの引数として使う。

    ENTRYPOINT ["echo"]

    $ docker run イメージ名 "hello" hello

    ※基本、CMDを使うほうが良い。

ネットワーク関連

docker network create 任意のネットワーク名

driverがbridgeの任意の名前のネットワークが作成される。

docker network ls

network一覧表示

docker run --name nginx --network=ネットワーク名 -d nginx

Nginxを任意のネットワークに参加させるコマンド例

docker network inspect ネットワーク名

ネットワークの詳細表示

Volume関連

docker volume ls

volume一覧

docker volume inspect VOLUME名

対象としたVolumeの詳細を確認

docker-machine

docker-machine ls

docker-machineの一覧表示

状態を確認できる。

docker-machine create --driver 仮想化マシンのドライバ名 マシンに付けたい名前

docker-machineの作成。

windowsでは基本hypervを指定する。

macだとvirtualbox

docker-machine env マシン名

一番下に対象にするdocker-machineをACTIVEにするコマンドが表示される。

-uを付けるとACTIVEを外すコマンドが表示される。

docker-machine start/stop マシン名

開始、停止

docker-machine ip マシン名

ip確認

docker-machine rm マシン名

マシンの削除、この後にy/Nの確認が行われる。