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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。