いちから始める Docker - docker-compose を使う - (2020年)
  2020/03/28

Qiita とか調べていると、いきなり docker と docker-compose が混在してなんだこりゃ?となったりします。
(少なくとも自分は)

特に、他人の作ったdocker-compose.yml を docker の基礎がわからないと何をしているのか読み取れません。

例えば、Laravel を Docker で動かす Laradock はすごく便利で少しの知識があれば開発環境を動作せることが可能ですが、「やっぱり自分で構築したい!」となると、その設定を全部把握するのはかなりの時間がかかりそうです。

docker-compose が必要になる段階

  • docker の基本コマンドを覚える
  • Dockerファイルを記述
  • 複数のコンテナの設定が必要になる
  • Dockerファイルの管理が必要となる
  • docker-compose があると一度に管理できる

最初は docker の基本コマンドを繰り返し実感するのが良いのでは?と思います。

docker-compose を使ってみる

まず、docker-compose コマンドが存在するか確認します。


$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.1d  10 Sep 2019

あらかじめ、Dockerfile でイメージを作成済みであることを前提とします。

hello:latest イメージの シェルスクリプト「hello.sh」


#!/bin/sh
echo "Hello Shell Script"

hello:latest イメージの Dokcerfile


FROM ubuntu:18.04

COPY hello.sh /usr/local/bin
RUN chmod +x /usr/local/bin/hello.sh

CMD ["hello.sh"]

docker-compose を利用する前にまず docker コマンドでの起動を確認します。
 

docker コマンドによるビルド&起動コマンド


$ docker image build -t example/hello:latest .
$ docker container run example/hello:latest

起動確認ができたら、一度 dockerコンテナを落としておきます。


$ docker stop コンテナID

docker-compose.yml を設定して実行する

docker-compose を利用するには、「docker-compose.yml」の設定が必要となります。

docker-compose.yml


version: "3"
services:
   hello:
     image: example/hello:latest
     ports:
       - 9000:8080

docker-compose で起動(フォアグランド)

docker-compose up で、docker-compose.yml を読み込み、「hello.sh」が実行されます。

version

docker-compose.yml のフォーマットバージョンで、「3」は2020/3時点での最新です。

services

services: の第一階層に、各コンテナの名前を複数定義します。

例では、hello がコンテナ名となります。

image

Dockerイメージ名を設定します。

ports

ホストと docker のポートフォワーディング設定(ホストポート:dockerポート)


$ docker-compose up
Creating network "docker-hello_default" with the default driver
Creating docker-hello_hello_1 ... done
Attaching to docker-hello_hello_1
hello_1  | Hello Shell Script
docker-hello_hello_1 exited with code 0

ちなみに、このサンプルは hello.sh を実行したのちに exit しているため、状態は「Exit 0」となっています。

プロセスを確認する

docker のプロセス確認は docker-compose コマンドでも可能です。


$ docker-compose ps
       Name           Command    State    Ports
-----------------------------------------------
docker-hello_echo_1   hello.sh   Exit 0   

コンテナを停止

docker-compose.yml で設定しているコンテナを全て停止します。


$ docker-compose down

いちから始める Docker -コンテナをビルド- (2020年)
  2020/03/12

Dockerイメージとコンテナの関係

Dockerイメージ

Dockerコンテナを作成するための元となるテンプレート
Dockerfile を作成して設定する

Dockerコンテナ

Dockerイメージを元に複数作成して、システム、アプリケーションを構成・実行されます。

Docker イメージをダウンロード

Docker イメージはDocker Hub で検索できます。
※ユーザ登録はしておいた方が良いです

利用したいイメージやバージョンを「イメージ名:バージョン」でダウンロードできます。


$ docker image pull alpine:latest

latest は文字通り最新版なので、明示的にバージョンを指定する場合は、Docker Hub に記載されているバージョンを利用します。

Dockerfile と docker コマンドを使う

確認用シェルスクリプト「hello.sh」の作成

Dockerイメージを作成する前に、Dockerコンテナ内で動作させるシェルスクリプトにサンプルを作成してみます。


#!/bin/sh
echo "Hello Shell Script"

Dockerfile でイメージ作成

次にDockerイメージを作成しますが、一般的に Dockerfile ファイルを利用しして設定します。

※今回は「ubuntu:18.04」イメージを利用します。


FROM ubuntu:18.04

COPY hello.sh /usr/local/bin
RUN chmod +x /usr/local/bin/hello.sh

CMD ["hello.sh"]

インストラクション(命令)

Dockerfile は DSL(ドメイン固有言語)を利用して、イメージを作成します。
その際、でてくるのがインストラクションです。

FROM

Dockerイメージ(OS)を指定(ビルド前)

COPY

ホスト側(Mac)から、Dockerコンテナの指定パスにコピーします。
上記はイメージビルド前に、ホスト側の「hello.sh」を「/usr/local/bin/」にコピーします。

類似的にリモート追加や自動解凍できる ADD インストラクションもある。

RUN

Dockerコンテナ内で、指定のコマンドを実行します。
上記は、コンテナにコピーした「/usr/local/bin/hello.sh」に実行権限を与えます。

CMD

完成したDockerイメージに対して、コマンドを実行します。
「,」で区切って引数を与えることもできます。
RUN との違いは、CMDはイメージビルド後に実行します。

Dockerイメージビルド

hello:latest とラベルをつけて Dockerイメージをビルドします。


$ docker image build -t hello:latest .

引数はイメージ名と Dockerfile の配置したパスを指定します。


$ docker image build -t イメージ名:タグ名 Dockerfile配置パス
タグ名は、一般的にバージョンとして利用されます。

Dockerコンテナ起動


$ docker container run hello:latest
Hello Shell Script

「hello:latest」コンテナが起動後に、shell.sh が実行されました。

Docker イメージの確認


$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
hello                latest              05e3eb5ff03b        5 minutes ago       64.2MB
...

リポジトリが「hello」、タグ「latest」、イメージID「05e3eb5ff03b」で作成されています。

Docker コンテナの確認


$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62faba8c4477 hello:latest "hello.sh" 8 minutes ago Exited (0) 8 minutes ago admiring

hello:latest コンテナが、コンテナID「62faba8c4477」で作成されていることがわかります。

Dockerイメージのタグ変更

実際に運用する場合、Github のように namespace や バージョンをつける必要がでてきます。
例えば、イメージ名「hello」は、namespace(空間名)をつけて「sample/hello」、 バージョンは「:」で区切って、「hello:latest」、「hello:0.1.0」のような書き方ができます。

namespace をつける


$ docker image tag hello:latest example/hello:latest

バージョンをつける


$ docker image tag hello:latest example/hello:0.1.0

$ docker images
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
example/hello                                              0.1.0               ca00cb953947        2 hours ago         64.2MB
example/hello                                              latest              ca00cb953947        2 hours ago         64.2MB
...

不要になったコンテナ&イメージの削除

Docker を利用しているとイメージやコンテナを作りすぎて、パソコンの容量を圧迫しがちです。

また、イメージやコンテナリストが大量になり確認もしづらくなるので、リスト検索して不要なものは削除しましょう。

  • コンテナIDの一覧「docker ps -a」
  • イメージIDの一覧「docker images」

Docker コンテナ一覧


$ docker container list

Docker コンテナ削除


$ docker rm コンテナID

Docker イメージ一覧


$ docker image list
//または
$ docker images

Docker イメージ削除


$ docker rmi イメージID

いちから始める Docker -起動してみる- (2020年)
  2020/03/11

Docker もう一度を最初から学ぶ為に、シリーズで書いていきます。

今回は、

  • Docker for Mac インストール&起動
  • docker コマンドを確認

Docker For Mac をインストール

Mac で Docker を始めるには「Docker For Mac」を利用するのがお手軽です。

公式のページの Docker For Mac から dmgファイル(※2020-03-02時点:version 2.2.2.0)をダウンロードします。

Docker for Mac

Docker for Mac のメニュー

Docker for Mac の基本設定

Docker の自動起動

Start Docker when you log in

自動アップデート

Automatically check for updates

CPU・メモリ設定

個人差がありますが、デフォルトで使用してみて足りないようなら変更してみると良いでしょう。

ホストOS側のマウント

「File Sharing」で、Dockerコンテナ側がマウントするディレクトリを設定できます。
差し当たり、デフォルトのままで良いと思います。

ネットワーク

Dockerコンテナが利用する、IPアドレスの範囲をしていします。
自分でカスタマイズしても構いませんが、差し当たりデフォルトにしておきます。

docker コマンドを使ってみる

Docker for Mac がインストールできたら、Mac のターミナルで docker コマンドを実行してみます。

Docker バージョン確認


$ docker --version
Docker version 19.03.5, build 633a0ea

Docker Getting Started コンテナ起動

今度はあらかじめ作成されている Dockerコンテナを起動してみます。

docker/getting-started というコンテナが Docker Hub に用意されているので、これを起動してみます。


$ docker run -dp 80:80 docker/getting-started

色々とオプションが入ってますが、わかりやすく書くと以下の通りとなります。


$ docker run オプション コンテナ名

run:コンテナを起動

今回の場合、docker/getting-started​ がコンテナイメージとなります。

-d:バックグラウンド起動

通常はこのバックグラウンドで起動します。

-p:ポート番号マッピング

ホスト側のポート番号と、コンテナ側のポート番号をマッピングします。


ホストポート番号:コンテナポート番号

コンテナ起動のオプションは、


$ docker run --help

で調べることができます。

起動中のコンテナ確認

コンテナを起動したら、コンテナの起動状況(プロセス)を確認します。


$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                NAMES
4abe131793c6        docker/getting-started   "nginx -g 'daemon of…"   31 minutes ago      Up 31 minutes       0.0.0.0:80->80/tcp   unruffled_roentgen

上記は、コンテナIDが「4abe131793c6」、コンテナイメージが「docker/getting-started」で起動しています。

Docker Getting Started をブラウザで確認

Mac側のポート80 と Docker側のポート80 がマッピングされているため、

http://localhost/

にアクセスすると、Webサーバを介してチュートリアルが表示されます。

Docker Getting StartedイメージのWebサーバは「nginx」が起動しているようです。

Docker Getting Started コンテナを停止

コンテナを停止します。


$ docker stop 4abe131793c6

引数は docker ps で記載されたコンテナIDを指定して


$ docker stop コンテナID

Docker For Mac は遅い?

Docker を利用する場合、Mac(ホスト) と Dockerコンテナ 間でディスク共有します。
ディスクマウントの仕様上、Docker For Mac は他のDocker環境に比べて速度が遅い(レイテンシー)傾向があります。
これは個人差があるので一概に言えませんが、開発できないレベルではありません。

<< 最初 < 前ページ 次ページ > 最後 >>