Docker 入門: デプロイの悪夢にさようなら!

Docker 入門: デプロイの悪夢にさようなら!

初心者開発者は、非効率なコード更新、リリース、デプロイ、および環境の一貫性維持の課題に直面することがよくあります。開発環境で問題なく動作するコードが、別のマシンではエラーになる可能性があります。クラウドコンピューティングの時代において、従来の方法でコードをデプロイするのは時代遅れに感じられます。このブログ記事では、Docker を紹介します。Docker は Go 言語ベースで、Apache 2.0 ライセンスの下でオープンソース化されたアプリケーションコンテナエンジンです。このコンテナ化技術により、開発者はアプリケーションとその依存関係を軽量でポータブルなコンテナにパッケージ化できます。これらのコンテナは、環境の違いを気にすることなく、任意の一般的な Linux マシンにデプロイできます。

Docker と仮想マシン (VM) の比較

前述の通り、Docker は仮想化を利用します。仮想化について議論するとき、仮想マシン (VM) は避けて通れません。両方とも仮想化に依存しているため、その違いについて考えるのは自然なことです。詳しく見ていきましょう。まず、典型的な VM アーキテクチャ図を見てみましょう。インフラストラクチャ(基盤となるハードウェアを表す)の上には、ハイパーバイザーがあります。これは物理サーバーとオペレーティングシステムの間の仲介役として機能し、複数のオペレーティングシステムとアプリケーションが基盤となるハードウェアを共有できるようにします。仮想マシンは、ホストオペレーティングシステムの上に複数の異なるオペレーティングシステムを実行し、ハイパーバイザーを使用して基盤となるハードウェアにアクセスします。3 つの分離されたアプリケーションを実行する必要がある場合、3 つの仮想マシンを作成することになります。つまり、ハイパーバイザーの上で 3 つのオペレーティングシステムが実行されるため、リソースのオーバーヘッドが大きくなります。

典型的な VM アーキテクチャ図

(注: 図では、ハイパーバイザーの上にホストオペレーティングシステムがあるべきです)対照的に、Docker は非常に軽量です。Docker デーモン (Docker Daemon) がハイパーバイザーを置き換え、オペレーティングシステム上で直接実行されます。アプリケーションのソースコードと依存関係は Docker イメージにパッケージ化されます。Docker エンジンはこのイメージを使用してコンテナを作成します。異なるアプリケーションは分離されたコンテナで実行されます。さらに、Docker デーモンはオペレーティングシステムと直接通信して、Docker コンテナにリソースを割り当てます。完全なオペレーティングシステムのオーバーヘッドがないため、コンテナの起動時間は仮想マシンの数分から Docker コンテナのわずかミリ秒に短縮され、効率が大幅に向上し、ディスク容量やその他のシステムリソースを大幅に節約できます。Docker には魅力的な利点がありますが、仮想マシンを完全に置き換えるものではありません。各テクノロジーにはそれぞれの強みがあります。仮想マシンはランタイム環境全体を分離するのに優れており、クラウドプロバイダーは VM を使用してユーザーを分離するのが一般的です。Docker は通常、異なるアプリケーションを分離します。

Docker の使用方法

Docker のインストール(CentOS 7 の例)

  1. 必須のシステムツールをインストール:
yum install -y yum-utils device-mapper-persistent-data lvm2 
  1. システムカーネルと yum キャッシュを更新:
yum update
yum makecache fast
  1. Docker をインストールして起動:
yum -y install docker-ce
systemctl start docker 
  1. Docker が正常にインストールされたか確認:
docker run hello-world 

画面に “Hello from Docker” と表示されれば、インストール完了です。おめでとうございます!

概念

Docker をさらに深く掘り下げる前に、スムーズな学習のためにいくつかの主要な概念を説明します。

  1. Docker イメージ: Docker イメージは、Docker コンテナを作成するためのテンプレートです
  2. Docker コンテナ: Docker はイメージを介してコンテナを作成し、一連の独立したアプリケーションを実行します
  3. Docker レジストリ: イメージを保存するためのコードリポジトリ

通常、Docker レジストリから適切なイメージをダウンロードし、それを使用してコンテナを作成し、アプリケーションを実行します。

2 つの一般的な例を通じて、これらの概念を結び付け、Docker の使用方法を説明します。

Docker で Python をインストール

前述の通り、Docker コンテナを使用する最初のステップは、リポジトリから対応するイメージをダウンロードすることです。これにより、チュートリアルの最初のコマンドが登場します。

  • 目的: イメージリポジトリ内の特定のイメージを検索します。
  • 構文: docker search [OPTIONS] TERM
  • 例: docker search python
  • 説明: リポジトリ内の Python 関連イメージを検索します。
[root@novita ~]# docker search pythonINDEX       NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/python                           Python is an interpreted, interactive, obj...   4356      [OK]
docker.io   docker.io/django                           Django is a free web application framework...   856       [OK]
docker.io   docker.io/pypy                             PyPy is a fast, compliant alternative impl...   196       [OK]
docker.io   docker.io/kaggle/python                    Docker image for Python scripts run on Kaggle   125                  [OK]
docker.io   docker.io/arm32v7/python                   Python is an interpreted, interactive, obj...   38
docker.io   docker.io/centos/python-35-centos7         Platform for building and running Python 3...   36

タグ(バージョン)3.7 の公式イメージを選択します。

docker pull

  • 目的: イメージリポジトリから指定されたイメージをプル(ダウンロード)または更新します。
  • 構文: docker pull [OPTIONS] NAME:TAG
  • 例: docker pull python:3.7
  • 説明: リポジトリからタグ 3.7 の Python イメージをダウンロードします。
[root@novita ~]# docker pull python:3.7
Trying to pull repository docker.io/library/python ...3.7: Pulling from docker.io/library/python
5ae19949497e: Downloading [=============>                                     ] 13.72 MB/50.38 MB
ed3d96a2798e: Download complete
f12136850781: Downloading [============================================>      ] 8.789 MB/9.978 MB
1a9ad5d5550b: Downloading [==>                                                ] 2.628 MB/51.77 MB
6f18049a0455: Waiting
ce39fa9d79d1: Waiting
Digest: sha256:d8718f4c8f28360c88d2d8b53681edb3c95e6a7bacedabd32eb5b1d120a75dc5
Status: Downloaded newer image for docker.io/python:3.7

Docker が指定のイメージをダウンロードしました。既存の Docker イメージを表示するには:

docker images

  • 目的: ローカルイメージを一覧表示します。
  • 構文: docker images [OPTIONS] [REPOSITORY[:TAG]]
  • 例: docker images
  • 説明: ローカルのすべての Docker イメージを表示します。
[root@novita ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/python        3.7                 42d620af35be        6 days ago          918 MB
docker.io/rabbitmq      3-management        7aae48fa6ef6        7 days ago          179 MB
docker.io/golang        latest              f50db16df5da        9 days ago          774 MB

python3.7 イメージが存在します。それを使用してコンテナを作成しましょう。

docker run

コンテナを作成する前に、ID について簡単に触れます。Docker では、ID はイメージまたはコンテナを一意に識別します。これらは「コマンド + ID」を使用して操作します。例えば、前述のコードでは、python3.7 のイメージ ID は 42d620af35be です。

  • 目的: 新しいコンテナを作成します。
  • 構文: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Python 環境をテストするために、ローカルに hello.py ファイルを作成します:

#!/usr/bin/python 
import sys 

print("Hello, Docker!") 
print(sys.version)  # Python のバージョン番号を出力

このコードが /root/code/python に保存されていると仮定します:

[root@novita python]# docker run  -v $PWD:/usr/src/code  -w /usr/src/code python:3.7 python hello.py 
Hello, Docker! 
3.7.4 (default, Jul 13 2019, 14:04:11) [GCC 8.3.0] 

このコマンドを分解して説明します:

  • docker run: コンテナを作成します。
  • -v $PWD:/usr/src/code: ローカルディレクトリを Docker コンテナにマウントします。ここでは、コマンドを実行したディレクトリをコンテナ内の /usr/src/code にマウントしています。コロンでローカルパスとコンテナパスを区切ります。$PWD の代わりに絶対パスを使用することもできます。
  • -w /usr/src/code: コンテナの作業ディレクトリを設定します。Python コードのディレクトリが /usr/src/code にマウントされているため、作業ディレクトリとして設定します。
  • python:3.7: 使用するイメージを指定します。イメージ ID を使用することもできます。
  • python hello.py: コンテナ内でこのコマンドを実行します。

思考実験: /root/data/hello.go ファイルがあり、イメージ ID f50db16df5da の Golang コンテナを使用して実行したい場合、コマンドはどうなりますか? (ヒント: Go コードを実行するコマンドは go run FILENAME です)

Docker で MariaDB をインストール

MariaDB イメージを検索してダウンロードできると仮定して、起動に焦点を当てましょう。データベースのようなサービスでは、ホスト上で対応するポートを開く必要があります。Docker でこれを実現するにはどうすればよいでしょうか? ディレクトリのマウントと同様に、ポートマッピングを使用します。

[root@novita python]# docker run -d -v /data/mysql/:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  --restart unless-stopped 3a2ef06682ac 
  • -d: コンテナをバックグラウンドで実行します。
  • -p 3306:3306: コンテナ内のポート 3306 をホストのポート 3306 にマッピングします。
  • -e MYSQL_ROOT_PASSWORD=123456: MariaDB の root パスワードを 123456 に設定します。
  • --restart unless-stopped: コンテナが予期せず停止した場合に自動的に再起動します。
  • 3a2ef06682ac: コンテナを作成するためのイメージ ID。

次に、データベースサービスが実行中か確認します:docker ps

  • 目的: コンテナを一覧表示します。
  • 構文: docker ps [OPTIONS]
[root@novita ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
107b52416c13        3a2ef06682ac        "docker-entrypoint..."   5 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp                                                                       quizzical_mcnulty 

次に、コンテナの内部環境にアクセスします。docker exec

  • 目的: 実行中のコンテナでコマンドを実行します。
  • 構文: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • 例: docker exec -it 107b52416c13 bash
  • 説明: ID 107b52416c13 のコンテナにアクセスし、bash コマンドを実行します。

コンテナ内では、通常の Linux 環境と同じように操作できます。以前に設定した認証情報を使用して、MariaDB にアクセスできます。

[root@novita ~]# docker exec -it 107b52416c13 bash 
root@107b52416c13:/# mysql -u root -p123456 
Welcome to the MariaDB monitor.  Commands end with ; or \g. 
Your MariaDB connection id is 11 
Server version: 10.4.6-MariaDB-1:10.4.6+maria~bionic mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
MariaDB [(none)]> 

これまでに、Docker の基本を学びました。さらに探求してみてください。

Novita AI は、AI の野望を実現するオールインワンのクラウドプラットフォームです。シームレスに統合された API、サーバーレスコンピューティング、GPU アクセラレーションにより、AI 駆動のビジネスを迅速に構築し拡張するためのコスト効率の高いツールを提供します。インフラストラクチャの悩みを解消し、今すぐ無料で始めましょう - Novita AI があなたの AI の夢を現実にします。