開発者ドキュメント

Dockerの説明:PythonWebアプリケーションをコンテナ化する方法

ステータス:非推奨

この記事は廃止され、メンテナンスされなくなりました。

理由

この記事の手法は時代遅れであり、Dockerのベストプラクティスを反映していない可能性があります。

代わりに参照してください

序章


Webアプリケーションが乗っ取られ、ホスト全体を乗っ取るために使用されるという脅威は、広大で恐ろしいものです。 特にアプリケーションが異なるクライアントに属している場合、セキュリティを強化するために物事を互いに分離しておくことは長い間課題でした。 この不幸なシナリオを防ぐために多くの対策を講じることができますが、通常、ほとんどの開発者または管理者のユースケースでは、コストがかかりすぎるか(時間とリソースの両方で)複雑すぎます。

このDigitalOceanの記事では、Python Webアプリケーションを「コンテナ化」して、非常に安全なサンドボックスに入れ、独自の環境内に完全に保持する方法について説明します(明示的に別のアプリケーションに「リンク」しない限り)。 これを実現するために、PythonWebアプリケーションをホストするdocker コンテナーを段階的に作成し、最後にDockerfileを使用してビルドプロセスをブートストラップして完全に自動化する方法について説明します。

用語集


1. Dockerの概要


2. UbuntuへのDockerのインストール


3. 基本的なDockerコマンド


  1. Dockerデーモンの実行とCLIの使用法
  2. dockerコマンド

4. サンドボックスPythonWSGIアプリへのDockerコンテナの構築


  1. UbuntuからベースDockerコンテナを作成する
  2. インストール用のベースコンテナの準備
  3. デプロイ用の一般的なPythonツールのインストール
  4. Webアプリケーションとその依存関係のインストール
  5. PythonWSGIアプリケーションの構成

5. イメージを自動的にビルドするDockerfileの作成


  1. Dockerfileの基本
  2. Dockerfileコマンドの概要
  3. Dockerfileの作成
  4. 基礎の定義
  5. インストール用のデフォルトのアプリケーションリポジトリの更新
  6. 基本ツールのインストール
  7. Pythonおよび基本的なPythonツールの基本的なインストール手順
  8. アプリケーションの展開
  9. すべてをブートストラップする
  10. 最終的なDockerfile
  11. Dockerfileを使用してコンテナを自動的に構築する

Dockerの概要


dockerプロジェクトは、いくつかのLinuxカーネル機能の上に構築された、連携して動作する高レベルのツールを提供します。 目標は、開発者とシステム管理者がアプリケーションを移植し(すべての依存関係を組み合わせて)、システムとマシン間で実行できるようにすることです。頭痛の種はありません

Dockerは、安全なLXC(つまり、 Linux Containers) dockercontainerと呼ばれるアプリケーション用のベースの環境。 これらのコンテナーは、Dockerイメージを使用して作成されます。これは、コマンドを手動で実行するか、Dockerfilesを介して自動的に実行することで構築できます。

注: Dockerとそのパーツの詳細(例: dockerデーモン、CLI、イメージなど)、プロジェクトの紹介記事をチェックしてください: docker Explained:GettingStarted

UbuntuへのDockerのインストール(最新)


最新のリリース( 0.7.1。は12月5日付け)で、dockerはUbuntu/DebianやCentOS/RHELを含むさまざまなLinuxオペレーティングシステムにデプロイできます。

Ubuntu 13.04で構築されたDigitalOceanのすぐに使用できるDockerイメージを使用すると、すぐに開始できることを忘れないでください。

Ubuntu(最新)のインストールプロセスを簡単に説明します。

Ubuntuのインストール手順


ドロップレットを更新します。

sudo aptitude    update
sudo aptitude -y upgrade

aufsサポートが利用可能であることを確認してください:

sudo aptitude install linux-image-extra-`uname -r`

パッケージ検証のためにDockerリポジトリキーをapt-keyに追加します。

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

Dockerリポジトリをaptitudeソースに追加します。

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

新しい追加でリポジトリを更新します。

sudo aptitude    update

最後に、dockerをダウンロードしてインストールします。

sudo aptitude install lxc-docker

Ubuntuのデフォルトファイアウォール( UFW :Uncomplicated Firewall)は、Dockerが必要とするすべての転送トラフィックをデフォルトで拒否します。

UFWで転送を有効にする:

nanoテキストエディタを使用してUFW設定を編集します。

sudo nano /etc/default/ufw

下にスクロールして、で始まる行を見つけます DEFAULT_FORWARD_POLICY.

交換:

DEFAULT_FORWARD_POLICY="DROP"

と:

DEFAULT_FORWARD_POLICY="ACCEPT"

CTRL + X を押し、 Y で承認して、保存して閉じます。

最後に、UFWをリロードします。

sudo ufw reload

基本的なDockerコマンド


dockerの使用を開始する前に、最初の Getting Started の記事から、使用可能なコマンドをすばやく調べてメモリを更新しましょう。

Dockerデーモンの実行とCLIの使用法


インストール時に、dockerデーモンはバックグラウンドで実行され、dockerCLIによって送信されたコマンドを受け入れる準備ができている必要があります。 dockerを手動で実行する必要がある特定の状況では、以下を使用します。

Dockerデーモンの実行:

sudo docker -d &

docker CLIの使用法:

sudo docker [option] [command] [arguments]

注: dockerを機能させるには、sudo権限が必要です。

Dockerコマンド


現在利用可能な(バージョン 0.7.1 )dockerコマンドの概要は次のとおりです。

添付


実行中のコンテナに接続する

建てる


Dockerfileからコンテナを構築する

専念


コンテナの変更から新しいイメージを作成します

cp


コンテナファイルシステムからホストパスにファイル/フォルダをコピーします

差分


コンテナのファイルシステムの変更を検査します

イベント


サーバーからリアルタイムのイベントを取得する

書き出す


コンテナのコンテンツをtarアーカイブとしてストリーミングする

歴史


画像の履歴を表示する

画像


画像を一覧表示

輸入


tarballのコンテンツから新しいファイルシステムイメージを作成します

情報


システム全体の情報を表示する

入れる


画像にファイルを挿入する

検査する


コンテナに関する低レベルの情報を返す

殺す


実行中のコンテナを殺す

ロード


tarアーカイブから画像をロードする

ログインする


Dockerレジストリサーバーに登録またはログインします

ログ


コンテナのログを取得します

ポート


PRIVATE_PORTにNAT変換された公開ポートを検索します

ps


コンテナの一覧表示

引く


Dockerレジストリサーバーからイメージまたはリポジトリをプルします

押す


イメージまたはリポジトリをDockerレジストリサーバーにプッシュします

再起動


実行中のコンテナを再起動します

rm


1つ以上のコンテナを削除します

rmi


1つ以上の画像を削除する

走る


新しいコンテナでコマンドを実行する

保存する


画像をtarアーカイブに保存します


Dockerインデックスで画像を検索する

始める


停止したコンテナを起動します

止まる


実行中のコンテナを停止します

鬼ごっこ


画像をリポジトリにタグ付けする


コンテナの実行中のプロセスを検索します

バージョン


Dockerのバージョン情報を表示する

サンドボックスPythonWSGIアプリへのDockerコンテナの構築


DockerをVPSにインストールし、そのコマンドをすばやく確認したら、PythonWSGIアプリケーションを実行するDockerコンテナーを作成する実際の作業を開始する準備が整いました。

注:次のセクションでは、ドッキングされた(コンテナ化された)PythonWSGIWebアプリケーションを使用できます。 ただし、その複雑さと実行不可能性のため、これは絶対に推奨される方法ではありません。 ここでは、ライブコンテナの操作方法を学び、プロセスを自動化するために次のセクションで定義する必要のあるコマンドに慣れるための機会を提供します。

さぁ、始めよう!


UbuntuからベースDockerコンテナを作成する


dockerのRUNコマンドを使用して、Ubuntuイメージに基づいて新しいコンテナーを作成することから始めます。 -t フラグを使用して端末を接続し、実行中のプロセスとしてbashを使用します。

ポート80を公開して、アプリケーションに外部からアクセスできるようにします。 将来的には、複数のインスタンスの負荷を分散し、コンテナを相互に「リンク」して、たとえば、リバースプロキシ実行コンテナを使用してそれらにアクセスしたい場合があります。

sudo docker run -i -t -p 80:80 ubuntu /bin/bash

注:このコマンドを実行した後、dockerは新しいコンテナーを作成する前にUbuntuイメージをプルする必要がある場合があります。

覚えておいてください:作成したコンテナに接続されます。 自分自身を切り離してメインターミナルのアクセスポイントに戻るには、エスケープシーケンスを実行します:CTRL+Pに続いてCTRL+Q。 Dockerコンテナに接続することは、別の内部から新しいドロップレットに接続するようなものです。

このコンテナに戻るには:

  1. 「sudodockerps」を使用して、実行中のすべてのコンテナーを一覧表示します

  2. そのIDを見つける

  3. 「sudodockerattach[id]」を使用して、端末に接続し直します

重要:私たちはコンテナ内にあるため、以下のすべてのコマンドは、それが存在するホストに影響を与えることなく、そこで実行されることを忘れないでください。

インストール用のベースコンテナの準備


Python WSGI Webアプリケーションをコンテナー内(およびプロセスに必要なツール)にデプロイするには、関連するアプリケーションリポジトリがダウンロードに使用できる必要があります。 残念ながら(そして意図的に物事を単純にするために)、これはdockerに付属するデフォルトのUbuntuイメージの場合ではではありません

Ubuntuのユニバースリポジトリをベースイメージのアプリケーションソースリストのデフォルトリストに追加しましょう。

echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list

新しく追加されたソースでリストを更新します。

apt-get update

Python WSGIアプリケーションのセットアップに進む前に、nano、tar、curlなどのツールが必要です。 –念のため

コンテナ内の便利なツールをダウンロードしてみましょう

apt-get install -y tar \
                   git \
                   curl \
                   nano \
                   wget \
                   dialog \
                   net-tools
                   build-essential

デプロイ用の一般的なPythonツールのインストール


チュートリアル(例として)では、非常に基本的なFlaskアプリケーションを作成します。 この記事を読んだ後は、仮想サーバーにデプロイするのと同じ方法で、代わりにお気に入りのフレームワークを使用してデプロイできます。

覚えておいてください:以下のすべてのコマンドと手順は、コンテナ内で実行されます。これは、まるでそれ自体がまったく新しい液滴であるかのように機能します。

PythonとpipPythonパッケージマネージャーをインストールすることから展開プロセスを始めましょう。

# Install pip's dependency: setuptools:
apt-get install -y python python-dev python-distribute python-pip

Webアプリケーションとその依存関係のインストール


サンプルアプリケーションの作成を開始する前に、すべてを確認することをお勧めします。 すべての依存関係-そこにあります。 何よりもまず、アプリケーションの依存関係としてWebアプリケーションフレームワーク(WAF)を使用する可能性があります(つまり、 フラスコ)。

pipがインストールされて動作する準備ができたら、それを使用してすべての依存関係をプルし、コンテナー内にセットアップすることができます。

# Download and install Flask framework:
pip install flask

pipをインストールした後、すべてを含む「my_application」フォルダー内に基本的なサンプルのFlaskアプリケーションを作成しましょう。

# Make a my_application folder
mkdir my_application

# Enter the folder
cd my_application 

注:この単純なサンプルの例の代わりにアプリケーションをデプロイすることに興味がある場合は、以下の「クイックヒント」の中央セクションを参照してください。

1ページのフラスコ「HelloWorld!」を作成しましょう。 nanoを使用したアプリケーション。

# Create a sample (app.py) with nano:
nano app.py

そして、今述べたこの小さなアプリケーションの以下の内容をコピーして貼り付けます。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

CTRL + Xを押し、Yで承認して保存して閉じます。

または、「requirements.txt」を使用して、Flaskなどのアプリケーションの依存関係を含めることもできます。

nanoテキストエディタを使用してrequirements.txtを作成するには:

nano requirements.txt

そして、すべての依存関係とともに、内部に次のように入力します。

flask
cherrypy

CTRL + Xを押し、Yで承認して保存して閉じます。

注: pip を使用して、実際のアプリケーションの依存関係のリストを作成できます。 方法については、チュートリアル一般的なPythonツール:virtualenvの使用、Pipを使用したインストール、およびパッケージの管理を確認してください。

最終的なアプリケーションフォルダ構造:

/my_application
    |
    |- requirements.txt  # File containing list of dependencies
    |- /app              # Application module (which should have your app)
    |- app.py            # WSGI file containing the "app" callable
    |- server.py         # Optional: To run the app servers (CherryPy)

注:server.py」-PythonWSGIアプリケーションの構成については次のセクションを参照してください。

覚えておいてください:このアプリケーションフォルダはコンテナ内に作成されます。 イメージを自動的に構築する場合(Dockerfilesの次のセクションを参照)、Dockerfileと一緒にこの構造がホスト上にあることを確認する必要があります。

__*実際の展開に関するクイックヒント*__

アプリケーションリポジトリとその要件をコンテナ内に取得する方法


上記の例では、コンテナ内にアプリケーションディレクトリを作成しました。 ただし、アプリケーションをデプロイするためにそれを行うことはありません。 リポジトリからソースをプルする可能性がかなり高くなります。

コンテナ内にリポジトリをコピーする方法はいくつかあります。

以下にその2つを説明します。

# Example [1]
# Download the application using git:
# Usage: git clone [application repository URL]
# Example:
git clone https://github.com/mitsuhiko/flask/tree/master/examples/flaskr

# Example [2]
# Download the application tarball:
# Usage: wget [application repository tarball URL]
# Example: (make sure to use an actual, working URL)
wget http://www.github.com/example_usr/application/tarball/v.v.x

# Expand the tarball and extract its contents:
# Usage: tar vxzf [tarball filename .tar (.gz)]
# Example: (make sure to use an actual, working URL)
tar vxzf application.tar.gz

# Download and install your application dependencies with pip.
# Download the requirements.txt (pip freeze output) and use pip to install them all:
# Usage: curl [URL for requirements.txt] | pip install -r -
# Example: (make sure to use an actual, working URL)
curl http://www.github.com/example_usr/application/requirements.txt | pip install -r -

PythonWSGIアプリケーションの構成


このアプリケーションを提供するには、Webサーバーが必要です。 WSGIアプリを強化するWebサーバーは、アプリケーションの他のリソースと同じコンテナーにインストールする必要があります。 実際、dockerが実行するのはプロセスです。

注:この例では、CherryPyの組み込みの本番環境対応HTTP Webサーバーを使用します。これは、その単純さのためです。 このテーマに関するチュートリアルに従うことで、Gunicorn、CherryPy、さらにはuWSGIを使用できます(Nginxの背後にセットアップできます)。

CherryPyをpipでダウンロードしてインストールします。

pip install cherrypy

server.py」を作成して、「app.py」からWebアプリケーションを提供します。

nano server.py

サーバーのコンテンツをコピーして貼り付け、アプリケーションをインポートして提供を開始します。

# Import your application as:
# from app import application
# Example:

from app import app

# Import CherryPy
import cherrypy

if __name__ == '__main__':

    # Mount the application
    cherrypy.tree.graft(app, "/")
        
    # Unsubscribe the default server
    cherrypy.server.unsubscribe()

    # Instantiate a new server object
    server = cherrypy._cpserver.Server()
    
    # Configure the server object
    server.socket_host = "0.0.0.0"
    server.socket_port = 80
    server.thread_pool = 30
    
    # For SSL Support
    # server.ssl_module            = 'pyopenssl'
    # server.ssl_certificate       = 'ssl/certificate.crt'
    # server.ssl_private_key       = 'ssl/private.key'
    # server.ssl_certificate_chain = 'ssl/bundle.crt'
    
    # Subscribe this server
    server.subscribe()
    
    # Start the server engine (Option 1 *and* 2)
    
    cherrypy.engine.start()
    cherrypy.engine.block()

以上です! これで、「ドッキングされた」Python Webアプリケーションをサンドボックスに安全に保管し、次のコマンドを実行するだけで、何千ものクライアント要求に対応できるようになります。

python server.py

これにより、サーバーがフォアグラウンドで実行されます。 停止したい場合は、CTRL+Cを押してください。

サーバーをバックグラウンドで実行するには、次を実行します。

python server.py &

アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。

注:CherryPyでデプロイするためのPythonWSGIアプリケーションの構成の詳細については、チュートリアルを確認してください:CherryPyWebサーバーを使用してPythonWSGIアプリをデプロイする方法

すべてがスムーズに実行されていることをテストするには、すべてのポート割り当てがすでに処理されていることを確認する必要があります。ブラウザで http://[ドロップレットのIP]にアクセスして、「[X206X ] Hello World!」メッセージ。

イメージを自動的にビルドするDockerfileの作成


前のステップで述べたように、スケーラブルな本番デプロイメントでこの方法でコンテナーを作成することは、確かに推奨される方法ではありません。 正しい方法は、Dockerfilesを使用して構造化された方法でビルドプロセスを自動化することと見なすことができます。

コンテナー内にダウンロードしてインストールするために必要なコマンドを実行した後、同じ知識を使用して、dockerがイメージの構築に使用できるDockerfileを作成し、PythonWSGIアプリケーションコンテナーを簡単に実行できます。

Dockerfileの作業を開始する前に、基本を簡単に説明しましょう。

Dockerfileの基本


Dockerfileは、連続して宣言されたコマンドを含むスクリプトであり、dockerによってこの順序で実行され、新しいdockerイメージが自動的に作成されます。 それらは展開に大いに役立ちます。

これらのファイルは常に、FROMコマンドを使用してベースイメージを定義することから始まります。 そこから、ビルドプロセスが開始され、実行される後続の各アクションが、ホストでコミットされる最終イメージを形成します。

使用法:

# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *nginx*)
# Example: sudo docker build -t [name] .
sudo docker build -t nginx_img . 

注: Dockerfileの詳細については、次の記事をご覧ください: Dockerの説明:Dockerfileを使用したイメージの構築の自動化

Dockerfileコマンドの概要


追加


ホストからコンテナにファイルをコピーします

CMD


実行する、またはENTRYPOINTに渡すデフォルトのコマンドを設定します

エントリーポイント


コンテナ内にデフォルトのエントリポイントアプリケーションを設定します

ENV


環境変数を設定します(例: 「キー=値」)

公開


ポートを外部に公開する

から


使用するベースイメージを設定します

メンテナ


Dockerfileの作成者/所有者データを設定します

走る


コマンドを実行し、終了結果(コンテナー)イメージをコミットします

ユーザー


イメージからコンテナを実行するようにユーザーを設定します

音量


ホストからコンテナにディレクトリをマウントします

WORKDIR


CMDのディレクティブを実行するディレクトリを設定します

Dockerfileの作成


nanoテキストエディタを使用して現在の場所にDockerfileを作成するには、次のコマンドを実行します。

sudo nano Dockerfile

注:次のすべての行を次々に追加してDockerfileを作成します。

基礎の定義


FROMイメージ(つまり、FROMイメージ)などの基本(基本)を定義することから、Dockerfileを始めましょう。 Ubuntu)とMAINTAINER。

以下を追加します。

############################################################
# Dockerfile to build Python WSGI Application Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

インストール用のデフォルトのアプリケーションリポジトリの更新


以下を実行して、 apt-get 前のセクションで行ったように、追加のアプリケーションを含むリポジトリ。

以下を追加します。

# Add the application resources URL
RUN echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list

# Update the sources list
RUN apt-get update

基本ツールのインストール


デフォルトのアプリケーションリポジトリソースリストを更新した後、必要な基本的なアプリケーションを取得することで、展開プロセスを開始できます。

以下を追加します。

# Install basic applications
RUN apt-get install -y tar git curl nano wget dialog net-tools build-essential

注:上記のツールの一部が必要になる可能性はほとんどありませんが、それでも念のためで入手できます。

Pythonおよび基本的なPythonツールの基本的なインストール手順


Python WSGIアプリケーションをデプロイするには、以前に使用したツールのいくつかが必要になる可能性が非常に高くなります(例: pip )。 フレームワークのセットアップに進む前に、今すぐインストールしましょう(つまり WAF)と選択したWebアプリケーションサーバー(WAS)。

以下を追加します。

# Install Python and Basic Python Tools
RUN apt-get install -y python python-dev python-distribute python-pip

アプリケーションの展開


Python WebアプリケーションをデプロイするためにDockerイメージを構築していることを考えると、DockerのADDコマンドを利用して、アプリケーションリポジトリをコピーできます。できれば、REQUIREMENTSファイルを使用して1つのステップですばやく実行できます。

注:すべてを1つのファイルにパッケージ化し、繰り返さないようにするには、以下のような構造のアプリケーションフォルダーを使用することをお勧めします。

アプリケーションフォルダ構造の例:

/my_application
    |
    |- requirements.txt  # File containing list of dependencies
    |- /app              # Application module
    |- app.py            # WSGI file containing the "app" callable
    |- server.py         # Optional: To run the app servers (CherryPy)

注:この構造の作成については、ロールバックして、Webアプリケーションとその依存関係のインストールのセクションを参照してください。

以下を追加します。

# Copy the application folder inside the container
ADD /my_application /my_application

注:オンラインホストのgitリポジトリからデプロイする場合は、次のコマンドを使用してクローンを作成できます。

RUN git clone [application repository URL]

URLプレースホルダーを実際のプレースホルダーに置き換えることを忘れないでください。

すべてをブートストラップする


アプリケーションをコピーするための手順を追加したら、requirements.txtから依存関係をプルするなどの最終的な構成で終了しましょう。

# Get pip to download and install requirements:
RUN pip install -r /my_application/requirements.txt

# Expose ports
EXPOSE 80

# Set the default directory where CMD will execute
WORKDIR /my_application

# Set the default command to execute
# when creating a new container
# i.e. using CherryPy to serve the application
CMD python server.py

最終的なDockerfile


結局、これはDockerfileがどのように見えるべきかです:

############################################################
# Dockerfile to build Python WSGI Application Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

# Add the application resources URL
RUN echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list

# Update the sources list
RUN apt-get update

# Install basic applications
RUN apt-get install -y tar git curl nano wget dialog net-tools build-essential

# Install Python and Basic Python Tools
RUN apt-get install -y python python-dev python-distribute python-pip

# Copy the application folder inside the container
ADD /my_application /my_application

# Get pip to download and install requirements:
RUN pip install -r /my_application/requirements.txt

# Expose ports
EXPOSE 80

# Set the default directory where CMD will execute
WORKDIR /my_application

# Set the default command to execute    
# when creating a new container
# i.e. using CherryPy to serve the application
CMD python server.py

CTRL + Xを押し、Yで確定して、ファイルを再度保存して終了します。

Dockerfileを使用してコンテナを自動的に構築する


「基本」セクションで最初に説明したように、Dockerfilesの使用法は、 dockerbuildコマンドでそれらを呼び出すことです。

Dockerにアプリケーションフォルダをコピーするように指示しているので(つまり / my_application)現在のディレクトリから、ビルドプロセスを開始する前に、このDockerfileと一緒にあることを確認する必要があります。

このDockerイメージを使用すると、1つのコマンドでPythonWSGIアプリケーションを実行するコンテナーをすばやく作成できます。

使用を開始するには、次のコマンドを使用して新しいコンテナイメージを作成します。

sudo docker build -t my_application_img . 

そして、my_application_imgにタグを付けたその画像を使用して、アプリケーションを実行する新しいコンテナーを次のように実行できます。

sudo docker run -name my_application_instance -p 80:80 -i -t my_application_img

これで、ドロップレットのIPアドレスにアクセスでき、アプリケーションはDockerコンテナーを介して実行されます。

例:

# Usage: Visit http://[my droplet's ip]
http://95.85.10.236/

サンプル応答:

Hello World!

docker(他のOSを含む)をインストールするための完全な手順については、docker.ioにあるdockerインストールドキュメントを確認してください。

投稿者: https ://twitter.com/ostezer ”> OS Tezer
モバイルバージョンを終了