ここ3日くらい割とガッツリDockerを触ってたので、イメージ・コンテナの概要とおおよそ使いそうなコマンドについて書きます。コマンドは随時追加する予定。(こう書いたら大体あとでやらない) やっぱりやりませんでした…。都度別の記事に書いてます。タグで見てもらえるとよいかと…。

概要


私も始めるまではこの辺りさっぱりだったので、簡単な図で書いてみます。3日やったうえでの理解ですので、誤ってたらスミマセン…。よく出てくる言葉とコマンドの関連性はざっと以下のような感じになると思います。


  • Docker Hubからpullしてきたもの、もしくはDockerfileから作成するものがDocker イメージ
  • Dockerfileはイメージの作成手順のようなもの
  • Docker run時にローカルにイメージがなかったらDocker HubからイメージをpullしてきてDocker コンテナを起動する(つまりpullrunという順序でコマンドが実行される)
  • Docker コンテナDocker イメージをもとに作成される
  • 実際にアプリケーションが動作するのはDocker コンテナ
  • Docker コンテナから新しいイメージを作成(commit)できる

Docker Hub


Docker Hubは自分の作成したDockerfile(Dockerイメージの作成手順)とかを登録できます。Docker版のGitHub的なやつです。各OSやアプリケーションも公式のDockerリポジトリを登録してあります。例えばこれはUbuntuの公式イメージ。

コマンド


以下、おおよそ使いそうなコマンド。(自分向けの備忘録)やった順序で記述していくのであんまりまとまりないです。

Docker Hubからrun


下記のコマンドは前述のUbuntuの公式イメージを実行するコマンドにです。初めはローカルにubuntuの公式イメージがないのでpullが走った後に、そのままrunが走ります。

1
2
$ sudo docker run ubuntu:16.04 grep -v '^#' /etc/apt/sources.list
# 書いてないけど、pullが走る

イメージ


イメージの一覧表示

イメージを一覧表示するにはdocker imagesコマンドを使用します。

1
2
3
4
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx test c806d1df2ad7 24 minutes ago 35.17 MB
alpine 3.4 ee4603260daa 9 days ago 4.803 MB

イメージの削除

イメージを削除するにはdocker rmi イメージIDです。そのイメージをもとにしたコンテナが起動している場合は削除できないようです。また、そのイメージをもとにコンテナを起動したことがある場合(?)は下記のようにfoecedオプションが必要と言われます。

1
2
$ sudo docker rmi c806d1df2ad7
Error response from daemon: conflict: unable to delete c806d1df2ad7 (must be forced) - image is being used by stopped container 05c76cc91b0e

なので-fオプションを指定して強制削除します。

1
2
3
4
5
6
7
8
$ sudo docker rmi c806d1df2ad7 -f
Untagged: nginx:test
Deleted: sha256:c806d1df2ad713e663bb8d4ae8bd7e28ec67285cc176a6f6746c783842f41ca2
Deleted: sha256:638113914c29e87421c1fc3e98b44b8dd745f30b18db1410f462bdb53bf3c9f4
Deleted: sha256:9404875b8655e2c0b7f0e6937e502dbe4de6611ec8cbcdef9cafae90f726a0b6
Deleted: sha256:a254e86391128c81c5932aed7234c59442dfaf035b26f2823de674b87adbe77c
Deleted: sha256:091fbb86b14d6411480e3b0da0458aea2c13caabbcefd9b22e108580e83a37f5
Deleted: sha256:eeb9ae3c1e0b0e1c64ea6321403db7848cf8a411e1f3b13efccc0d7a92f36ac9

イメージから起動する

イメージからコンテナを起動するには基本的には下記のコマンドのどちらかを使用します。

  • docker run イメージID
  • docker run REPOSITORY:TAG

例えば、下記のイメージを起動する場合は次のどちらかです。

docker run c806d1df2ad7
docker run nginx:test

1
2
3
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx test c806d1df2ad7 24 minutes ago 35.17 MB

コンテナ


コンテナで作業する

dockre runオプションに-itを指定して、さらにshbashを指定します。ちなみにAlpine Linuxではデフォルトでbashが入ってないのでshで作業することになると思います。

1
$ sudo docker run -it nginx:test /bin/sh

起動中・起動したコンテナの一覧を表示する

起動中のコンテナの情報を表示するにはdocker psコマンドを使用します。

1
2
3
4
$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5407dceb0dc nginx:test "/bin/sh" 2 minutes ago Up 2 minutes 443/tcp, 0.0.0.0:8088->80/tcp big_noether

今までに起動した一覧を表示する場合は-aオプションを指定します。この履歴は消えない(?)ようなので、起動すればするほど表示数が多くなります。 消せます。たぶん後日書く。なので-nオプションを指定して表示することで表示する数を指定することができます。

例えば下記の場合は最新の5つの履歴を表示しています。

1
2
3
4
5
6
7
$ sudo docker ps -a -n 5
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
613d5d5aa4c9 c806d1df2ad7 "/bin/sh" 11 minutes ago Exited (0) 47 seconds ago adoring_stallman
308f6d53eb83 c806d1df2ad7 "-p 8888:80 /bin/sh" 11 minutes ago Created high_albattani
05c76cc91b0e nginx:test "nginx -g 'daemon off" 12 minutes ago Created serene_allen
9c64a261d843 bc9f81911230 "/bin/sh" 31 minutes ago Exited (1) 23 minutes ago big_shaw
b9f19d648059 bc9f81911230 "/bin/sh" 34 minutes ago Exited (0) 32 minutes ago distracted_meninsky

ポートフォワーディングで起動する

下記の場合、ホストのポート8888につないだ場合にnginx:testコンテナの80ポートにつながります。

1
$ sudo docker run -p 8888:80 -it nginx:test /bin/sh

ポートフォワーディングしている場合はpsコマンドで見た場合にPORTSの欄にフォワーディングの状態が表示されます。

1
2
3
4
$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5407dceb0dc nginx:test "/bin/sh" 2 minutes ago Up 2 minutes 443/tcp, 0.0.0.0:8088->80/tcp big_noether

コンテナからイメージを作成する

コンテナから新しいイメージを作成します。要するに、今までのイメージに新たに機能を追加して、そいつをイメージとして保存する場合に使います。コマンドはdocker commit コンテナIDです。 リポジトリ名:タグ名を指定することができます。下記だとubuntu:hogeとつけてます。

1
$ sudo docker commit 94df56ba58ba ubuntu:hoge

なお、これを繰り返すとイメージの差分が増える(?)ため、結果的にイメージが大きくなります。従って、Dockerfileで一発で作成することが多いのではないかと勝手に思ってます。

コンテナ名の変更

コンテナ名は勝手に適当な名前が割り当てられますが、自分で変更することも可能です。

1
docker rename 古い名前 新しい名前

起動中のコンテナからファイルをコピーする

起動中のコンテナからファイルをコピーしたいケースがあると思います。下記のコマンドでコピーできます。

1
2
3
4
$ sudo docker cp コンテナID:コピーしたファイルのフルパス 出力先のパス

# nginxの設定ファイルをカレントディレクトリにコピーしたい場合
$ sudo docker cp コンテナID:/etc/nginx/nginx.conf .

起動中のコンテナのログを表示する

docker logs コンテナIDで起動中のコンテナのログを表示することができます。どこまでのログを表示できるのかわかってませんが、アプリケーション以外にも操作のログ(cdとかls)とかも表示されてました。

下記はnginxコンテナのログを表示したものです。

1
2
3
4
5
6
$ sudo docker logs 613d5d5aa4c9
192.168.33.1 - - [02/Oct/2016:23:42:22 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"
2016/10/02 23:42:22 [error] 12#12: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.33.120:8888"
192.168.33.1 - - [02/Oct/2016:23:42:22 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"
2016/10/02 23:42:22 [error] 12#12: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.33.120:8888"
192.168.33.1 - - [02/Oct/2016:23:42:22 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"

Dockerfile


Dockerfileについては次あたりで書きます。旧バージョンのDocker(いくつかわすれたけど)だとDockerfileというファイル名でないといけなかったそうですが、現在は任意のファイル名を付けることができます。

Dockerfileからイメージを作成

DockerfileからDockerイメージを作成するのがDocker buildです。-tオプションで作成と同時にリポジトリ名とタグを付けます。-fでファイルを指定します。

1
$ sudo docker build -t nginx:test -f nginx.dockerfile .

上記の例だと作成と同時に「nginx」というリポジトリ名かつ「test」というタグ名のイメージを作成します。「nginx.dockerfile」というDockerfileを指定しています。

参考


これから始める「DockerでかんたんLAMP環境 for CentOS」