Dockerコマンド & Dockerfile & Docker Compose まとめ

2022/01/25

今回は Docker について基本的なコマンドや Dockerfile、Docker Compose について整理してみました。

 

INDEX

 

用語の理解

Docker

CPU やメモリのオーバーヘッドが少ない、超軽量な仮想マシンを作って動かせるものです。

仮想マシンの OS には Linux しか利用できません。

 

ホスト

Docker を動かしている環境のことを指します。

今、自分が使っている PC の OS のことであり、macOS や Windows のことをさします。

 

イメージ

コンテナが動作するためにベースとなるファイル群。

コンテナによってイメージが変更されることはなく不変のもの。

Docker Hub から取得可能。

 

コンテナ

イメージから作成されたインスタンスのようなもの。

コンテナが動作することで生成されたファイルは、イメージではなくコンテナに紐づいて管理される。

 

Docker Hub

あらかじめよく使われる便利なイメージが登録されています。

ここからイメージを取得して、それをベースに改造する形を取るのが一般的な利用方法になります。

 

Dockerコマンド

 

イメージの一覧表示


$ docker image ls
REPOSITORY      TAG             IMAGE ID        CREATED         SIZE
webap           latest          c3d22c1264c0    2 weeks ago     169MB
ubuntu          latest          ea4c82dcd15a    4 weeks ago     85.8MB
nginx           latest          dbfc48660aeb    4 weeks ago     109MB
centos          centos7         75835a67d134    5 weeks ago     200MB

 

稼働コンテナの一覧表示


$ docker container ls
CONTAINER ID  IMAGE  COMMAND                  CREATED        STATUS        PORTS                  NAMES
997488f0976d  nginx  "nginx -g 'daemon of…"   8 seconds ago  Up 7 seconds  0.0.0.0:8080->80/tcp   hungry_hodgkin

 

イメージ管理


# ---------------------------------------------------------
# ダウンロード済みのイメージの一覧を表示
# ----------------------------------------------------------
$ docker images

# ---------------------------------------------------------
# イメージの取得
#----------------------------------------------------------
# Docker Hubにあるubuntuリポジトリからコンテナイメージを取得
$ docker pull ubuntu
# さきほど取得したイメージ(ubuntu)からコンテナを作成
$ docker run -it ubuntu

# ---------------------------------------------------------
# イメージを削除
#----------------------------------------------------------
# イメージ名またはイメージIDを指定
$ docker rmi image1
$ docker rmi 99c1098d5884

#---------------------------------------------------------
# コンテナからイメージを作成
#---------------------------------------------------------
$ docker commit cont1 image1:latest

#---------------------------------------------------------
# イメージにタグ付け
#---------------------------------------------------------
$ docker tag my-app my-app:1.2.3

#---------------------------------------------------------
# Dockerfileからイメージを作成
#---------------------------------------------------------
# 構文
$ docker build -t イメージ名:タグ名 Dockerfileのあるディレクトリ

# 実例
# 以下の場合、Dockerfileのあるディレクトリに移動する
$ docker build -t tomcat:1 .

 

コンテナ関連


#--------------------------------------
#  コンテナ作成
# -------------------------------------
# コンテナを起動状態で作成
# httpd:latest イメージから、cont1 コンテナを作成
# --name オプションはコンテナ名を指定
$ docker run -d --name cont1 httpd:latest

# コンテナプロセスが /bin/bash の様な標準入出力を対象とするプロセスの場合は -it オプションをつける
$ docker run -d -it --name cont1 centos:7

# ---------------------------------
# コンテナ内で作業をする
# ---------------------------------
# exec は指定したコンテナで指定したコマンドを実行
# -it はコンテナ側のコマンドの入出力を手元のターミナルに接続
# webserver がコンテナの名前
# /bin/bash が実行するコマンド
$ docker exec -it webserver /bin/bash

# 例)postgresにログイン
$ docker exec -it コンテナ名 -U postgres

# ---------------------------------
# コンテナをイメージ化
# ---------------------------------
# 何か色々設定した後のものをイメージ化するには commit コマンドを使います。
# イメージの命名規則 /イメージ名:[タグ名]
$ docker commit webserver honjyo/webserver:0.0

# -------------------------
# コンテナ一覧
# -------------------------
# 動いているコンテナの確認
$ docker ps

# 停止しているコンテナも確認
$ docker ps -a

#-------------------------
# コンテナの削除
#-------------------------
$ docker rm cont1(※コンテナ名)
$ docker rm  a403ffe73d31(※コンテナID)

# -f(--force)オプションをつけるとコンテナが起動中であっても削除することが可能
$ docker rm -f cont1

#--------------------------------
# コンテナの開始・停止
#-------------------------------
# コンテナを開始
# "cont1" はコンテナ名になります。
# コンテナ名をコンテナIDに変更してもOK。
$ docker start cont1

# コンテナを停止
$ docker stop cont1

# コンテナを強制的に停止
$ docker kill cont1

# コンテナを再起動
$ docker restart cont1

 

Dockerレジストリ(DockerHub)関連


#----------------------------------------------------------------
# Docker Hub からイメージをダウンロード
#----------------------------------------------------------------
$ docker pull 
$ docker pull centos:7

# タグ(:タグ名)を省略すると、最新版(:latest)をダウンロードする
$ docker pull centos

#--------------------------------------------------------------
# Dockerレジストリにイメージをアップロード
#--------------------------------------------------------------
$ docker images

# ローカルイメージに改めてタグをつける
# docker tag  /[:]
$ docker tag laravel-app honjyo/laravel-app

$ docker push honjyo/laravel-app

#-------------------------------------------------------------------------------
# Dockerレジストリから指定した単語を含むイメージを検索
#-------------------------------------------------------------------------------
$ docker search mariadb

#---------------------------------------------------------
# Docker Hub(http://docker.io)にログイン
#--------------------------------------------------------
$ docker login -u ユーザ名 -p パスワード


 

Dockerfileについて

Dockerfile とは、Docker のイメージを作成する際に実行するコマンドをコード化して、一つのファイルにまとめたものです。

Dockerfileを使うと手順を全て自動化することができます。

 

dockerfileのサンプル

以下は Docker で Laravel をインストールする際の Dockerfile のサンプルです。


# どんな docker イメージを利用して構築をするか
# FROM : ここではPHPの公式イメージである「php:7.4-apache」というあらかじめPHPとApacheがインストールされているイメージを、Docker Hubというサイトからダウンロードしてくるようになっている。
FROM php:7.4-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD:ローカルのファイルをDockerコンテナ内にコピーする
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
# RUN:コンテナ内でコマンド実行する
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs

# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

 

Dockerfileで使用できるコマンド

FROM

元となるコンテナを指定します。


# CentOS7 を Docker Hub からダウンロード
FROM centos:7

# タグを省略すると :latest が指定されたとみなす
FROM centos

 

RUN

ビルド時に実行するコマンドを指定します。


# シェル形式
RUN yum install -y httpd

# exec形式
RUN ["yum", "install", "-y", "httpd"]

 

COPY

ホストからコンテナイメージにファイルやディレクトリをコピーします。


# ファイルをファイルにコピー
COPY .file1.conf /etc/file.conf

# ファイルをディレクトリ配下にコピー
COPY ./file2.conf /etc/

# ディレクトリをディレクトリにコピー
COPY ./my-app /opt/my-app

 

ADD

ホストからコンテナイメージにファイルやディレクトリをコピーします。

COPY とは異なり、転送元に .tar.gz などの圧縮ファイルを指定すると自動的に展開してコピーすることができます。


# ファイルをファイルにコピー
ADD .file1.conf /etc/file1.conf

# ファイルをディレクトリ配下にコピー
ADD ./file2.conf /etc/

# ディレクトリをディレクトリにコピー
ADD ./my-app /opt/my-app

 

 

Docker Composeについて

Docker Compose は、WEBサーバコンテナとDBサーバコンテナなど、関連する複数のコンテナをまとめて管理するツールです。

 

docker-compose.yml サンプル

Docker Compose を使用する際、「docker-compose.yml」というファイルが必要となります。

このファイルには、

  • Dockerイメージをビルドするための情報(使用するDockerfile、イメージ名など)
  • コンテナ起動するための情報(ホストとの共有ディレクトリ設定やポートフォワードなどの起動オプションなど)
  • 使用するDockerネットワーク

などを定義します。

Laravel をコンテナ起動する場合を例に docker-compose.yml についてみてみましょう。


# Compose fileのバージョン指定
version: '3'

# どんなコンテナを立ち上げるか
services:

  # ---------------------------------
  # laravelを動かすコンテナ
  # ---------------------------------
  app:
    # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ
    ports:
      - "80:80"
    # 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
    build: ./docker/app
    # コンテナの名前を指定
    container_name: laravel_app
    # ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定
    # ./src は docker-composer.yml のディレクトリ直下にある src を設定している
    # コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる
    volumes:
      - ./src:/var/www/html

  # ----------------------------------
  # MySQLを動かすコンテナ
  # ----------------------------------
  db:
    # Docker HubからMySQL5.6の公式イメージをダウンロードしてくる指定
    image: mysql:5.7
    container_name: laravel_db

    # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認する
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
      TZ: 'Asia/Tokyo'

    # 起動時のコマンド
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 3306:3306

  # ----------------------------------
  # phpMyAdminを動かすコンテナ
  # ----------------------------------
  phpmyadmin:
    # Docker Hubからイメージをダウンロード
    image: phpmyadmin/phpmyadmin:5

    # コンテナの名前
    container_name: laravel_phpmyadmin

    # コンテナと他のサービスを繋げる
    links:
      - db

    # localhost:8080 で phpmyadmin の管理画面にアクセス
    ports:
      - 8080:80

    # セッション情報をボリュームに設定して永続化
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

  # ----------------------------------
  # MailCatcherを動かすコンテナ
  # ----------------------------------
  mailcatcher:
    image: schickling/mailcatcher
    
    # コンテナの名前
    container_name: laravel_mailcatcher
    
    ports:
      - 1080:1080

 

docker-compose.ymlで使用するコマンド

version

docker-compose で使用するバージョンを定義

 

Services

Docker-Compose では、アプリケーションを動かすための各要素を Service と読んでいます。

 

container_name

コンテナ名を明示することができます。

docker-compose.yml が置いてある場所で docker-compose up すると laravel_app という名前でコンテナが立ち上がります。

 

image

コンテナ作成に必要なイメージを指定します。

 

build

docker-compose build のときにビルドするための Dockerfile のパスを指定しています。

 

ports

各 service のポート番号を指定しています。

ホストOS(local)のポート番号:dockerコンテナ内のポート番号という書き方ができます。

ここでは、Apache のポート番号が 80 なので、80:80 という書き方をしています。

 

volumes

docker の中でデータを永続化する設定です。

この設定をすることで、コンテナ内のデータは消えずに残ってくれます。

 

command

docker-compose up で実行されるコマンドです。

 

environment

環境変数を設定します。

database.yml に書かれているパスワードを環境変数として設定し、mysql に接続できるよにします。

 
以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-環境構築