ペンギン技術 blog

CTFのWriteupなどを記載していこうと思います

Docker Hub 上のリポジトリにpushしてみる

Dockerイメージを作成し、Docker Hub 上のリポジトリにpush/pullしてみたので、
メモとして残しておきます。

参考
Dockerを使って機械学習の環境を作ろうとした話
https://qiita.com/penpenta/items/3b7a0f1e27bbab56a95f

上記を参考にして、Dockerfile、requirements.txtを準備しておく

Dockerfile

FROM python:3.8.0

RUN apt-get update \
    && apt-get upgrade -y \
    # imageのサイズを小さくするためにキャッシュ削除
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    # pipのアップデート
    && pip install --upgrade pip

# 作業するディレクトリを変更
WORKDIR /home/DeepLearning

COPY requirements.txt ${PWD}

# pythonのパッケージをインストール
RUN pip install -r requirements.txt

# 作業するディレクトリを変更
# コンテナの内部には入った際のディレクトリの位置を変更している
WORKDIR /home/DeepLearning/src

requirements.txt

numpy
pandas
matplotlib
scikit-learn

環境の準備

名前を付けて build

$ docker build --rm -t {イメージ名:タグ} {Dockerfileのパス}

--rm : 構築に成功したら、全ての中間コンテナを削除
-t : '名前:タグ' 形式で名前とオプションのタグを指定

Dockerfile、requirements.txtをおいたディレクトリと同じ場所にcdで移動し、以下を実行

$ sudo docker build --rm -t deeplearning_env:latest .

確認

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
python              3.8.0               0a3a95c81a2b        3 weeks ago         932MB
deeplearning_env    latest              6a4aaef11001        7 minutes ago       1.33GB

Docker Hubにイメージをあげる

参考
自分で作ったDockerイメージを非公開環境にあげてみた
https://qiita.com/Eita11/items/60c65319ed092028a250

イメージをあげる前にタグ名をつける

$ docker tag イメージID ユーザー名/リポジトリ名:タグ名で実施
$ sudo docker tag 4e98e84b5951 username1/c21-repo:1.0

確認

$ sudo docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED         SIZE
username1/c21-repo                                1.0    4e98e84b5951   24 minutes ago   1.87GB
:

Dockerイメージをあげる

Docker Hubにアカウントを作成し、ブラウザからリポジトリを作成しておく

手元のLinux環境でdocker loginコマンドにてログインしておく

$ sudo docker login
Username: username1
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Login Succeeded

「docker push ユーザー名/リポジトリ名:タグ名」でコンテナをDocker Hubにpush

$ sudo docker push username1/c21-repo:1.0
The push refers to repository [docker.io/username1/c21-repo]
cd1cbed40555: Pushed
abf46b7b00f8: Pushed
:

確認(pullしてみる)

docker Hubにあげたものをとってこれるか確認

ローカルにあるイメージを消す

$ sudo docker rmi -f 4e98e84b5951
Untagged: username1/c21-repo:1.0
Untagged: username1/c21-repo@sha256:2aa18aa8ed2670c3c3d28383dfbbcbda1d3c6add4ac8dab1aea1573e1c56a285
Untagged: username1/deeplearning_env:1.0
Deleted: sha256:4e98e84b595110b1065f5358805e0d1e5ef4c6407e7289ff791a99a706ee73d6
Deleted: sha256:49a72326fe0c72d89cea1833c0d5f21430f0dc6e13d243396f59babc697eda7a
:

Docker Hubからpullする

$ sudo docker pull username1/c21-repo:1.0

確認

$ sudo docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED          SIZE
username1/c21-repo                                1.0       4e98e84b5951   35 minutes ago   1.87GB
python                                          3.8.0     0a3a95c81a2b   2 years ago      932MB

起動

$ sudo docker run --rm -it -v /home/user/create_docker_img:/home/DeepLearning username1/c21-repo:1.0 /bin/bash
root@019fef5d7842:/home/DeepLearning/src#

--rm:コンテナから抜けるとコンテナを削除
-i:コマンドなどの入力情報をコンテナまで伝える(ないとコマンドの応答が返れないなどの影響がでる)
-t:コンソールの標準出力とコンテナの標準出力をつなげる
-v:ホストのファイルをコンテナにマウント {ホストのパス}:{コンテナのパス}

ここで打ち込んだコマンドが、コンテナ内で実行される
ホストのファイルをコンテナにマウントしているため、
ソースファイルなどはホスト側を参照すればよい
また、出力結果もホスト側に出力すればよい

# python3 --version
Python 3.8.0

別のターミナルから起動しているコンテナ情報を確認

$ sudo docker ps
CONTAINER ID   IMAGE                  COMMAND       CREATED          STATUS          PORTS     NAMES
019fef5d7842   username1/c21-repo:1.0   "/bin/bash"   25 minutes ago   Up 25 minutes             cranky_saha