Docker超入門⑥〜Docker基本操作フローまとめ〜【初心者向け】

AI開発者・データサイエンティストを目指す人向け
おすすめUdemy講座一覧

こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.

Docker超入門第6回です.今日は今までの連載でDockerの基本操作を一通り学んだのでそれを総復習したいと思います.まとめですね.

ここまでのDocker入門連載の一覧↓
第①回:Dockerってなに?
第②回:Dockerの始め方
第③回:Dockerコンテナを使ってみる
第④回:コンテナをcommitしてレジストリにアップロードする
第⑤回:Dockerfileを使う
(本記事)第⑥回:Docker基本操作フローまとめ

それでは,学んだことをまとめてみたいと思います.

Dockerとは?なぜ必要なのか

Dockerは2013年にできた新しい仮想化技術です.

サーバやPCの上にコンテナと呼ばれる箱を作り,そこに開発環境やテスト環境,アプリの実行環境を構築することができます.

従来の仮想化(サーバ仮想化)に比べ,Dockerのコンテナ仮想化は仮装マシンごとにOSを立ち上げる必要がなく,コンテナ間でOSのカーネルを共有することで軽量化を実現しています.また,コンテナをDocker iamgeと呼ばれるものにすれば簡単に配布,共有することが可能です.

Dockerは例えば以下のような使い方をします

  • 開発環境を構築する:メンバー間で同じ環境で開発できるように,開発環境のDocker imageを作り,みんなで共有できる
  • テスト環境を構築する:CI/CDの中でDockerコンテナを立ち上げてテストするように設定すれば,本番環境と同じ環境でテストすることができる
  • マイクロサービスの実行環境を構築する:アプリへのリクエストに応じて小さいレベルのサービスのコンテナをオンデマンドに立ち上げてリクエストに対応する.そうすることで必要な分だけストレージやメモリを消費するようにできるし,分散管理が可能

とまぁ色々ありますが,個人レベルでも使えるとめちゃくちゃ楽ですよ.

例えばpythonで機械学習の勉強をしようとした時,環境作るだけで大変ですよね?python入れてscipyとか他のパッケージいれてって...
しかもプロジェクトによって使うバージョンも違う.(pythonなら仮装環境作れますが,pythonと他の言語のフレームワークを入れる場合はそういうわけにもいかない)

Dockerを使えば「このプロジェクトの環境のDocker」って定義しとけばそれをみんなで共有できるし管理も楽チンなのです.すでにあるDocker imageを落として使えば開発環境も簡単に作れます

今やDockerを使ってない開発はありえないと言えるくらい業界標準になっています.

必ず使えるようにしましょう.

コンテナの作り方と更新

コンテナを作るには

1.Dockerfileを作成
2.DockerfileをビルドしてDocker imageを作成
3.Docker imageをrunして作成

上記の1.->2.->3.の順で基本作っていきます.

ただ,一度Docker imageを作ってしまえば,あとはそのDocker imageを使ってそれぞれのサーバやPCでrunしてコンテナを作るだけで,Dockerfileは不要です.

Docker imageを更新するには

1.Dockerfileを更新して
2.コンテナを直接更新してcommitしDocker imageにする

の2通りですが,基本は1.で行います.理由はコンテナを直接更新すると更新内容が可視化されず,そのDocker imageの中身がなんなのか誰もわからなくなってしまうからです.

また,Dockerfileを更新する際は最後の行に付け加える形で更新していきましょう.途中の行を更新するとビルドのときにその行以降のimage layer(Docker imageの構成要素)を再度作るため時間がかかってしまいます.

本記事に記載しているフローのシナリオ

今回は,前回までと同じシナリオで作業を進めたいと思います.

シナリオは「ubuntuをベースにしたコンテナにtestというファイルを作成して,そのDocker imageをメンバーに共有できるようにする」

です.実際にはこんな単純ではなく,他にもパッケージを入れたり,なにかのスクリプトをコンテナ生成時に自動で実行させたりしますが,今回はもっともシンプルな必要最低限の作業のみ行います.

Dockerfile作成⇨ビルド⇨Docker imageをrun⇨コンテナ生成⇨Docker Hubにpush

Dockerfile作成

それでは早速やっていきましょう.

Dockerfileを作ります.前回の記事でやったばかりですねw dockerフォルダを作成し,そこにDockerfileを作ります.

私は ~/Desktop に作りました. $subl コマンドでSublimeでDockerfileを開き,以下のコードをコピーしてください.(どのエディタでも構いませんが,本ブログではSublimeの使用を進めています.Sublimeについてはこちら)

  • FROM ubuntu:latest  ベースになるDocker image
  • RUN touch test ubuntu:latest の上に $ touch test を実行したimage layerを作成

DockerfileをビルドしてDocker imageを作成

それでは,Dockerfileをビルドしてみましょう.Dockerfileが保存されているフォルダに移動し, $ docker build . でビルドします.
するとDockerはカレントディレクトリのなかにあるDockerfileというファイルを探してビルドします.

出力結果をみると,Dockerfileに記述したコマンドが実行されているのがわかるのと思います.

Docker imageをrunしてコンテナに入る

runしてコンテナに入ってみましょう.名前がないので今回はIDを指定します.

ちゃんとtestファイルがあることがわかりますね!

Docker imageをDocker Hubにpush

この作ったDocker imageを他の人に共有できるように,Docker Hubにpushしましょう.
(Docker Hubの登録は第1回を参照)

まず,作成したDocker imageは名前がないので$ docker tagコマンドで名前をつけてリポジトリと紐付けます.

今回はすでに第4回の記事で作成しているmy-first-repoを使ってそこにpushします.
もしまだ作成していない場合は.Docker Hubにアクセスし,以下の手順で作ります.

さて,それでは作成したimage を my-first-repo にpushします.

pushする際はDocker image名をリポ名に合わせるんでしたね. $ docker tag {IMAGE_ID} {IMAGE:TAG} で名前をつけましょう.IMAGE名にきちんと {username}}/ を入れることを忘れないようにしましょう.

今回は前にpushしたものと被らないように version2 としました.

それでは, $docker push IMAGE(レポジトリ名)  でいよいよDocker Hubにpushします

pushが終わったらDocker Hubにアクセスしてimageがpushされていることを確認しましょう.

ちゃんとpushされてますね

pushしたDocker imageをpullする

実業務では,このリポのimageが次々と更新されていきます.そのため,チームで働く場合はリポからimageをpullする必要があります.

まずは先ほどのローカルのimageを $ docker rmi -f {IMAGEID} で削除します.

$ docker pull {IMAGE} でpull しましょう.IMAGE名に {username}/ をつけることを忘れないように.

$ docker images で確認できれば終わりです!

まとめのまとめ

今回の記事で,Dockerの使い方を復習できたでしょうか?

これで基本の操作フローは完璧です.ですが,実業務でDockerを使うとなると,もう少しやらなければいけないことがあります.
Dockerを使いこなすには,Dockerfileをちゃんと書けなければなりません.

さらにいうと,DockerfileさえちゃんとかければDockerをマスターしたも同然

次回はDockerfileの書き方(超重要)をもう少し詳しく解説していこうと思います!

それでは!Twitter(@usdatascientist)やってますのでよかったらフォローお願いしますね〜

 

ABOUTこの記事をかいた人

かめ@米国データサイエンティスト

アメリカの企業でデータサイエンティストしてます.専門はコンピュータビジョンで,人工知能の製品を開発中. アメリカからデータサイエンス全般をゆるーく配信中