docker
ほぼ自分用

Dockerのおべんきょう

Dockerとは

公式ドキュメントを日本語化したらこうなります

Dockerは、開発者とシステム管理者 がコンテナを使用してアプリケーションを開発、展開、実行するためのプラットフォームです。Linuxコンテナを使用してアプリケーションを配備することをコンテナ化といいます。コンテナは新しいものではありませんが、アプリケーションを簡単に配備するためにコンテナを使用するのは簡単です。

イメージとコンテナ、サーバー、クライアントなどについてわかりやすくまとめてくれているのがこのサイトです。
Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き)

コンテナを定義するにはDockerfileというファイルを使用します。

Docker Hubからイメージを持ってくる

※Docker Indexは今Docker Hubという名前になっています。

Dockerのサイトで検索してからpullしていきます。

Docker Hub
https://hub.docker.com/

検索して、pullしたいものの名前を確認します。

これと同じことをターミナル上でもできます!

docker search 検索したいもの

もしくは

docker search 検索したいもの | more

個人的には下がオススメ

pullするにはこれ

docker pull pullしたいもの

imageがpullできたかどうかの確認

imageの一覧を確認してみます

docker images

docker image ls でもできます。

イメージのIDがそのイメージの実体を指すので、、ID番号が一緒の時は、実体も一緒ということです。

イメージの詳細を確認したい時は、方法は2種類あります。

  1. イメージのリポジトリとタグを使用するバージョン
docker inspect リポジトリ名:タグ
  1. イメージのIDを使うパターン
docker inspect イメージのID(最初の3~4文字くらいだけで良い)

イメージを削除したい時は

これも先ほどと同様に2種類あります。

docker rmi リポジトリ名:タグ

もしくは

docker rmi イメージのID(最初の3~4文字くらいだけで良い)

このrmiは「remove image」で覚えておくと良いと思います。

コンテナを操作する

docker run イメージ名 実行したいコマンド

バックグラウンドで実行したいなら、

docker run -d イメージ名 実行したいコマンド

「このイメージ名で、このコマンドを実行する」という意味になります。


実行しているコンテナを確認するには

docker ps
```

で、全てのコンテナを確認するには、

docker ps -a

最新の5つだけみたい!!という時はこのようにします。

docker ps -a -n=5

コンテナのログを見る場合はこうします。

docker logs コンテナのID

常にログを出しておきたい場合はこのようにします。

docker logs -f コンテナのID

実行中のコンテナを止めるには2通りあります。

docker stop ID番号

もしくは

docker kill ID番号

コンテナを実行するには

docker start

でいけます!

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

コンテナからターミナルに入るにはこうします。

docker run -i -t イメージ名 /bin/bash

「インタラクティブモードで入り、ターミナルを使用する」という意味です。

ターミナルに入ったら、一旦ターミナルから抜けてください。

次は、イメージを作成します。

docker commit ID番号 イメージの名前

確認してみましょう

docker images

Docker image ls でもできる

Dockerfileを作る

これまで、imageを作ってコンテナで編集してまたimageを作るという工程をやってきました。

それはdocker buildというコマンドでできます。

自動化するために、Dockerfileというファイルを作ります。

# このイメージ名を使うよ
FROM イメージ名
# 誰がこのファイルを作成したか
MAINTAINER 名前 <メールアドレス> 

# RUNはbuildするときに実行されるもの(インストールとかできる)
RUN echo "buildなうです"

# CMDはrunするときに実行されるもの
# CMD echo "runなうです" (このように書くこともできるけど、推奨されているのは、以下の書き方)
CMD ["echo", "runなうです"]

このdockerfileを実行するには、

docker build

新しいイメージに名前をつけるには、こうします

docker build -t つけたい名前 . 

作ったイメージを実行させてみよう

docker run イメージ名

もうちょっと実用的なdockerfileを作る

# apache httpdをインストール
RUN yum install httpd

# /.index.htmlを/var/www/html/にコピー
ADD ./index.html /var/www/html/

# 外部に公開するポート番号を指定
EXPOSE 80

#RUNのときにサーバーを立ち上げる
CMD ["usr/sbin/httpd", "-D", "FOREGROUND"]

ホスト側のポートを8080、コンテナー側の80にリダイレクト
-dはバックグラウンドで動かすという意味
イメージを動かす

docker run  -p 8080:80 -d イメージ名 

関係ないけど、上に出てこなかった物を紹介。
dockerファイルでワーキングディレクトリを指定したい場合はWORKDIR、パスを通したい時はENVを使います

WORKDIR /app
ENV PATH $PATH:通したいパス

イメージをpushする

Dockerのアカウントを持っていない人は公式サイトで登録してください

まずはDockerにログインします

docker login

イメージをpushします

docker push イメージ名

docker-compose.yml

docker-compose.ymlファイルは、ドッカーコンテナがどのように振る舞うべきかを定義するファイルです。

build

buildは何をするものかというと

構築時に適用するオプションを指定します。
build で指定できるのは、構築用コンテクストのパスを含む文字列だけでなく、 context の配下にある特定の物(オブジェクト)や、 dockerfile のオプションと 引数 を指定できます。

だそうです。
一言で言えば、dockerfileからビルドするそう。

こんな感じで使うみたいです。

build: ./dir

build:
  context: ./dir #DockerfileまでのパスやgitのリポジトリのURLとかを指定する
  dockerfile: Dockerfile-alternate # Dockerfileの代わりになるもの。構築時は別にファイルも使えますが、構築時のパスも指定する必要があります。
  args: #buildのオプション
    buildno: 1

cap_add, cap_drop

コンテナのケーパビリティ(capabilities)を追加・削除します。ケーパビリティの一覧は man 7 capabilities をご覧ください。

だそうです。

ケーパビリティってなんなんやろって調べたらこんなのが出てきました。

明日使えない Linux の capabilities の話

Docker のセキュリティ

command

デフォルトのコマンドを上書きします。

だそうです。変更したいコマンドがあれば、上書きしましょう。

container_name

自分でコンテナ名を指定できます。

こんな感じ

container_name: hello

depends_on

サービス間の依存関係を示します。

これは、公式ドキュメントがわかりやすい

サービス間の依存関係を指定したら、2つの効果があります。

docker-compose up を実行したら、依存関係のある順番に従ってサービスを起動します。以下の例では、 web を開始する前に db と rails を実行します。
docker-compose up サービス(の名称) を実行したら、自動的に サービス の依存関係を処理します。以下の例では、 docker-compose up web を実行したら、 db と redis も作成・起動します。
簡単なサンプル:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

entorypoint

エントリーポイントを調べてみると、、、

エントリポイントとは、コンピュータプログラムを構成するコードのうち、最初に実行することになっている位置のこと

だそうです、IT用語多すぎて難しい・・・

entrypoint: /code/entrypoint.sh

こんな感じでしょうか

env_file

ファイル上の定義から環境変数を追加します

Compose ファイルを docker-compose -f ファイル名 で指定する場合は、 env_file ファイルは指定したディレクトリに対する相対パスとみなします。

なるほどなるほど

environment

こちらも環境変数を追加します。
こっちはよく使うものだと思います。

データベースを使う時はこんな感じになります。

environment:
      MYSQL_DATABASE: データベース名
      MYSQL_USER: ユーザー名
      MYSQL_PASSWORD: パスワード
      MYSQL_ROOT_PASSWORD: ルートのパスワード

パスワードが入ってなくても大丈夫なら

MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

とかもあります。

expose

ホストマシン上で公開するポートを指定せずに、コンテナの公開(露出)用のポート番号を指定します。これらはリンクされたサービス間でのみアクセス可能になります。内部で使うポートのみ指定できます。

だそうです。

image

コンテナを起動する際に元となるイメージを指定します。

こんな感じ

image:hello

links

コンテナを他のサービスとリンクします。

こんな感じ

links:
 - db
 - db:database
 - redis

external

このオプションを true に設定したら、Compose の外にネットワークを作成します(訳者注:Compose が管理していない Docker ネットワークを利用します、という意味)。 docker-compose up を実行してもネットワークを作成しません。もしネットワークが存在していなければ、エラーを返します。

だそうです。

新しいアプリケーションを実行する

急にswarmという言葉が出てきたので、調べてみました。

Docker SwarmによるDockerクラスタ環境の構築

まずは初期化

docker swarm init

アプリ名は自分でつけます。

docker stack deploy -c docker-compose.yml アプリ名

アプリの規模を拡大したり、縮小したりする場合は、再度実行するか、replicasの値を変更することでできます。

アプリを停止させる

docker stack rm アプリ名

swarmを停止する場合は以下のコマンドを実行します.

docker swarm leave --force