Docker クイック スタート学習入門チュートリアル

目次

1. dockerの基本概念

2. アプリケーションをパッケージ化して実行するにはどうすればよいですか?

3. Docker でアプリケーションを変更するにはどうすればよいですか?

4. 作成した画像を共有するにはどうすればよいですか?

5. ボリューム名を使用してデータをコンテナに保存するにはどうすればよいですか? // データマウント

6. 別のマウント方法: ディレクトリマウント

7. コンテナ間の相互通信を実現

8. Docker Compose を使用して複数のコンテナ間の共有操作を簡素化する


1. dockerの基本概念

コンテナとは何ですか?

        公式の説明では、Docker コンテナは、ホスト上の他のすべてのプロセスから分離されたマシン上のサンドボックス プロセスであるとされています。つまり、コンテナーはオペレーティング システム内で独立したプロセスにすぎず、いわゆるコンテナ化は、実際にはオペレーティング システムを欺くための糖衣構文にすぎません。

コンテナイメージとは何ですか?

        実行中のコンテナーの依存ファイルはイメージであり、イメージを通じて複数のコンテナーを作成できます。

2. アプリケーションをパッケージ化して実行するにはどうすればよいですか?

(1) プログラムソースファイルの入手

準備: git をインストールし、 git を使用してリモート コードをローカルにプルする        必要があります次のプログラムは、公式の Docker の例です。

git clone https://github.com/docker/getting-started.git

(2) コンテナイメージの作成

        コンテナー イメージを作成するには、Dockerfile が必要ですDockerfile は、ファイル拡張子のない単なるテキストベースのファイルです。Dockerfile には、Docker がコンテナー イメージを作成するために使用する命令のスクリプトが含まれています。

        Dockerfile の作成: ダウンロードした入門プロジェクトに空の Dockerfile を作成します (ファイルにはファイル形式がないことに注意してください)

        次のように Dockerfile ファイルの内容を入力します (Dockerfile ファイルの準備については特別な説明があります。ここでは、Dockerfile ファイルを使用してコンテナー イメージを作成する必要があることだけを知っておく必要があります)。

# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

        Dockerfile ファイルの現在のディレクトリ (app ディレクトリの下) で、docker build コマンドを使用してコンテナー イメージを作成します。

docker build -t getting-started .
  •  -t はイメージのタグを表します。タグ名は開始部分です。
  • . docker build コマンドが現在のフォルダーから Dockerfile ファイルを検索することを示します。

(3) コンテナの起動と実行        

        イメージが正常に作成されたら、docker image コマンドを使用して、システム内に作成されたイメージを表示します。イメージを表示した後、 docker run コマンドを使用して、作成されたイメージ ファイルを実行します。

docker run -dp 3000:3000 getting-started

        -d はコンテナをバックグラウンドで実行することを意味し、-p はコンテナとマシンの間にポート マッピングを作成することを意味します。ポート マッピングが必要です。そうしないと、コンテナ内のプログラムにアクセスできません。// コンテナは仮想マシンであると言う人もいますが、これはポート マッピングをよりよく説明しているようです

http://localhost:3000/        にアクセスする と、コンテナが正常に起動したことを示す次のインターフェイスが表示されます。

3. Docker でアプリケーションを変更するにはどうすればよいですか?

        アプリケーションを変更する場合は、変更を有効にするためにイメージ ファイルを再作成する必要があります (この記事の 2 番目のセクションのプロセスを繰り返します)ポートの競合を避けるために、実行中のコンテナを最初に停止する必要があることに注意してください。コンテナを操作するためのコマンドをいくつか示します。

docker ps 可以获取到容器的id
docker stop <the-container-id>  通过id停止一个容器
docker rm <the-container-id>    容器停止后,删除一个容器
docker rm -f <the-container-id> -f 即force,表示强制删除

4. 作成した画像を共有するにはどうすればよいですか?

(1) リモート倉庫を作成する

        Docker ID をお持ちでない場合は、Docker Hub にユーザーを登録し、Docker Hub を使用してリモート リポジトリを作成できます。リモート ウェアハウスを作成する手順は、公式ドキュメントで詳しく説明されています (ドキュメントのリンク アドレスは記事の最後にあります)。これは、git でリモート ウェアハウスを作成してコードをプッシュするプロセスとほぼ同じです。 

(2) イメージをリモートウェアハウスにプッシュします

        イメージをリモート ウェアハウスにプッシュした後、他のユーザーがイメージをダウンロードできるようになります。一般的に使用されるコマンドは次のとおりです。

docker push YOUR-USER-NAME/getting-started:tagname // 推送镜像
docker tag getting-started YOUR-USER-NAME/getting-started  //给镜像打标签
docker push YOUR-USER-NAME/getting-started // 拉取镜像

5. ボリューム名を使用してデータをコンテナに保存するにはどうすればよいですか? // データマウント

        コンテナが起動されるたびに、前のコンテナによって更新されたデータはクリアされます。これは、各コンテナにはファイルの作成/更新/削除のための独自の「個別のスペース」があるためです。同じイメージを使用している場合でも、これらの変更は別のコンテナーには反映されません。// コンテナは互いに分離されています

        上記の問題を解決するアイデアは、ボリュームを使用してデータを保存することです。

        コンテナ内の特定のファイル システム パスは、ボリュームを介してホストにマウントできますコンテナ内のディレクトリがマウントされている場合、そのディレクトリ内の変更はホストにも表示されます。コンテナーの再起動時に同じディレクトリをマウントすると、同じファイルが表示されます。// docker はデータ マウントとディレクトリ マウントという 2 つのマウント方法を提供します

(1) docker volume create コマンドを使用してボリュームを作成します。todo-db はボリュームの名前です。

docker volume create todo-db

(2) ボリューム名を使用してマウントすると、/etc/todos パスの下のすべての変更がボリュームに同期され、同じボリュームを使用する他のコンテナも同じ情報を参照できます。

// デフォルトでは、todo アプリケーションはデータを SQLite データベースの /etc/todos/todo.db ファイルに保存します。

docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

        では、コンテナー ボリューム ( volume ) を作成すると、コンテナー内のファイルは物理マシン上のどこに保存されるのでしょうか? docker volume Inspection コマンドを使用して、コンテナー ボリュームに関する詳細情報を表示します

$ docker volume inspect todo-db
[
    {
        "CreatedAt": "2023-02-07T01:34:40Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

        マウントポイントは、ファイルがディスク上に保存される正確なパス (自動生成) です。ただし、ほとんどのコンピュータでは、このパスにはホストからこのディレクトリにアクセスするための root アクセスが必要です。// Windows システムもこのパスですが、Win システムではこのパスに直接アクセスできないため、さらに面倒になります

6. 別のマウント方法: ディレクトリマウント

        ディレクトリ マウント: ホスト ファイル システムからコンテナ内でディレクトリを共有できるようにします。ディレクトリ マウントとコンテナ ボリューム マウントの違いは次のとおりです。

名前付きボリューム ( volume ) バインドマウント (ディレクトリマウント)
ホストの保存場所 ドッカー選択 カスタマイズ
バインディングの例

タイプ=ボリューム、

src=my-volume,target=/usr/local/data

タイプ=バインド、

src=/path/to/data,target=/usr/local/data

新しいボリュームにコンテナの内容を入力します はい いいえ
ボリュームドライバーをサポート はい いいえ

        例: Getting-started/app ディレクトリに次のコマンド (win) を入力します。cmdコマンドで有効になった黒いウィンドウの代わりに PowerShell を使用していることに注意してください。それでもエラーが発生する場合は、編集ツールを使用して編集できます。次のコマンドを 1 行にまとめます

docker run -dp 3000:3000 `
    -w /app --mount type=bind,src="$(pwd)",target=/app `
    node:18-alpine `
    sh -c "yarn install && yarn run dev"
  • -dp 3000:3000ポート マッピング
  • -w /app は、コマンドが実行される作業ディレクトリまたは現在のディレクトリを設定します。
  • --mount type=bind,src="$(pwd)",target=/appホストの現在のディレクトリをコンテナ内の /app ディレクトリにバインドします
  • Node:18-alpineプログラムを実行するには、ベース イメージに依存する必要があります (上記の DockerFile にも記述されています)
  • sh -c "yarn install && tongue run dev" は、 sh を使用してシェルを実行し、yarn install を使用して依存パッケージをインストールし、yarn run dev を使用してサービスを開始します (開発スクリプトは Getting-started\app\package で定義されています) .json ファイル (nodemon を起動します)

        nodemon はツールであり、nodemon プログラムは、プログラムが変更されたときにコンテナーを自動的に再起動するために使用されます。もちろん、2 番目のセクションで説明した手順を使用して、プログラムをパッケージ化して再起動することもできます。

        コンテナーが起動したら、次のコマンドを使用して docker の実行ログを表示します。

docker logs -f <container-id>

7. コンテナ間の相互通信を実現

        デフォルトでは、Docker は互いに独立しており、互いに分離されています。では、分離された 2 つのコンテナーが通信できるようにするにはどうすればよいでしょうか? // たとえば、アプリケーションをデプロイする Docker は、データベースをデプロイする Docker と通信します。

        答えは、Docker 間に通信ネットワークを確立すると、同じ通信ネットワーク内の異なるコンテナが相互に通信できるようになります一般に、コンテナをネットワークに配置するには、1. コンテナの起動時に割り当てる方法、2. 既存のコンテナのネットワークに接続する方法があります。これら 2 つの方法は、以下で別々に使用されます。// 各セクションのケースでは、ポートの競合を避けるために、以前に開始したコンテナを閉じる必要があります

(1) 通信ネットワークの構築

docker network create todo-app

(2) mysqlコンテナを起動し、todo-appネットワークに接続します(Win PowerShell版)

docker run -d `
     --network todo-app --network-alias mysql `
     -v todo-mysql-data:/var/lib/mysql `
     -e MYSQL_ROOT_PASSWORD=secret `
     -e MYSQL_DATABASE=todos `
     mysql:8.0
  • --network-alias は実行中のコンテナのエイリアスを指定します。エイリアスを使用して特定の IP を置き換えます。ネットワーク内でコンテナを見つける方が便利です。
  • -v todo-mysql-data:/var/lib/mysqlこのコマンドは、コンテナー ボリューム todo-mysql-data を自動的に作成し、データベース データを mysql に保存します (/var/lib/mysql はデータベースが保存されるパスです)データ)

        データベース コンテナーが開始されているかどうかを確認するには、コンテナーに入って確認してみます。// パスワードはシークレットであり、スクリプトで指定されています。

docker ps // 查看正在运行中的容器
docker exec -it <mysql-container-id> mysql -u root -p

        パスワードを入力してログインできればデータベースは起動していますので、以下のコマンドを実行してmysqlが正常であることを確認してください。

mysql> SHOW DATABASES;
mysql> exit;

        では、mysql が起動したら、このコンテナをどうやって見つけるのでしょうか? 答えは、nicolaka/netshoot ネットワーキング ツールを使用すること  です。まず、Docker を介してこのツールをインストールします

docker run -it --network todo-app nicolaka/netshoot

        インストール後、この DNS ツールを使用できるようになります。//以下のMysqlはコンテナ起動時に指定したエイリアスです

dig mysql/容器id

        次に、mysql コンテナの関連ネットワーク情報を確認できます。

        mysql コンテナの ip は 172.19.0.2 ( todo-app ネットワークのアドレス) であることがわかります。一般に、このアドレスは明示的に指定せずに、mysql エイリアスを介してのみ見つけることができます。

(3) アプリケーションコンテナを起動し、mysqlコンテナに接続します

        Todo アプリケーションは、MySQL 接続設定を指定するためのいくつかの環境変数の設定をサポートしています。

  • MYSQL_HOST - MySQL サーバーのホスト名
  • MYSQL_USER - データベース接続ユーザー
  • MYSQL_PASSWORD - データベース接続パスワード
  • MYSQL_DB - 接続先の mysql の特定のデータベース

        Getting-started\app ディレクトリで次のコマンドを実行します (Win PowerShell バージョン)

docker run -dp 3000:3000 `
   -w /app -v "$(pwd):/app" `
   --network todo-app `
   -e MYSQL_HOST=mysql `
   -e MYSQL_USER=root `
   -e MYSQL_PASSWORD=secret `
   -e MYSQL_DB=todos `
   node:18-alpine `
   sh -c "yarn install && yarn run dev"

        正常に実行された後、Docker の起動ログを表示できます。

        この時点で、プログラムhttp://localhost:3000/を開いて項目をプロジェクトに追加し、データベース コンテナーに入って追加したばかりのデータを表示します。

docker exec -it <mysql-container-id> mysql -p todos  //进入数据库容器
select * from todo_items; // 查看表中数据

        ここまでで、2 つのコンテナ間の相互通信を実現しました。

8. Docker Compose を使用して複数のコンテナ間の共有操作を簡素化する

        Docker Compose は、複数のコンテナーでアプリケーションを定義および共有するために使用されます。Compose を使用すると、YAML ファイルを作成してサービスを定義し、1 つのコマンドですべてのサービスを開始または停止できます。

(1) Docker Composeをインストールする

        Windows 環境に Docker Desktop がインストールされている場合、デフォルトで Docker Compose がインストールされています。Linux 環境の場合は、別途インストールする必要があります。インストールチュートリアルは、ここをクリックしてください。インストール後、ツールのバージョンを確認できます。

docker compose version

(2) Composeファイルの書き込み

        Getting-started\app ディレクトリに docker-compose.yml ファイルを作成します。

        次に、 docker-compose.yml ファイルに次の内容を入力します。// ドキュメントの具体的な準備については、記事の最後にあるドキュメントを参照してください。ここでは一般的な手順のみを紹介します。

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

 (3) コンテナを一括起動する

        Getting-started\app ディレクトリで次のコマンドを実行します。 -d はバックグラウンドで開始することを意味します

docker compose up -d

        次に、次の出力情報が表示されます。

         このメッセージは、コンテナー ボリュームと通信ネットワークの両方が作成されたことを示しており、デフォルトでは、Docker Compose がアプリケーション スタックのネットワークを自動的に作成します (そのため、Compose ファイルでネットワークを定義する必要はありません)。

        この時点で、すべてのコンテナーが正常に開始されました。Docker Desktop をインストールしている場合は、次のインターフェイスが表示されます。

(4) コンテナをまとめて閉めて取り出す

        次のコマンドを使用してコンテナをバッチシャットダウンして削除します

docker compose down

        上記のコマンドでは作成したコンテナボリュームは削除されないため、コンテナボリュームを削除するには別のコマンドを使用する必要があることに注意してください。

参考ドキュメント:概要 | Docker ドキュメント

おすすめ

転載: blog.csdn.net/swadian2008/article/details/125242638
おすすめ