MLOps]MLOps環境の構築-Docker 3


How to Make Docker Image
どのアプリケーションに対しても、Dockerイメージとは、コードだけでなく、アプリケーションとその依存項目をパッケージ化して、どこでもコンテナ形式で実行できるデータを指します.(Build once, Run anywhere)
Dockerは、dockerファイルと呼ばれるdocker画像を作成しやすいテンプレートを提供します.したがって、dockerファイルを使用してdocker画像を簡単に生成することができます.
Docker File Creation
これからは、後でdockerイメージを作成するのに役立つdocker fileを直接作成します.したがって、dockerファイルを直接作成するには、まず仮想マシンにfolderを作成し、次のように空のファイルを生成します.
$ cd $HOME
$ mkdir docker-practice
$ cd docker-practice
$ touch Dockerfile # Docker file을 만들기 위한 빈 file
$ ls
空のフォルダで、コマンドtouchによってdockerファイルが生成されたことを確認できます.viエディタまたは使用中の複数のエディタを使用してdocker fileを記述できるようになりました.
Docker File Command
その前にdocker fileにはいくつかの基本的なコマンドがあります.簡単にいくつか見て、それらを行かせます.勝手に書くことはできないので、docker fileを書くコマンドを理解する必要があります.
1. FROMFROMはdockerファイルが最初に使用した基礎画像の命令である.通常、dockerイメージを作成する場合、最初から最後までdockerを作成するわけではありません.最初の部分では、通常、作成したdockerイメージが使用されます.以下の形式を使用すればよい.
FROM <image>[:<tag>] [AS <name>]
# Examples
FROM ubuntu
FROM ubuntu:18.04
FROM nginx:latest AS ngx
2. COPYCOPYは、ソース位置のファイルまたはディレクトリを宛先パスにコピーするコマンドです.
COPY <src>... <dest>
# Examples
COPY a.txt /some-directory/b.txt
COPY my-directory /some-directory-2
3. RUNRUNは、dockerコンテナで指定したコマンドを実行することを示すコマンド語です.通常、コンテナ内で必要なパッケージのインストールと使用を支援します.
RUN <command>
RUN ["executable-command", "parameter1", "parameter2"]
# Examples
RUN pip install torch
RUN pip install -r requirements.txt
4. CMDCMDは、指定されたコマンドをdockerコンテナの起動と同時に実行するコマンドです.CMDに似た命令語ENTRYPOINTがある.また、重要な内容は、1つのdockerイメージで1つのCMDしか実行できないことです.これらの部分はRUN命令と区別される.
CMD <command>
CMD ["executable-command", "parameter1", "parameter2"]
CMD ["parameter1", "parameter2"] # ENTRYPOINT 와 함께 사용될 때
# Examples
CMD python main.py # Docker container가 실행됨과 동시에 python file 실행
CMD 
5. WORKDIRWORKDIRは、コンテナでこのコマンドを使用すると、作成されたすべてのコマンドがどのディレクトリで実行されるかを示すコマンドです.このとき、ディレクトリが存在しない場合は、ディレクトリが生成されます.
WORKDIR /path/to/workdir
# Examples
WORKDIR /home/test
6. ENVENVは、コンテナ内で引き続き使用される環境変数の値を設定するコマンドです.通常はdefault言語またはタイムゾーンを設定するために使用されます.passwordやport numberなどの重要な情報を設定するためにも使用できます.
ENV <key> <value>
ENV <key>=<value>
# Examples
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
7. EXPOSEEXPOSEは、コンテナ内で貫通するポートおよびプロトコルを指定するコマンドであり、プロトコルを指定しない場合、TCPはdefaultに設定されます.たとえば、8080がportに設定されている場合、次のコンテナはTCPプロトコルで8080ポートを開いて実行されます.
EXPOSE <port>
EXPOSE <port>/<protocol>
# Examples
EXPOSE 8080
これらの情報を利用して、テスト用のdockerファイルを簡単に作成することができます.この場合、前述したようにvi editorを使用したり、便利なエディタを探して使用したりすることができます.
$ vi Dockerfile
で作成されたコマンドを確認し、まずUbuntu:18.04を基本イメージとして使用し、apt-get updateコマンドを実行します.Docker container起動時「Hello!」出力のためです.このときechoは、後の論点に従って実行される命令語である.
Docker Builld(docker file > docker image)
このように記述されたdockerファイルを保存すると、docker buildというコマンドでdocker画像を生成することができる.docker build度のオプションは非常に多いので、必要なコンテンツを探して使用することができます.dockerイメージを正式に作成するには、dockerファイルの場所に次のコマンドを入力します.
$ docker build -t test-image:v1.0.0 .
ここで、最後に使用される.は、現在のパスのdocker fileから構築された意味を表すために使用しなければならないオプションであることに注意してください.次に、前のtest-imageは作成するdocker imageのnameであり、コロンの後ろの数字は作成するdocker imageのtagを表す.
正常なdockerファイルからdocker画像が構築されているか確認するには、以下のコマンドで確認してください.
$ docker images
$ docker images | grep test-image
docker imagesだけで確認できますが、ドッキング画像が本当に多い場合は、grepコマンドで必要なドッキング画像を出力するしかありません.
は、このように構築されたdockerイメージからdockerコンテナの実行を開始する.
$ docker run test-image:v1.0.0
それなら予想通り「ハロー!」この言葉が印刷されていることを確認できます.
に追加されたdockerイメージからdockerコンテナが実行されていることを確認することもできます.
Docker Image Storage
作成したdockerイメージを他の人と共有する場合は、そのイメージをどこかに保存し、リポジトリからdockerイメージをダウンロードして使用できます.これは、コラボレーションや使用に便利です.これにより、dockerイメージを格納できるリポジトリには、docker registryおよびdocker hubが代表的に存在する.
1. Docker Registry
Docker registryの使用方法については、docker registryの公式ドキュメント(https://docs.docker.com/registry/)を参照してください.これは複雑なタスクではなく、単純にdockerレジストリを仮想マシンに配置し、上で構築したdockerイメージをdockerレジストリにプッシュします.Docker registryでは、準備されたdocker容器があるので、それを使用するのは全く難しくありません.まずdocker registryを以下のように表示できます.
$ docker run -d -p 5000:5000 --name registry registry
$ docker ps
これにより、まず「registry」というdocker画像をダウンロードし、バックグラウンドでregistryというdockerコンテナを5000ポートで実行します.生成されたdockerコンテナが稼働していることをdocker psで確認できます.
次に、上に構築したtest-imageというdocker imageを、生成したばかりのregistryを表示するようにマークできます.docker pushでdocker画像をプライベートレジストリセンターまたはパブリックレジストリセンターにアップロードする場合は、tagを設定する必要があります.
$ docker tag <option> <image_name>:<tag_name> <registry_address, user_name>/<image_name>:<tag_name>
$ docker tag test-image:v1.0.0 localhost:5000/test-image:v1.0.0
$ docker images | grep test-image
docker images命令では、grepにより、元のdocker画像と完了フラグのdocker画像の両方が存在することが確認される.次に、このtest-imageを生成したregistryにプッシュします.
$ docker push localhost:5000/test-image:v1.0.0
が正常にプッシュされているかどうかは、以下の方法で確認できます.
$ curl -X GET http://localhost:5000/v2/_catalog
$ curl -X GET http://localhost:5000/v2/test-image/tags/list
localhost:5000のregistryに格納されている画像は、test-imageのimage nameに格納されているタグをコマンドで決定し、pushが成功したかどうかを決定します.
2. Docker Hub
作成して確認したdocker registryはprivate registryで、私のパソコンに接続できる人がdocker画像を押す空間です.今、私のパソコンの接続情報を知らない人でもdocker画像を大衆的に押すことができるpublic registryはdocker hubです.Docker hubはリンク(https://hub.docker.com)で接続でき、接続後に会員登録しplan(free、pro、team/personal、pro、team、business)を設定して電子メール認証を完了すればdocker hubを正常に使用できます.
このプロセスを過ぎると、次のコマンドでterminal上でdocker loginを行うことができます.この手順では、docker registryのdocker hubが表示されます.
$ docker login
それからtagをもう一つ作って、docker hubを見てみましょう.
# docker tag <image_name>:<tag_name> <user_name>/<image_name>:<tag>
$ docker tag test-image:v1.0.0 simjy98/test-image:v1.0.0
最後に、docker画像をdocker hubにプッシュし、docker hubにローカルに作成したdocker画像をアップロードし、他の人と自由に使用することができます.また、docker hubでアカウントしか知らない場合は、そのアカウントにアップロードされたdocker画像を表示することもできます.