Re:boot!

35歳からのエンジニアWay

Docker for Macで docker入門

随分と前にdockerを少しいじった事はあったのですが、気づいたらいつの間にかDocker for Macなるものが出来てました。

Docker for Macさえインストールすれば、dockerコンテナを動かすためのdocker daemonが起動できるので、昔と違ってVirtual Boxを使ったりする必要がなくなったようですね。

サクっと入門してみました。

Docker for Macインストール

公式サイトからdmgファイルを落としてポチポチするだけです。

docs.docker.com

Hello Worldしてみます

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pulling fs layer
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

通常であれば

  1. dockerコンテナを構成するためのDockerfileを作る
  2. docker buildを行なってコンテナイメージを作成する
  3. docker runしてコンテナを起動する

といった流れが基本ですが、imageがない状態でrunを行うと(docker hubから?)ビルド済みイメージをダウンロードして起動してくれるようです。

上記のコマンドでも「ローカルにイメージがなかったからダウンロードしてきた」という流れが読めます。 ローカルにあるイメージはdocker imagesコマンドで確認ができます。

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        7 days ago          1.84 kB

(停止中の)コンテナ一覧は docker ps -a で確認できます。

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4cdf1befef68        hello-world         "/hello"            25 minutes ago      Exited (0) 25 minutes ago                       compassionate_agnesi

いらなくなったコンテナは docker rm $CONTAINER ID で削除できます。

$ docker rm 4cdf1befef68

基本的なことはコレくらいですかね。

Nginxを立ち上げてみる

qiita.com

qiita.com

containerに使うOSはalpine linuxデファクトとなりつつあるようなので、alpine linuxを利用します。 まずは素のappine linuxコンテナを立ち上げてログインできる様にします。

Dockerfile

FROM alpine:latest

Dockerfileを元にビルド

$ docker build -t nginx .

-tでタグ名を指定できます(イメージの名前みたいなもの?) 上のリンクにも書かれていたように起動してインストールに必要な手順を試しながら書き出します。

$ docker run -it nginx sh

試したコマンドを元にDockerfileを作りました。 /var/run/nginxディレクトリがないせいでpidファイルが作れず、nginxデーモンが起動できないので手元からnginx.confをコピーする様にしています。 EXPOSEがlistenポートの指定なので、これで80番ポートでnginxにアクセスできるはずです。

Dockerfile

FROM alpine:latest

RUN apk --no-cache add nginx && \
    ln -sf /dev/stdout /var/log/nginx/access.log && \
    ln -sf /dev/stderr /var/log/nginx/error.log

COPY ./nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

ファイルを元に再ビルドします。

$ docker build -t nginx

できたイメージでコンテナを立ち上げます。 -pオプションを使うことで、localhostの8080番ポートを80番ポートにフォワードしておきます。

$ docker run --rm -p 8080:80 nginx

ブラウザで http:localhost:8080 にアクセスしてnginxの画面が出たので成功ですね。