DevOps

docker imagesに表示される<none>を消す。dangling

by codechord. 0 Comments

Dockerを使っているといつのまにかディスク容量をくっているので、たまには整理しようと、「$ docker images」を実行し、これまでに作成したDockerイメージの一覧を見て確認している。その際に表示される、<none>のdockerイメージは削除してよいのか?noneイメージってなんなのか?という話。

Dockerfileを作成時に、「$ docker build -t <イメージ名> .」と、何回もbuild繰り返しやり直していると次のように、<none>のdockerイメージがそのビルド回数分作成されてしまう。

続きを読む »

Dockerの基礎知識と開発環境用Dockerfileの書き方

by codechord. 0 Comments

この記事はソフトウェアエンジニア向けにローカルでDockerで開発環境を作る際の、基礎知識のうち自分用にまとめたものです。日常的にdockerを使うようになったものの、何回もDockerの記事をみては忘れて、見てはわすれてを繰り返すので。
本番環境などでの利用、クラウドでの利用などについては本記事で触れません。

ネットの記事や、オライリー本やいくつかのDocker関連書籍をみましたけど、ダントツでわかりやすかった入門者向けのおすすめの書籍を紹介しておきます。どの書籍でも、セキュリティやk8sなどまで触れられてますね。

Docker Engine/ Docker Machineってなに

Dockerを使うということは、Docker Engineを使うということ。
コンテナから、ホストOSのカーネルを使うことができるというDocker Engineのおかげ。注意としては、コンテナからホストOSのカーネルを使うということなので、コンテナに展開されるOSとホストのOSとは、本来同じといけない。(Docker上で、Linuxのコンテナを動かしたい場合は、ホストマシンはそのLinuxのOSである必要がある。)
特定のLinuxのOSの機能を使おうとしても、Windowsや、MacなどOSが異なれば動作しない。逆も然り、ホストマシンのOSがLinuxベースの場合、WindowsのDockerイメージを動かすことはできない。

MacなどでDockerを使う場合は、VirtualBoxなどでまずLinuxの仮想環境を用意し、そのOSに沿ったDockerイメージ/コンテナを展開といけないという話であるけども、わざわざVirtualBoxなどで仮想環境を作るのが面倒。そこで、Docker for windows、Docker for macなどのインストーラーが提供されている。
これらインストールすると、Dockerを起動するための様々なツールがインストールされる。その中に含まれる、Docker Machineによって、ユーザは仮想環境について意識せずとも、自動的にLinuxの仮想環境を構築され、ホストOSがMacであれWindowsであれ、LinuxベースのDockerコンテナを立ち上げることができるようになる。

  • ホストOSがMacでWindowsのコンテナを作成することはできない
  • ホストOSがWindowsでMacのコンテナを作成することはできない。
  • ホストOSがLinuxで、WindowsやMacのコンテナを作成することはできない。

Dockerfileとその記述について

Dockerはコンテナを作成するために、その雛形となるDockerImageを用意する必要がある。
Dockerfileは、そのDockerイメージを作成するための設定をまとめたファイル。
ファイル名は「Dockerfile」とするのが慣習的であるが(DockerImageを作成する際デフォルトで読み込んでくれるファイル名が「Dockerfile」)、設定ファイル名を指定することも可能。
実際の運用上では、開発環境と本番環境とをわけるように「Dockerfile.development」「Dockerfile.production」のように、環境に応じていDockerfileが複数用意されるケースもみられる。

なお、Dockerfileは1行1レイヤーとなりDockerイメージに積み重なっていくため、行数は可能な限り少なく抑えるほうが良い。

以下に、Dockerfileの命令文をいくつか乗せる。

FROM (<イメージ>:<タグ(バージョンなど)>)

ベースとなるDockerイメージを読み込む。
DockerHubで公開されているものを使うことがほとんど。
Google検索で、構築したい環境のDockerfileについて検索すると大抵すぐみつかる。

今回、例としてGo言語の開発環境を作りたかったとして、
GolangのDockerHubを見てみる。

Simple Tagsという所がタグなのであるが、非常に多く、どのバージョンを利用すべきか迷う。
そのページの下部の方に、説明が書かれているが、次のように性質が異なる。

golang:1.10 標準全部入り。
golang:1.10-alpine 最小限の構成のようなもの。
debianベース
golang:1.10-buster 最新のdevianパッケージの構成らしい。

さまざまなDockerfileなどをみていくと、その他に、`Buster、Stretch、Jessie`なども見かけるあるが、Debianのバージョンのコードネームのようだ。
https://wiki.debian.org/DebianReleases

自分は、go言語環境をつくっていて、Dockerfileで「go get」したかったので、gitが必要があったのだけど、容量を少なくおさえたいからといって、alpineのディストリビューションを利用すると、gitコマンドが使えない。。。
alpineを使い、gitコマンドを使いたければ、gitをapt-getでインストールしないといけない。

ベースイメージ gitについて イメージサイズ
golang:1.10 git使える 約1GB
golang:1.10-alpine git使えない 約350MB
golang:1.10-alpine git追加インストール 約700MB

自分は少しでも容量を小さくしたいので、alpine+gitインストールして使っている。

それ以外のイメージとしては、「FROM scratch」とすると、Dockerを利用するにあたり、最も最小の構成から、環境を構築することも可能。イメージサイズは極小である。

WORKDIR

コンテナ上でのワーキングディレクトリ。たとえば、goの場合は「WORKDIR /go/src/demo」apache2の場合は「WORKDIR /var/www/htdocs」とするもよし、

COPY <ホストディレクトリ> <コンテナディレクトリ>

ホストマシン上の特定のディレクトリを、Dockerコンテナ内の特定のディレクトリにコピーする。「COPY . .」とすると、現状のディレクトリ内を、上記で指定したWORKDIRにコピーする。
COPYににたADDというコマンドの場合は、コピーしたファイルのなかに.tarが含まれる場合はtarボールが解答される。

EXPOSE

ポートフォワーディングの設定 EXPOSE 8080などとする。

CMD

コンテナを立ち上げた際に、デフォルトで実行するコマンド。CMD [“./sample_app”]とするとWORKDIR内に配置されているsample_appを実行する。
デフォルトに実行するコマンドなので、コンテナ起動時にコマンドを実行すると、コンテナ起動時のコマンドが優先されるので注意。

RUN

コンテナで実行したいコマンドをRUNの後に記述する。「RUN cd ../」など
上述のalpineディストリビューションの場合に、gitをインストールしてgo getをする例は次の通り。

RUN apk add --no-cache \
        alpine-sdk \
        git \
    && go get github.com/xxxx/xxxxx

その他

その他にも「ENTRYPOINT」や「ENV」などがあるが、今回は除外。

まとめ

以上がDockerfileについてのメモ。今後Dockerについて触れていきたい内容として、コマンドの最低限のまとめ、docker-composeマルチステージなどで、Dockerイメージの容量を圧縮する方法や、それに関しては後日記述してみたいと思う。

参考リンク