今更ながらDockerについて勉強してみた

仮想環境

Docker……

やけに業務で使われているような気がするんですよね。
IT企業の求人とか見てみたら作業ツールにDockerとgithubが多いように見えるんですけど、
恥ずかしながらdockerの勉強は全然していなかったのでちゃんと勉強していきます。

せっかくなのでdockerでlinux環境を作りつつ簡単なwebアプリも作ってみました。
今回その過程をまとめてみましたので是非ご覧ください

開発環境

  • OS: Windows10 home
  • エディタ: VScode ver 1.51.1
    VSCode拡張機能: Remote-Containers
  • ツール: Docker Desktop
    Docker Official Images: ubuntu:18.04
    フレームワーク: flask

今回Docker Desktopを使っていきます。

詳しいインストール方法は今回省略します。
以下のドキュメントを読んでいただければインストール、アンインストールの方法が詳しく書かれているためすぐに準備ができると思います。

ディレクトリ構成

ubuntu_dev/
  ├ app.py
  └ Dockerfile

※今回扱うファイルのみ表示しています。

Dockerで環境構築

まず最初にDockerでwebアプリ開発用の仮想環境を作ってみましょう。

今回はubuntuの環境を作り、そこにpython3とflaskをインストールしていきます。

本来、ubuntuの環境をつくるだけならば“docker pull ubuntu”をすれば簡単に作れるのですが、
今回目的としているのはDockerの勉強ということなのでDockerfileを使って独自にカスタマイズしていきたいと思います。

Dockerfile作成

FROM ubuntu:18.04  # ...1
WORKDIR /usr/src/app  # ...2
RUN apt update  # ...3
RUN apt install python3 python3-pip -y
RUN pip3 install flask
COPY . .  # ...4
  • 1: ここではベースとなるイメージとタグを指定しています。
    FROM <image名>:<サポートされているタグ>
    上記の書き方で指定することができます。
    サポートされているタグはdockerhub内にあるdocker official imagesのubuntuに記載されているので使用したいタグを確認して各々で変えてください
  • 2: ここではワーキングディレクトリを設定しています。
    これを設定することで後に説明する“RUN”“COPY”の実行場所を設定することができます。
    また、自作ubuntuのコンテナを実行後、シェルに入ったときに表示されるカレントディレクトリにも反映されます。
  • 3: ここに記載した3つのRUNコマンドでaptのアップデートpython3, pip3のインストール
    flaskのインストールを実行しています。
    ubuntuのシェルでもこれらを実行してインストールすることは可能ですが、こういったコンテナは目的に合わせて使い捨てしていくのでそのたびにインストールし直すのは正直面倒くさいです。
    なのでDockerfileでRUNコマンドを入れることでイメージを作るときまとめてインストールしてくれるように作成します。
  • 4: これは‘build’コマンドを実行したときのディレクトリ(今回の場合Windows10側)にあるファイルまたはフォルダを今から作成する仮想環境のディレクトリ(/usr/src/app)にコピーします。
    COPY <コピーしたいファイルまたはディレクトリ> <コピー先のディレクトリ>
    上記が基本的な書き方です。

Dockerfileを元にイメージをビルド

ではコンテナを作る際に必要なイメージをビルドします。
Dockerfileを置いているディレクトリで以下のコマンドを実行します。

ubuntu_dev> docker build --tag my_image:1.0 .

docker build –tag <任意のイメージ名>:<任意のタグ> <Dockerfileがある場所>

上記が基本的な書き方になります。
<Dockerfileがある場所>に関してはURLで参照しても良いみたい。

buildが終わったら以下のコマンドを実行してちゃんとイメージができているか確認してみます。

> docker images
REPOSITORY    TAG    IMAGE ID       CREATED         SIZE
my_image      1.0    05358392f743   2 minutes ago   484MB

ちゃんと作れているようです。

イメージを元にコンテナを作成

では次に今作ったイメージを元にコンテナを作っていきます。

> docker run -it -d --name my_container my_image:1.0

上記のコマンドでコンテナを作成し、起動までしています。

  • docker run: コンテナを作り起動までしてくれる
  • -i: まだ理解が追い付いていないがキーボードからの標準入出力をコンテナ内に反映されるっぽい?
  • -t: pseudo-ttyという疑似端末をコンテナ内で用意(pseudo-ttyに関しては無勉強)
  • -d: コンテナを裏で動かし、IDを表示してくれる
  • –name: コンテナに名前を付ける

とりあえずは今のところ把握できていることをまとめてみました。
下のコマンドを実行することで今動いているコンテナを確認できます。

> docker ps
CONTAINER ID      IMAGE         COMMAND       CREATED        STATUS        PORTS          NAMES
85fkid345738      my_image:1.0  "/bin/bash"   9 seconds ago  Up 7 seconds                 my_container

VSCodeとDockerのコンテナと接続

vscodeで作成したflaskアプリをそのままubuntuのコンテナ上ですぐに実行できるようにvscodeとDockerを接続しようと思います。

まずはvscodeの拡張機能であるRemote-Containersを追加します。
Remote Developmentの拡張機能はRemoteのWSL, Containers, SSHの三種類がまとめて含まれているのでこちらを追加するのもありです。

追加するとvscode左側に下画像のアイコンが追加されているのが確認できます。

このアイコンをクリックすると下の画面が表示されます。
下画像の赤枠をクリックするとコンテナに接続されたvscodeが起動します。

起動したvscodeの左下を見ると接続しているコンテナの名前と使われているイメージが表示されています。

そして起動したばかりの時はフォルダはまだ開かれていないはずです。
下画像の”フォルダを開く“をクリックすると上のほうにどのディレクトリを開くか指定できるフォームが表示されます。

上画像のOKをクリックすることでappフォルダが開きました。

またvscodeのターミナルを開くとコンテナ内のbashが開かれるはずです。

これでコンテナを使った開発環境がある程度整いました。

いよいよflaskでHello World!!

では作成したコンテナを使ってflaskアプリを作ってみます。
今回のメインはDockerで仮想環境を構築することなのでflaskに関しては簡単にまとめます。

下のファイルをappフォルダ直下に作成します。

# app.py
from flask import Flask
app = Flask(__name__)

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

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

このファイルを作ったら先ほどのターミナルでpython3 app.py を実行します。

ターミナルに表示されたlocalhostのurlを開くとブラウザに”Hello World!!”の文字が表示されます。

表示されましたか?されたら大成功です!

コンテナを止めるまたは破棄

では最後にコンテナを片付けましょう。

> docker stop my_container

上記のコマンドを実行するとコンテナを止めることができます。

さらに下のコマンドを実行することで今回使用したコンテナを完全に破棄することができます。

> docker rm my_container

コンテナは破棄しましたが、ubuntuをベースにしたイメージは残っているので再びビルドすることで再度同じ環境をすぐに作り直すことができます。

たとえ作った環境内がちらかっても簡単に初期の状態で作ることができるのはとても楽ですね。

まとめ

今回はDockerの基本的な使い方を勉強がてらまとめてみました。
まだまだ不勉強な部分がありますがまだDockerを触ったことが無いという方にも参考になってくれたら幸いです。

ここまで読んでくれてありがとう!

コメント

タイトルとURLをコピーしました