一、インストール
公式サイト:www.docker.com
インストール手順(CentOS 7)
- パッケージの更新
yum update - 必要なパッケージのインストール
yum install -y \ yum-utils \ device-mapper-persistent-data \ lvm2 - リポジトリの設定
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce/repo - Dockerのインストール
yum install -y docker-ce - バージョンの確認
docker -v
二、Dockerの基本概念
Dockerのアーキテクチャ
アーキテクチャの構成要素
- イメージ(Image):Dockerイメージはrootファイルシステムのようなものです。例えば公式のUbuntu 16.04イメージには、完全なUbuntu 16.04最小システムのrootファイルシステムが含まれています。
- コンテナ(Container):イメージとコンテナの関係は、オブジェクト指向プログラミングにおけるクラスとオブジェクトの関係に似ています。イメージは静的な定義であり、コンテナはイメージが実行される実体です。コンテナは作成、起動、停止、削除、一時停止などができます。
- リポジトリ(Repository):リポジトリはコードの管理センターのようなもので、イメージを保存するために使用されます。
ミラーアクセラレーターの設定
docker hub(https://hub.docker.com)からイメージをダウンロードすると遅いため、ミラーアクセラレーターを設定することが一般的です。
- USTC
- Alibaba Cloud
- Tencent Cloud
Alibaba Cloudでの設定例
- Alibaba Cloudにログイン
- 「コンテナイメージサービス」を検索
- 「ミラーアクセラレーター」を選択
- 必要な設定コードをコピー&ペースト
- 設定が成功したか確認
cat /etc/docker/daemon.json
三、Dockerコマンド
1. Dockerサービス関連コマンド
- サービスの起動
systemctl start docker - サービスの停止
systemctl stop docker - サービスの再起動
systemctl restart docker - サービス状態の確認
systemctl status docker
2. Dockerイメージ関連コマンド
- イメージの確認
docker images # 全イメージIDの確認 docker images -q - イメージの検索
docker search <イメージ名> - イメージのプル
docker pull <イメージ名>[:バージョン] - イメージの削除
# IDで削除 docker rmi <ID> # 名前とバージョンで削除 docker rmi <イメージ名:バージョン> # 全イメージの削除 docker rmi `docker images -q`
3. Dockerコンテナ関連コマンド
- コンテナの確認
# 実行中のコンテナ docker ps # 全コンテナ docker ps -a - コンテナの作成と起動
docker run <パラメータ> # 例1: docker run -it --name=<コンテナ名> <イメージ名>[:バージョン] [/bin/bash] # 例2: docker run -id --name=<コンテナ名> <イメージ名>[:バージョン] # コンテナへの接続 docker exec -it <コンテナ名> /bin/bash - コンテナの起動
docker start <コンテナ名> - コンテナの停止
docker stop <コンテナ名> - コンテナの削除
# 名前で削除 docker rm <コンテナ名> # IDで削除 docker rm <コンテナID> # 全コンテナの削除 docker rm `docker ps -aq` - コンテナ情報の確認
docker inspect <コンテナ名>
四、Dockerコンテナのデータボリューム
概念と役割
概念
- データボリュームはホストマシン上のディレクトリまたはファイルです
- コンテナディレクトリとデータボリュームディレクトリがバインドされると、変更が即座に同期されます
- 1つのデータボリュームを複数のコンテナで同時にマウントできます
- 1つのコンテナも複数のデータボリュームをマウントできます
役割
- コンテナデータの永続化
- 外部マシンとコンテ間間の間接通信
- コンテナ間のデータ交換
データボリュームの設定
docker run ... -v ホストディレクトリ:コンテナ内ディレクトリ...
# 例
docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
データボリュームコンテナの設定
設定手順
- c3データボリュームコンテナの作成と起動
docker run --name=c3 -v /volume centos:7 /bin/bash - c1、c2コンテナの作成と起動(--volumes-fromパラメータ使用)
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash - コンテナの詳細確認
docker inspect c1
五、Dockerアプリケーションのデプロイ
MySQLのデプロイ
- MySQLイメージの検索
docker search mysql - MySQLイメージのプル
docker pull mysql:5.6 - コンテナの作成(ポートマッピング、ディレクトリマッピング設定)
mkdir ~/mysql cd ~/mysql docker run -id \ -p 3307:3306 \ --name=mysql_container \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
Tomcatのデプロイ
- イメージの検索
docker search tomcat - イメージのプル
docker pull tomcat - コンテナの作成
mkdir ~/tomcat cd ~/tomcat docker run -id --name=tomcat_container \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ tomcat
Nginxのデプロイ
- イメージの検索
docker search nginx - イメージのプル
docker pull nginx - コンテナの作成
mkdir ~/nginx cd ~/nginx mkdir conf cd conf vim nginx.conf docker run -id --name=nginx_container \ -p 80:80 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx
Redisのデプロイ
- イメージの検索
docker search redis - イメージのプル
docker pull redis:5.0 - コンテナの作成
docker run -id --name=redis_container -p 6379:6379 redis:5.0 - 外部からのアクセス
redis-cli.exe -h <ホストIP> -p 6379
六、Dockerfile
イメージの原理
Linuxシステムの構成とDockerイメージの階層構造について説明します。
イメージの作成
- コンテナからイメージへの変換
docker commit <コンテナID> <新しいイメージ名:新しいバージョン> docker save -o <圧縮ファイル名> <新規作成イメージ名:バージョン> docker load -i <圧縮ファイル名>
Dockerfileの概念
Dockerfileはテキストファイルで、命令の羅列で構成されます。各命令は1つのレイヤーを構築し、最終的に新しいイメージを構築します。
主要命令
| 命令 | 役割 | 備考 |
|---|---|---|
| FROM | 親イメージの指定 | dockerfileのベースとなるイメージを指定 |
| MAINTAINER | 作成者情報 | dockerfileの作成者を明記 |
| RUN | コマンドの実行 | ビルド時にコマンドを実行 |
| CMD | コンテナ起動コマンド | デフォルトの起動コマンドを指定 |
| COPY | ファイルのコピー | ビルド時にファイルをイメージにコピー |
| ADD | ファイルの追加 | COPYに加えてリモートからの追加も可能 |
| WORKDIR | 作業ディレクトリ | コンテナ内の作業ディレクトリを指定 |
実践例
例1: カスタムCentOS7イメージ
FROM centos:7
MAINTAINER example
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
例2: Spring Bootプロジェクトのデプロイ
FROM java:8
MAINTAINER example
ADD springboot-app.jar app.jar
CMD java -jar app.jar
七、Dockerサービスオーケストレーション
サービスオーケストレーションの概念
複数のコンテナをデプロイする際、各マイクロサービスを手動で起動・停止するのは大変な作業になります。サービスオーケストレーションは、一定のビジネスルールに基づいてコンテナを一括管理する手法です。
Docker Composeの概要
Docker Composeは、複数のコンテナを分散してデプロイするためのツールです。アプリケーションの完全な開発ライフサイクル(サービスのビルド、起動、停止)を提供します。
Docker Composeのインストール
# Linuxへのインストール
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
Docker Composeを使用したnginx+Spring Bootプロジェクトのオーケストレーション
- docker-composeディレクトリの作成
mkdir ~/docker-compose cd ~/docker-compose - docker-compose.ymlファイルの作成
version: '3' services: nginx: image: nginx ports: - "80:80" links: - app volumes: - ./nginx/conf.d:/etc/nginx/conf.d app: image: springboot-app expose: - "8080" - ディレクトリ構造の作成
mkdir -p ./nginx/conf.d - nginx設定ファイルの作成
server { listen 80; access_log off; location / { proxy_pass http://app:8080; } } - コンテナの起動
docker-compose up
八、Dockerプライベートリポジトリ
プライベートリポジトリの構築
# 1. プライベートリポジトリイメージのプル
# 2. プライベートリポジトリコンテナの起動
# 3. ブラウザで http://<プライベートリポジトリサーバーIP>:5000/v2/_catalog にアクセスし、{"repositories":[]}が表示されれば成功
# 4. daemon.jsonの修正
{"insecure-registries":["<プライベートリポジトリサーバーIP>:5000"]}
# 5. Dockerサービスの再起動
systemctl restart docker
docker start registry
イメージのプライベートリポジトリへのアップロード
# 1. イメージをプライベートリポジトリ用にタグ付け
docker tag centos:7 <プライベートリポジトリサーバーIP:5000>/centos:7
# 2. タグ付けしたイメージのアップロード
docker push <プライベートリポジトリサーバーIP:5000>/centos:7
プライベートリポジトリからのイメージのプル
docker pull <プライベートリポジトリサーバーIP:5000>/centos:7
九、Docker関連概念
コンテナ仮想化と従来の仮想化の比較
コンテナの特徴
- コンテナイメージは軽量で、実行可能な独立したソフトウェアパッケージです。コード、実行環境、システムツール、システムライブラリ、設定など、ソフトウェア実行に必要なすべてを含みます。
- コンテナ化されたソフトウェアは、どのような環境でも一貫して実行できます。
- コンテナはソフトウェアに独立性を与え、外部環境の差異の影響から守り、同じインフラ上で異なるソフトウェアを実行する際のチーム間の競合を減少させます。
コンテナと仮想マシンの比較
- 共通点:コンテナと仮想マシンは、両方ともリソースの分離と割り当ての利点があります。
- 相違点:
- コンテナはOSを仮想化し、仮想マシンはハードウェアを仮想化します。
- 従来の仮想マシンは異なるOSを実行できますが、コンテナは同じタイプのOS(ホストカーネルを共有)のみを実行できます。