今回はコンテナ技術であるDockerについて解説します。
ITエンジニアを目指す方、もしくはITエンジニアの方は、本ブログで掲載しているVMware等を使った仮想マシンでのスキルアップもありますが、Dockerを使うことでもパソコン一つでスキルアップができるため、是非ご読了ください。
よく仮想マシンと比較されるDockerですが、このDockerを使うことで習熟環境を構築したりできるので、とても便利です。
また、Dockerは非常に軽量になっているため、仮想マシンより扱いやすい面もあります。
本ブログでも、仮想マシン利用環境として、VMware、ViturlBoxを使ってLiunx環境をWindows上に構築して、Linuxのコマンドやミドルウェアの設定に関して、スキルアップするための記事を過去に掲載していますのでご参考ください。
Dockerとは
Dockerとはコンテナ型の仮想環境を提供するものになります。
Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。
VMwareやVirtulaBoxなどによる仮想マシンは、ホストマシのハイパーバイザ上にゲストOSを動かし、その上でアプリやミドルウェアを実行する環境を作ります。
一方、コンテナはホストマシン上にコンテナを動かすDocker Engineを構成し、ホストマシンのカーネルを利用して動きます。
プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。
ゲストOS領域を不要とするため、OS周りのファイルは必要最低限となり、軽量で高速に起動、停止などが可能になっています。
コンテナの中には、動作させたい「アプリケーション」、そのアプリケーションの実行に必要な「ミドルウェア」、「ライブラリ」などが含まれます。
なお、Docker EngineはLinux上でのみ起動します。
DockerでNginxなどのWebサーバを動かすためにはコンテナイメージが必要になります。
コンテナイメージは、Web上のDocker Hubにて公開されているため、必要なイメージを簡単に取得できます。
コンテナイメージは、CentOS、Ubuntsu、Apache HTTP、Nginx、PostgreSQL、Wordpress、hadoopなどがイメージされたものが公開されています。
仮想マシン型 と コンテナ型仮想環境の構成イメージは以下になります。
Dockerを使うと何が便利か、何が不便か
Dockerを使えば、非常に軽量で、起動が早く、ポータビリティも容易になります。
さらにコンテナオーケストレーションとしてkubernetes(k8s)が存在します。
コンテナオーケストレーションとは、コンテナサービスにおいて、設定、管理、調整を自動化することを意味します。
デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションの状態を管理し、以下のようなことができます。
・アプリケーションのビルドに伴ってコンテナ環境を自動でデプロイ
・コンテナが予期せず停止した場合のセルフヒーリング
・コンテナ内のミドルウェアやアプリケーションのバージョンアップするのに
一つ一つのコンテナを順々にアップデートするローリングアップデート
・Blue/Green Deployment環境の構築
・kubernetesが提供するロードバランシング機能
ただし、プロダクトにおける名前空間の扱い等も考慮して扱う必要があり、熟知して扱うのにはそれなりのハードルがあります。
結局、仮想マシンで管理した方が楽だし、技術者も確保できるっていう話もあるので、
kubernetesの技術的なメリットを得るにしても、習得や運用ノウハウのハードル、人材確保とを天秤にすると導入しない方がコスト的にも良いという判断もあります。
デメリットとしてはホストOSのカーネルとの互換性が必要なアプリケーションを考慮する場合は、ホストOSを考慮してコンテナエンジンを構成する必要があります。
例えば、RHELで動くアプリケーションのコンテナを作って、Ubuntsu上にコンテナを移動させたとしても、カーネルの互換性がなく、動作しないということが考えられます。
Dockerのストレージについて
通常、コンテナ環境は一時的なものであり、コンテナ内部にデータを保存しても、コンテナ削除後はデータも削除されます。
そこで、コンテナのデータを永続的に利用するためには、コンテナの外にデータを置く必要があり、ストレージの利用方法に「バインドマウント」、「ボリューム」という種類があります。
■ボリューム
Linuxの「 /var/lib/docker/volumes/ 」の領域に保存領域を作成してコンテナへ提供します。
WindowsにDocker toolboxなどを入れて仮想マシン上にコンテナを作成する場合は、コンテナを提供している仮想マシンにてボリュームとなる保存領域を提供します。
■バインドマウント
ホストシステムのどこでも保存領域を作ってコンテナへ提供します。
WindowsにDocker toolboxをインストールしている場合は、Windowsの保存領域をコンテナへ提供します。
・コンテナを起動する仮想マシンが、コンテナホスト
・コンテナを起動するための仮想マシン(コンテナホスト)を起動するマシンが、ホストOS
といって区別して理解するのがいいと思いますが、様々なWebサイトを見たりしても区別して書かれてないので頭が混乱することがありますが、コンテナホストなのか、ホストOSなのか、どこのことをいっているのかはよく理解することが大事です。
提供イメージは以下です。
Dockerをつかった習熟環境の構築
それではDockerコンテナを使うための環境についての解説になります。
基本的にコマンドを実行することで環境を構築が可能です。
また、Dockerfileを使うと、必要なパッケージやアプリ、各種設定を含んだDockerイメージを自分で作成して使用することが可能です。
さらにDocker Composeを使うと、複数のコンテナで構成されるアプリケーションについて一度にデプロイ、起動、停止が可能です。
コンテナはコンテナホストへのポートフォワーディングでアクセスする形になることに注意して、設定を見てください。
ホストOSからコンテナホストに向けて、8080ポート番号でアクセスしますが、ポートフォワーディングされ80番ポートでコンテナ上で起動しているWebへアクセスされます。
Docker toolboxを利用
DockerToolboxはWindows、Macに対応しており、Virtual Box上にDocker Engineをインストールした仮想マシン(default)を使ってコンテナを起動させます。
仮想マシン(default)は別のサーバに変更したり、メモリなどを変更したりできます。
また、Hyper-Vを使っていると利用できないため、Hyper-Vは停止させておく必要があります。
DockerToolboxのダウンロードはこちら(Git)
DockerToolbox-19.03.1.exeをクリックしてダウンロードします。
インストール時に「Kitematic」にチェックできる場合でもチェックを外してください。
既に廃止されていて、アプリを起動しても使えません。
ダウンロードが完了すると以下のアイコンが出ます。
Hyper-Vの停止コマンドは以下になります。
Hyper-Vのステータス確認
bcdedit /enum | find "hypervisorlaunchtype"
Huyper-Vの停止
bcdedit /set hypervisorlaunchtype off
shutdown.exe /r /t 0
なお、有効にする場合は以下です。
bcdedit /set hypervisorlaunchtype auto
shutdown.exe /r /t 0
Nginxコンテナを起動
NginxのDockerイメージを使ってWebサーバーを立ててみましょう。
docker run --name some-nginx -d -p 8080:80 nginx
ブラウザから、以下へアクセス
http://<コンテナホストのIPアドレス>:8080/
MySQLコンテナを起動
他の例として、MySQLのコンテナを動かしてみましょう。
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
コンテナを作成したら、以下のコマンドでbashシェルでログインします。
docker exec -it some-mysql bash
Dockerfileを使って起動<CentOS版>
Dockerfileという名前にて、拡張子無しのファイルを作成します。
Dockerfile.txtではなく、Dockerfileです。
メモ帳等で、Dockerfileを開いたら、以下を記述。
※リポジトリの更新エラーでパッケージが取得できない場合があるので、気を付けてください。
FROM centos:latest
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum install -y iputils
RUN yum install -y net-tools
Dockerfileが置いてあるディレクトリ/フォルダに移動して以下のコマンドを実行
docker image build -t centos:v1
docker images
docker run --name test-container -it centos:v1 /bin/bash
次に以下のコマンドを打ち、インストールした「iputils、net-tools」が使えることを確認
ifconfig
ping <ifconfigで見えたIPを指定する>
Dockerfileを使って起動<ubuntu版>
CentOS版と同様にDockerfileを作りますが、CentOS用のDockerfileとは別のディレクトリで作成して下さい。
ubuntu用のDockerfileが置いてある場所でDockerfileをビルドするようにします。
FROM ubuntu:latest
RUN cd /etc/apt/sources.list.d/
sudo sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive/%g" /etc/apt/sources.list
RUN apt-get update -y
RUN apt-getinstall -y iputils-ping
RUN apt-get install -y net-tools
Dockerfileが置いてあるディレクトリ/フォルダに移動して以下のコマンドを実行
docker image build -t ubuntu:v1
docker images
docker run --name test-container-ubuntu -it ubuntu:v1 /bin/bash
次に以下のコマンドを打ち、インストールした「iputils、net-tools」が使えることを確認
ifconfig
ping <ifconfigで見えたIPを指定する>
Docker Desktopを利用
Docker Desktopを使う場合は、Hyper-Vを有効にしている必要があります。
(注)Windowsを使っている人は、Docker DesktopとDocker toolboxと共存できませんので、
Docker toolboxを既にインストールしているならアンインストールを推奨します。
Docker Desktopを起動すると以下のように表示されます。
コンテナの起動は、コマンドプロンプトやPowerShellを使います。
Linux(CentOS)にDocker Engineをインストールして利用
CentOSを利用してDocker Engineをインストールします。(今時CentOS!?ってのは置いといて。
※Ubuntsuにも適用できますので、その場合にはapt-getでOKです。
CentOSを最新化する
sudo yum update
リポジトリを設定する
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yumのパッケージインデックスを更新
sudo yum makecache fast
Dockerをインストールする
yum list docker-ce.x86_64 --showduplicates | sort -r
sudo yum install docker-ce
sudo yum install docker-ce docker-ce-cli containerd.io
Dockerを起動する
sudo systemctl start docker
OS 再起動後に、自動でDocker が起動されるようにする
sudo systemctl enable docker
コンテナを起動する
sudo docker run hello-world
永続ストレージを利用したコンテナの起動
ボリュームの利用
まずはコンテナホスト上(仮想マシンdefault)に保存領域であるボリュームを作成します。
docker volume create volume-test
作成されたことを確認します
docker volume ls
以下のコマンドにてコンテナを起動させます。
docker run -it -v volume-test:/share/logs centos
バインドマウントの利用
バインドマウントを行う場合は、Virtual boxの仮想マシン(default)の共有フォルダが設定されている箇所で行います。
通常は、「c/Users」配下が使えます。
以下のどのコマンドもWindowsのフォルダ「c/Users/Docker/mount」を使います。
docker run -it -v /c/Users/Docker/mount:/tmp centos /bin/bash
docker run -it -v "$(pwd)":/tmp centos /bin/bash
docker run -it --name centos --mount type=bind,src=/c/Users/Docker/mount,dst=/tmp docker.io/centos:latest /bin/bash
DBコンテナ(MySQL)に永続化ストレージを提供して起動
パターン① コマンドのみで対応
docker volume create test
docker run --name test-mysql -v test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Password1 -d mysql:8.0.27
docker exec -it test-mysql bash
パターン② docker-composeで対応
docker-compose.ymlファイルを作成して、以下を記述
version: "3.7"
services:
db:
image: mysql:8.0
container_name: mysql8
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: db_local
MYSQL_USER: wp_user
MYSQL_PASSWORD: password
以下のコマンドを実行
docker compose up -d
以下のコマンドを入力し、ログインします。
docker exec -it コンテナIDもしくはコンテナ名 mysql -u root -p
もしくは一度シェルにログインしてから、MySQLへログインも可能です。
docker exex -it コンテナIDもしくはコンテナ名 bash
mysql -u root -p
停止する場合は以下のコマンドを実行
docker compose down
WordPressを永続化ストレージを利用して起動
docker-compose.ymlファイルを作成して、以下を記述
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root_pass
- MYSQL_DATABASE=wordpress_db
- MYSQL_USER=wordpress_user
- MYSQL_PASSWORD=wordpress_pass
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./wordpress:/var/www/html
ports:
- "8080:80"
restart: always
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_NAME=wordpress_db
- WORDPRESS_DB_USER=wordpress_user
- WORDPRESS_DB_PASSWORD=wordpress_pass
volumes:
db_data:
以下のコマンドを実行
docker-compose up -d
ブラウザへアクセスする
http:/<コンテナホストのIPアドレス>:8080/
DBのデータ保存用のボリュームを含めて、環境を全て削除します。
docker-compose down --volumes
Dockerの仕組みについて
ここまででdocker run、buildコマンドを使ってきましたが、仕組みは以下になっています。
また、commit、push、pull等のコマンドもあります。
docker runは、docker hubのリモートリポジトリのコンテナイメージを取得※し、ローカル環境(=現在コマンドを打っている環境)のリポジトリにコンテナイメージを格納し、コンテナを起動します。
※もしローカルリポジトリにコンテナイメージがある場合は、docker hubへは行きません。
docker buildは、Dockerfileを使って、docker hubのリモートリポジトリからコンテナイメージを取得し、ローカル環境(=現在コマンドを打っている環境)のリポジトリにコンテナイメージを格納するところまでを行います。
※もしローカルリポジトリにコンテナイメージがある場合は、docker hubへは行きません。
docker commitは、作業中のコンテナに対して、ミドルウェアやパッケージのインストールなどして、手を加えた場合、ローカルリポジトリにコンテナイメージを格納するために使います。
docker pushは、docker hubのリモートリポジトリにローカルにあるコンテナイメージを格納します。
dokcer pullは、dokcer hubのリモートリポジトリのコンテナイメージをローカルのリポジトリに格納します。
以下はdocker run起動時のイメージです。
以下はdocker buildをした時のイメージです。
Dockerのネットワークについて
dockerのネットワークには、bridge、null、hostの3つがあります。
[brdige]は、仮想bridgeを構成して、コンテナホストとは異なるネットワークを構成します。
デフォルトではネットワークを指定しない場合は、このbridgeが利用されます。
NAT形式で動作するもので、VirtualboxやVMwareと同様のものです。
コンテホストにはdocker0というbridgeが作成され、コンテナホストがもつバーチャルインタフェースと接続された状態になります。
[null]は、ネットワーク接続を必要しないコンテナを作成する場合に使用されます。
nullで作ったコンテナにログインし、ifconfigを打つとloopbackインターフェースのみが見えます。
[host]は、コンテナホストと同じネットワークを利用し、コンテナホストと同じIPになります。
ポートフォワーディングを使わないアクセスをしたいときにこちらを使います。
さらに、ここでは割愛しますが、[overlay]も追加機能として存在します。
VXLANにより、異なる物理筐体のマシン間でコンテナの移動を可能にさせます。
各マシン=ノードにはクラスタ構成を実装するDocker swarmを利用することになります。
以下のコマンドでネットワークを確認できます。
docker network ls
以下のコマンドでbirdge用のコンテナのネットワークを指定します。
docker network create --internal TEST-NW
以下のコマンドでコンテナにネットワークを接続します。
docker network connect TEST-NW <コンテナIDもしくはコンテナ名>
その他便利なコマンド
コマンド集
コマンド | 概要 |
---|---|
docker ps | 起動中等のコンテナを表示 |
docker stop <コンテナID> | 起動中のコンテナを停止 |
docker rmi <コンテナID> | イメージIDでコンテナを削除 |
docker rmi -f <コンテナID> | イメージIDでコンテナを強制削除 |
docker rm <コンテナID>|<コンテナ名> | 終了済みのコンテナの削除 |
docker login | docker hubへログインする |
docker-compose up | 複数のコンテナを一度に起動 |
docker-compose ps | compese管理のコンテナ状態確認 |
docker-compose down | 複数のコンテナを一度に停止 |
docker logs <コンテナID> | 終了状態のコンテナのログ確認 |
docker logs -f <コンテナID>|<コンテナ名> | リアルタイムのログ出力 |
docker images | ローカルリポジトリの確認 |
docker push <フォルダ/イメージ名>:<タグ名> 例:docker push repo/centos:test | ローカルリポジトリのイメージをリモートリポジトリへの転送 |
docker commit <コンテナID> <コンテナ名>:<タグ名> 例:docker commit 12345f centos:test | ローカルリポジトリにイメージを格納 |
docker exec -it <コンテナID>|<コンテナ名> bash | 実行中コンテナを対話型シェルで実行 |
docker start <コンテナID>|<コンテナ名> | 停止状態のコンテナの起動 |
docker run -d –name <コンテナ名> -p 8080:80 <コンテナイメージ名> 例:docker run -d –name nginx -p 8080:80 nginx | バックグラウンドで動作させる d:バックグラウンド p:ポートフォワーディング |
docker volume ls | ボリューム一覧 |
dokcer volume cretate <ボリューム名> | ボリュームの作成 |
docker volume rm <ボリューム名> | ボリュームの削除 |
docker volume inspect <ボリューム名> | コンテナホストのvolumeがあるパスを調べる |
docker netwrok crater <ネットワーク名> | コンテナネットワークの作成 |
docker network ls | コンテナネットワーク一覧 |
docker network rm <ネットワーク名> | コンテナネットワーク削除 |
docker netwrok prune | 未使用のコンテナネットワーク削除 |
docker inspect –format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ <コンテナID> | コンテナネットワーク上のIPを確認 |
dockerマシンの作成・切替
DockerToolboxで使う、dockerマシン(=docker Engineが構成された仮想マシン)の作成や切替
以下のコマンドは、メモリ4GBにて新しいdocker用仮想マシンを作成します。
docker-machine create -d virtualbox --virtualbox-memory 4096 dockerVM
以下のコマンドでdockerマシンの検索、起動、停止、切り替え(env)を行います。
docker-machine ls
docker-machine start default
docker-machine start dockerVM
docker-machine stop dockerVM
docker-machine rm dockerVM
docker-machine env dockerVM
一連のコマンド作業
以下の2つはよく使うコマンドです。
コンテナ全停止
docker stop $(docker ps -aq)
コンテナ全削除
docker rm $(docker ps -aq)
コンテナ含めた全てのリソースを削除して、きれいさっぱりしたい場合は以下
docker system prune -a
まとめ
・Dockerはコンテナ型仮想環境であり、仮想マシンより軽量で高速
・コンテナは一時利用が基本のため、ストレージは永続化しないとデータは残らない
・Dockerを使ってスキル習熟をしよう!!
コメント