メモ的な何か

技術的な私のメモになる予定です。

Docker入れてみました

どうでもいい話

開発環境をリニューアルしたくてMac買いました。
iPhoneアプリとか開発したいなーという感じです。

この機会にDocker入れて開発環境の構築を検討してみようかと思い、とりあえずまだ触りだけだけどメモ。

インストール

Docker for Macをインストールします。
公式サイトからダウンロードだけど、アドレス、アカウント、パスが必要なアカウント登録が必要でした。

docs.docker.com

ちなみに複数のコンテナを管理するDocker ComposeもすでにDocker for Mac入ってます。

docs.docker.com

Install Compose on macOS
Docker for Mac and Docker Toolbox already include Compose along with other Docker apps, so Mac users do not need to install Compose separately.

起動

バージョン確認のコマンドでちゃんと起動していることが確認できました。

$ docker version
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:13:02 2018
 OS/Arch:      darwin/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:22:38 2018
  OS/Arch:      linux/amd64
  Experimental: true

Dockerの用語の解釈

いろいろ調べた結果のあくまで個人的な解釈です。ご意見あればください。
イメージ
オブジェクト指向のクラスのようなものという解釈。アプリケーションが動くための情報が提供される感じ。

コンテナ
オブジェクト指向インスタンスのようなものという解釈。イメージをもとに作成されてアプリケーションが動く実際の環境。

Dockerfile
イメージの作り(動作?)を記載するもの。ソースコード的な位置づけ?

触ってみる

イメージをとってくる
試しにrubyのイメージをとってくる。 とってくる先はデフォルトではDockerHub。

$docker pull ruby

とってきているイメージの確認。

$docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ruby                latest              857bc7ff918f        2 weeks ago         869MB

特に指定がない場合は最新(latest)がとって来れるもよう。バージョンを指定したい場合はruby:{バージョン}でいける。

コンテナを作る
とってきたrubyのイメージからコンテナを作成してみる。

$docker run ruby ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

これはrubyのイメージからコンテナを作成し、ruby --versionコマンドを実行したというコマンド。 ちなみにDockerHubにある最新(2018/6/27時点)のrubyのバージョンは2.5.1p57ということがわかった。
存在するコンテナの確認は以下のコマンド。
停止している(今回の場合はruby --versionが完了したら停止する)ものも含めての表示の場合は-aオプションが必要。

$docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
6f5fbb0441bc        ruby                "ruby --version"    6 minutes ago       Exited (0) 6 minutes ago                       loving_noyce

さらにもう一度同じコマンドでコンテナを作成した場合は別のコンテナが作成、実行される。

$ docker run ruby ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
9ed7ce97548e        ruby                "ruby --version"    2 seconds ago       Exited (0) 1 second ago                        upbeat_yalow
6f5fbb0441bc        ruby                "ruby --version"    9 minutes ago       Exited (0) 9 minutes ago                       loving_noyce

コンテナの削除
コンテナの削除は以下のコマンドで可能

$ docker container rm {CONTAINER ID}

イメージの削除
イメージの削除は以下のコマンドで可能

$ docker image rm {IMAGE ID}

Dockerfile
Dockerfileを作成してrubyにてHello World!を出力してみます。 Dockerfileを作成する用の空のディレクトリを切り(推奨 ※公式も)、以下のファイルを配置します。 今回はそのディレクトリをカレントディレクトリにします。

hello.rb

puts "Hello World!"

Dockerfile

FROM ruby
ADD hello.rb /test/
WORKDIR /test
ENTRYPOINT ["ruby", "hello.rb"]

ちなみにDockerfileの意味は以下の通りです。

命令 解説
FROM ベースのイメージを記載します。
ADD ホストPCのファイルをイメージにコピーします。
WORKDIR 以下ENTRYPOINT等のコマンドを実行するディレクト
ENTRYPOINT docker run時の実行コマンド

Dockerfileをもとにイメージを作成します。
コマンドの最後のドットはDockerdileの場所を指定(今回はカレントディレクトリ)。

$ docker build .

作成されればこんな感じで確認できます。
今回はオプションをつけてないので、REPOSITORYもTAGもnoneです。

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              b8c5ba4a7800        13 minutes ago      869MB
ruby                latest              857bc7ff918f        2 weeks ago         869MB

ちなみにDockerfileの記載ミスでbuildが途中で失敗した場合もイメージが作成されていたので、その場合は要注意。

最後にrunコマンドでコンテナを作成し、実行します。(IMAGE IDで実行)

$ docker run b8c5ba4a7800
Hello World!

終わりに

触りとしてはそれなりにやれたかな思ってます。
感覚はつかめたのでこれをベースにrubyの開発環境構築を検討しようかな。