Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)

Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)

学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Cloud 上の Docker リポジトリを直接申請しました (管理センター -> ミラー リポジトリの作成 -> 私の場合は East China 2 なので、GitHub アカウントをバインドするだけです)。完了です。今後は、このリポジトリを使用してプッシュし、プル時にアクセラレータを使用し、使用シナリオに応じて切り替えに注意し、dockerhubを破棄します...操作プロセスを記録します。

1. 名前空間 hhu を作成し (現在の学校に基づき、小文字のみ使用可能、各アカウントは 5 つしか作成できません)、新人 Docker イメージ ウェアハウス docker1 を作成します (github のウェアハウスにバインドし、個人が自由に使用できます。このウェアハウス イメージはアプリのようなもので、継続的にバージョンを更新できます)。その後、すべてのテスト イメージをここにプッシュし、他のイメージ ウェアハウスを将来的に他の特別なイメージに適用できます (たとえば、Tomcat を作成する場合は、別のイメージ ウェアハウス tomcat を適用し、redis を作成する場合は、redis ウェアハウスを適用します)。仕上げる;

2. 鏡像生成。このステップについては、以下に詳しく別途記録します。

3. イメージのプッシュ: 本番環境が完了したら、イメージをイメージテスト ウェアハウスの docker1 にプッシュする必要があります。基本情報は以下の通りです。

1. パブリックネットワークアドレス: registry.cn-shanghai.aliyuncs.com/hhu/docker1

2. イントラネット アドレス (ECS の場合はオプション): registry-internal.cn-shanghai.aliyuncs.com/hhu/docker1

3. コードリポジトリ(GitHub 上のバインドされたリポジトリ): https://github.com/Jacksonary/Docker

最初の Docker イメージの名前は jacksonary/myfirstapp です。ネットワークの状態に基づいて、パブリック ネットワークにプッシュすることを選択します。主なプロセスは次のとおりです。

# 1. アクセラレータからウェアハウスのアドレスに切り替えてログインします。docker login [email protected] registry.cn-shanghai.aliyuncs.com

# 2. 名前または ID に基づいてイメージのタグを作成します。デフォルトは、最新の docker タグ jacksonary/myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1[:イメージのバージョン番号] です。

# 3. イメージをプッシュします docker push registry.cn-shanghai.aliyuncs.com/hhu/docker1[:イメージのバージョン番号]

次のようにして、プッシュされたイメージを Alibaba Cloud ウェアハウスで表示できます。

上記のイメージファイルを取得する際には、イメージのバージョン番号を指定する必要があるため、イメージをプッシュする際には区別するために必要なイメージのバージョン番号を追加することをお勧めします。上記のイメージをプルする必要がある場合は、次のようにします。

# デフォルトのバージョンは最新なので、取得時に空白のままにするか、以下を追加できます: latest (推奨) docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

1. Dockerイメージの作成

通常、1 つのプロジェクトは 1 つのフォルダーに配置されます。たとえば、公式サイトには flask-app というプロジェクトがあるため、すべてのファイルはプロジェクト ディレクトリ内にあります。プロジェクトのルート ディレクトリに「Dockerfile」というテキスト ファイルを追加し、その txt サフィックスを削除してから、一般的なテキスト エディターを使用して、次の Dockerfile のように Docker 環境を記述する必要があります。

# 1. ベースイメージを Linux として指定します (alipine Docker イメージはわずか 5M の軽量 Linux システムです)
アルパインから:3.5

# alipine の下に python と pip をインストールします。このアプリは Python で書かれているので、通常はファイルをコピーして依存関係をインストールすることで Python 環境をインストールする必要があります。 RUN apk add --update py2-pip

# 必要な Python をインストールします COPY アプリに必要な requirements.txt /usr/src/app/
pip install --no-cache-dir -r /usr/src/app/requirements.txt を実行します。

# アプリケーションに必要なファイルをイメージにコピーします COPY app.py /usr/src/app/
templates/index.html をコピー /usr/src/app/templates/

# 公開するポート番号を設定します EXPOSE 5000

# アプリケーションが cmd 経由で Python アプリケーションを起動するように設定します CMD ["python", "/usr/src/app/app.py"]

次にDockerイメージを作成し、PowerShellでプロジェクトのルートディレクトリ(Dockerfileがある場所)に入り、実行します。

次のコマンドを実行して、 Dockerfile を作成します。

ここで注意すべき点は、Docker 設定ファイル名として「Dockerfile」を使用する場合は直接記述できますが、他の設定ファイル名を使用する場合は追加で指定する必要があることです。たとえば、Docker 設定ファイルとして「jdk-9-alpine.Dockerfile」を参照する場合は、-f を使用して設定ファイルを指定して、次のように記述する必要があります。

次のコマンドを実行して、Docker ファイルをビルドします。

-t コマンドは、現在作成されているイメージに「jacksonary/myfirstapp」というラベルを付けます。/ の前半は Docker ユーザー ID である必要があります (Dockerhub リポジトリを使用している場合、Dockerhub はデフォルトでユーザー名を使用します。Alibaba Cloud を使用している場合は、任意の名前を選択できます)。/ の後半はアプリケーションの名前です。これらは一緒にイメージのタグとして使用されます。その後ろの URL パスは失われません。ドットは現在のパスを示します。実行後、現在の HV 仮想マシンに自動的に公開されます。docker イメージを使用すると、追加の「jacksonary/myfirstapp」イメージがあることがわかります。これでプロセスは完了です。

[概要] Dockerfile ファイルの構成に関しては、次の点に注意する必要があります。

1. Dockerfile ファイルは FROM で始まり、その後に現在のイメージの親コンテナを示すベース コンテナとバージョンが続きます。親コンテナは通常、「ユーザー名/イメージ名: バージョン番号」の形式で存在します (これは Dockerhub でも同じです)

2. RUN 命令は、現在の Docker イメージを作成するために使用されます。この命令が呼び出されるたびに、Docker は新しいイメージ レイヤーを作成し、以前のイメージ バージョンにロールバックしやすくなります。その構文は、RUN の後にシェル命令 (RUN mkdir /user/local/foo など) を続けることで、/bin/sh シェルを自動的に実行します。もちろん、次のように指定することもできます。RUN /bin/bash -c 'mkdir /user/local/foo'

3. COPY命令はローカルファイルをコンテナにコピーできる

4. CMD命令で定義されたコマンドは、イメージの起動時に実行されます。RUN命令とは異なり、新しいイメージレイヤーを作成せず、単に命令を実行します。各イメージのDockerfileファイルには、実行するCMD命令が1つだけある場合もあれば、複数の命令がある場合もあります(この場合、CMDをスクリプトとして実行するのが最適です)。CDMが命令を実行するときは、これらの命令を実行する場所を指定する必要がありますが、RUNでは、次のCMD命令のように、指定する必要はありません。

コマンド ["python", "./app.py"]

CMD ["/bin/bash", "echo", "Hello World"]

5. EXPOSE 命令は、イメージ プログラムがサービスを提供するポートを指定するために使用されます。この情報は、docker examine <container-id> 命令で取得できますが、EXPOSE 命令は実際にポートをホストに公開するわけではありません。代わりに、docker run で公開するときに -p フラグで公開する必要があります。上記の小文字の p は、ホストと仮想ポートとホスト ポート間のマッピングを指定する必要があり、大文字の P は、イメージ内のポートをホスト上のランダム ポートに公開します。公開される特定のポートは、docker ps で確認できます。例:

上の図からわかるように、ミラーリングされたポート 8080 はホストのポート 32768 に公開されており、localhost:32768 を通じて確認できます。

6. PUSHコマンドはDocker Cloudなどのプラットフォームにイメージを公開できる

7. ENV 命令は、次のような環境変数を設定するために使用されます。

# Linux の標準 JAVA 環境変数である Java 環境変数を設定します。ENV JAVA_HOME=/opt/jdk-9
環境変数PATH=$PATH:$JAVA_HOME/bin

2. イメージを展開して実行する

イメージを作成したら、それを実行できます。チュートリアルに従って作成したイメージは次のとおりです: docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1。これをプルダウンして Docker で実行できます:

docker pull レジストリ.cn-shanghai.aliyuncs.com/hhu/docker1

docker run -p 8888:5000 --name myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1

-p ディレクティブ (これは非常に重要です) は、仮想マシンの公開ポート 5000 をローカル ポート 8888 にマッピングし、イメージに myfirstapp という名前を付けることを意味します。http://localhost:8888 にアクセスすると、cats の git マップを表示できます。更新するたびに、異なる cat マップがランダムに取得されます。

3. イメージプッシュ

Docker イメージ ファイルの完全なアドレスは記事の冒頭にあります: https://github.com/Jacksonary/Docker/tree/master/flask-app

4. シンプルなJAVAアプリケーションの展開

これはMavenを使用してパッケージ化されたシンプルなJavaプロジェクトです。作業ディレクトリに移動して実行してみましょう。

mvn アーキタイプ:generate -DgroupId=edu.hhu.java -DartifactId=helloworld -DinteractiveMode=false

簡単な Maven Java プロジェクトを作成します。ほとんどの人はこれを正常に実行できると思いますが、少数の人はこのコマンドを実行してもプロジェクトを作成できません (私もその 1 人です)。

このディレクトリにはPOMがありません

私は困惑した表情で彼に空の POM を渡しましたが、POM にはデータがないというメッセージが表示されました。では、別の方法でやってみましょう。プロジェクトを作成したいと彼に伝えましょう。

mvn アーキタイプ:生成

次に、組み込みのスケルトンが必要かどうかを尋ねられるので、7: maven-archetype-quickstart を選択し、プロンプトに従って groupID と artifactId 情報を入力します。最後に、パッケージ化するかどうかを尋ねられるので、パッケージ化だけを行います (すると、jar パッケージがターゲット ディレクトリに表示されます)。これでこの手順は完了です。このプロジェクトが使用できるかどうかを確認します。

java -cp ターゲット/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

その中で、-cp は、このクラス ファイルを実行するために必要なすべてのクラスのパッケージ パス、つまりシステム クラス ローダーのパスを指定します。デフォルトのスケルトンは、"Hello World" で挨拶します。これで、Java プロジェクトが作成されました。

2 番目のステップは、Docker 構成ファイル Dockerfile を記述することです。

openjdk:latest から

コピー target/helloworld-1.0-SNAPSHOT.jar /usr/src/helloworld-1.0-SNAPSHOT.jar

コマンド java -cp /usr/src/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

3番目のステップはミラーを作成して実行することです

helloworld を実行します。

docker で jacksonary/helloworld を実行します。

4. Docker での複雑なマルチコンテナ アプリケーション (Docker-compose)

実際の開発では、Ubuntuで文章を印刷するだけでなく、WEBでデータベースとやりとりするなど、複数のサービスが必要になることがよくあります。このようなアプリケーションは通常、複数のコンテナで構成されています。これらのコンテナを起動するためにシェルを使用する必要はありません。すべてのコンテナは、プロジェクトのルートディレクトリに記述されたDockerfileに似た「サービスグル​​ープ」として構成ファイルで定義され、使用できます。

docker-compose を起動 -d

docker-compose スクリプトを使用すると、アプリケーションおよびアプリケーション内のすべてのサービスを開始、停止、再起動できます。docker-compose の完全なコマンドは次のとおりです。

命令コンテンツ

建てる

サービスを構築または再構築する

ヘルプ

コマンドのヘルプを取得する

殺す

コンテナを強制終了する

ログ

コンテナからの出力を表示する

ポート

ポートバインディングのパブリックポートを印刷する

追伸

コンテナの一覧

引く

サービスイメージをプルする

再起動

サービスを再起動する

rm

停止したコンテナを削除する

走る

1回限りのコマンドを実行する

規模

サービスのコンテナ数を設定する

始める

サービスを開始する

停止

サービスを停止する

コンテナを作成して起動する

一緒に定義されたこれらの Docker コンポーネント サービスのエントリ ポイントは、docker-compse 構成ファイルです。このファイルは、通常、次の docker-compse.yml のような yml ファイルの形式で存在します (ポート マッピングを除く各プロパティを構成するときは、コロンの後にスペースを追加する必要があることに注意してください)。

バージョン: '3.3'
サービス:
 デシベル:
 コンテナ名: db
 イメージ:mysql:8
 環境:
  MYSQL_DATABASE: 従業員
  MYSQL_USER: mysql
  MYSQL_パスワード: mysql
  MYSQL_ROOT_PASSWORD: スーパーシークレット
 ポート:
  - 3307:3306
 ウェブ:
 イメージ: arungupta/docker-javaee:dockerconeu17
 ポート:
  -8081:8080
  -9991:9990
 依存:
  -db

上記の結合ファイルでは、次のようになります。

1. 2つのサービスを定義する: dbとweb

2. image属性は各サービスワードの画像ファイルを指定する。

3. mysql:8イメージはMySqlサービスを開始します。

4. 環境属性は、初期化用の MySQL サービス環境変数を定義します。MYSQL_DATABASE は、イメージの起動時に指定された名前でデータベースを作成するために使用されます。MYSQL_USER と MYSQL_PASSWORD を組み合わせて、新しいユーザーを作成し、パスワードを設定します。このユーザーには、MYSQL_DATABASE によって作成されたデータベースに対するスーパー権限が付与されます。MYSQL_ROOT_PASSWORD は、MySQL スーパーユーザー パスワードを設定するために必須です。

5. ポートはポート転送を実装します。前のポートはホスト、後ろのポートは仮想マシンです。

6.depends_on 属性は、2 つのサービス間の依存関係を示します。この場合、WildFly (アプリケーション サーバー) は MySQL に依存しているため、MySQL は WildFly の前に起動されます。

上記の結合された構成ファイルを作成した後、PW はファイルがあるディレクトリに入り、docker-compose up -d を使用して 2 つのサービスを分離モードで起動します。docker ps はポート間のマッピングを表示でき、2 つのコンテナーが起動されていることも確認できます。docker-compose logs はサービス ログを表示できます。この時点で、http://localhost:8081/resources/employees を通じてすべての人事情報にアクセスし、このグループのサービスを停止できます。

docker-compose ダウン

Alibaba Cloud を使用した Docker イメージの作成、アップロード、プル、デプロイに関する上記の記事が、私が皆さんと共有したいことのすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker イメージのプルとタグ操作 pull | tag
  • Python スクリプトが Docker イメージをプルする問題
  • Dockerでイメージをプルするための手順を完了する
  • Dockerイメージをプルしてバージョンを確認する方法
  • Docker 国内イメージ取得とイメージ高速化のレジストリミラー設定変更の詳しい説明
  • Docker が MySQL イメージをプルするのが遅すぎる問題を解決する

<<:  HTML ページの部分更新の実装コード

>>:  Vue フロントエンド開発補助機能状態管理詳細例

推薦する

HTMLポップアップdivはモバイルの中央揃えを実現するのに非常に便利です

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

MySQL 8.0.20 のインストールと設定方法のグラフィックチュートリアル

MySQLのダウンロードとインストール(バージョン8.0.20)のチュートリアルは参考までに、具体的...

Linux環境でのActiveMQ導入方法の詳しい説明

この記事では、Linux 環境での ActiveMQ の展開方法について説明します。ご参考までに、詳...

MySQL の大きなテーブルで大量のデータを一括削除する方法

質問はhttps://www.zhihu.com/question/440066129/answer...

Docker-Composeコマンドの使い方の詳しい説明

Docker コンテナはさまざまな方法で管理およびデプロイできます。 Docker コマンドを直接使...

MySQL はデータベースを動的に更新します スクリプト例の説明

具体的なupgradeスクリプトは次のとおりです。インデックスを動的に削除する アップグレードが存在...

JSONP クロスドメインシミュレーション Baidu 検索

目次1. JSONPとは何か2. JSONPクロスドメインリクエスト3. Baidu検索をシミュレー...

Vue3 手動カプセル化ポップアップ ボックス コンポーネント メッセージ メソッド

この記事では、ポップアップボックスコンポーネントメッセージのVue3手動カプセル化の具体的なコードを...

ウェブデザインの詳細分析に関する詳細な議論

設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...

JavaScript 高度なカスタム例外

目次1. コンセプト1.1 エラーと例外とは何ですか? 1.2 異常の分類2. 例外処理2.1try...

Tomcat のパフォーマンス最適化方法の簡単な概要

Tomcat自体の最適化Tomcat メモリ最適化起動時に大きなメモリ ブロックが必要であることを ...

CSS を使用してサブ要素に応じて異なるスタイルを記述する方法

達成すべき効果: 必要なもの1枚、2枚、3枚とスタイルが異なります。子要素の判定はjsで完結できます...

ウェブデザイナー職の面接でよくある質問と回答

1. ASP.NET Web アプリケーションのテンプレートとは何ですか? それらの違いは何ですか?...

JS 継承の詳細

目次序文準備する要約する継承方法プロトタイプ継承プロトタイプチェーン継承コンストラクタの借用(クラス...

Vueはシンプルな計算機を実装する

この記事では、参考までに、Vue の具体的なコードで簡単な計算機を実装する方法を紹介します。具体的な...