こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.
(追記:Docker動画講座作りました.Dockerについてもっと学びたい人は是非!14時間にも及ぶ超壮大講座です.
Docker超入門第6回です.今日は今までの連載でDockerの基本操作を一通り学んだのでそれを総復習したいと思います.まとめですね.
ここまでのDocker入門連載の一覧↓
第①回:Dockerってなに?
第②回:Dockerの始め方
第③回:Dockerコンテナを使ってみる
第④回:コンテナをcommitしてレジストリにアップロードする
第⑤回:Dockerfileを使う
(本記事)第⑥回:Docker基本操作フローまとめ
それでは,学んだことをまとめてみたいと思います.
目次
Dockerとは?なぜ必要なのか
Dockerは2013年にできた新しい仮想化技術です.
サーバやPCの上にコンテナと呼ばれる箱を作り,そこに開発環境やテスト環境,アプリの実行環境を構築することができます.
従来の仮想化(サーバ仮想化)に比べ,Dockerのコンテナ仮想化は仮装マシンごとにOSを立ち上げる必要がなく,コンテナ間でOSのカーネルを共有することで軽量化を実現しています.また,コンテナをDocker imageと呼ばれるものにすれば簡単に配布,共有することが可能です.
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を作ります.
1 2 3 4 |
Desktop (🐢 ) :$ mkdir docker Desktop (🐢 ) :$ cd docker/ docker (🐢 ) :$ touch Dockerfile docker (🐢 ) :$ subl Dockerfile |
私は ~/Desktop に作りました. $subl コマンドでSublimeでDockerfileを開き,以下のコードをコピーしてください.(どのエディタでも構いませんが,本ブログではSublimeの使用を進めています.Sublimeについてはこちら $subl コマンドが動かない人は正しくPathが通っていないので,こちらの記事のsublime使い方④を参考にしてください.sublimeは必須ではないので,他のエディタでももちろん問題ないです.)
1 2 |
FROM ubuntu:latest RUN touch test |
- FROM ubuntu:latest ベースになるDocker image
- RUN touch test ubuntu:latest の上に $ touch test を実行したimage layerを作成
DockerfileをビルドしてDocker imageを作成
それでは,Dockerfileをビルドしてみましょう.Dockerfileが保存されているフォルダに移動し,
$ docker build . でビルドします.
するとDockerはカレントディレクトリのなかにあるDockerfileというファイルを探してビルドします.
1 2 3 4 5 6 7 8 9 10 |
~ (🐢 ) :$ cd Desktop/docker/ docker (🐢 ) :$ docker build . Sending build context to Docker daemon 69.63kB Step 1/2 : FROM ubuntu:latest ---> 549b9b86cb8d Step 2/2 : RUN touch test ---> Running in 464232daec6a Removing intermediate container 464232daec6a ---> 46e8b7ef60ea Successfully built 46e8b7ef60ea |
出力結果をみると,Dockerfileに記述したコマンドが実行されているのがわかるのと思います.
Docker imageをrunしてコンテナに入る
runしてコンテナに入ってみましょう.名前がないので今回はIDを指定します.
1 2 3 |
docker (🐢 ) :$ docker run -it 46e8b7ef60ea bash root@af222d93638b:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var |
ちゃんと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}}/ を入れることを忘れないようにしましょう.
1 2 3 4 5 6 7 |
docker (🐢 ) :$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 46e8b7ef60ea 25 hours ago 64.2MB docker (🐢 ) :$ docker tag 46e8b7ef60ea datascientistus/my-first-repo:version2 docker (🐢 ) :$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE datascientistus/my-first-repo version2 46e8b7ef60ea 25 hours ago 64.2MB |
今回は前にpushしたものと被らないように version2 としました.
それでは, $docker push IMAGE名(レポジトリ名) でいよいよDocker Hubにpushします
1 2 3 4 5 6 7 8 |
docker (🐢 ) :$ docker push datascientistus/my-first-repo:version2 The push refers to repository [docker.io/datascientistus/my-first-repo] f5ec9a29b5b7: Pushed 918efb8f161b: Pushed 27dd43ea46a8: Pushed 9f3bfcc4a1a8: Pushed 2dc9f76fb25b: Pushed version2: digest: sha256:556086f07cbb4f6d17a5524a522640c1482f7166c07384c9614dfc742958e1a6 size: 1358 |
pushが終わったらDocker Hubにアクセスしてimageがpushされていることを確認しましょう.
ちゃんとpushされてますね
pushしたDocker imageをpullする
実業務では,このリポのimageが次々と更新されていきます.そのため,チームで働く場合はリポからimageをpullする必要があります.
まずは先ほどのローカルのimageを $ docker rmi -f {IMAGEID} で削除します.
1 2 3 4 |
docker (🐢 ) :$ docker rmi -f 46e8b7ef60ea Untagged: datascientistus/my-first-repo:version2 Untagged: datascientistus/my-first-repo@sha256:556086f07cbb4f6d17a5524a522640c1482f7166c07384c9614dfc742958e1a6 Deleted: sha256:46e8b7ef60eacdc73b1e9a0e6a7c618683643be1ff835a9fa116c73a0be7ee9c |
$ docker pull {IMAGE名} でpull しましょう.IMAGE名に {username}/ をつけることを忘れないように.
1 2 3 4 5 6 7 8 9 10 11 12 |
docker (🐢 ) :$ docker pull datascientistus/my-first-repo:version2 version2: Pulling from datascientistus/my-first-repo 2746a4a261c9: Already exists 4c1d20cdee96: Already exists 0d3160e1d0de: Already exists c8e37668deea: Already exists 9d254c757f6b: Already exists Digest: sha256:556086f07cbb4f6d17a5524a522640c1482f7166c07384c9614dfc742958e1a6 Status: Downloaded newer image for datascientistus/my-first-repo:version2 docker (🐢 ) :$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE datascientistus/my-first-repo version2 46e8b7ef60ea 25 hours ago 64.2MB |
$ docker images で確認できれば終わりです!
まとめのまとめ
今回の記事で,Dockerの使い方を復習できたでしょうか?
これで基本の操作フローは完璧です.ですが,実業務でDockerを使うとなると,もう少しやらなければいけないことがあります.
Dockerを使いこなすには,Dockerfileをちゃんと書けなければなりません.
さらにいうと,DockerfileさえちゃんとかければDockerをマスターしたも同然
次回はDockerfileの書き方(超重要)をもう少し詳しく解説していこうと思います!
それでは!Twitter(@usdatascientist)やってますのでよかったらフォローお願いしますね〜