こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.
Docker超入門第二回です.今回はDockerを実際にインストールして使ってみます.
Docker imageやDockerfileなどの用語についても説明をしていきたいと思います!
「Dockerってなに?!」な方は第一回の記事をご覧ください!
自分がDockerの勉強をしたころ,どの記事も驚くほどわかりにくく,苦労しました...
でも,Dockerは基本の操作さえ抑えてしまえば本当に使いやすいし超便利です.今回もステップバイステップに超絶わかりやすく解説しますので,付いてきてください!
なお,本ブログではMacを推奨しております.Windowsを使っているという方,特に理由がなければ早い段階でMacに切り替えることをオススメします.
(追記:Docker動画講座作りました.Dockerについてもっと学びたい人は是非!14時間にも及ぶ超壮大講座です.
目次
Docker Hubに登録
では,早速DockerをMacにインストールしましょう.
Dockerの仕組みや概念はわかりにくいです.自分も最初みんなが言っていることがよくわかりませんでしたw
というわけで,まずは入れて使ってみましょう!!
MacでDockerを使う場合はDocker Desktopというアプリをインストールするのですが,そのためにDocker Hubというサービスのアカウントを作成します.
Docker HubはDocker imageを管理するレジストリです.Githubがコードを管理する場所であるように,Docker HubはDocker imageを管理する場所だと思っていただければいいです.
Dockerはコンテナという箱に開発環境や実行環境を簡単に構築できるものという話を前回の記事でしました.この「環境」というのは日々更新されていきますよね?使うパッケージのバージョンを更新したり(Tensorflow1.4から1.5に更新したり)新しいパッケージをインストールしたり.
これらもコード同様に管理が必要です.開発者全員が自分のPC(やサーバ)で「みんなと同じDockerコンテナ」を使って開発を進める必要があります.その役割を担うのがDockerレジストリです.
Docker HubというのはGithub同様,世界中の人がアクセスでき,オープンソースの実行環境などが公開されています.
(Githubについての連載もあります.まだつかったことがないという人はこちら)
それでは,こちらからDocker Hubにアクセスしてアカウントを作りましょう!
‘Sign up for Docker Hub’をクリックし,Docker ID, Email, Passwordを入力します.
Docker IDはGithubのUsername同様,自分のリポのURLの一部になりますのでご注意ください.なお,Docer IDの変更はチケットの起票が必要だったりと手間です.
Sign Upするとフルネームや会社名を入れるフォームに遷移します.
記入をするとお決まりのAddress verificationのメールが送られてくるのでVerifyしましょう.
Login後以下のような画面になりますので,画面に従ってDocker Desktopをダウンロードします.
もし上記のような画面でなかった場合はこちらからアクセスしてください.
‘Download Docker Desktop for Mac’をクリックすると.dmgがダウンロードされますので,それをダブルクリックし,Applicationsにドラッグ&ドロップします.
LaunchpadからDockerのアイコンをクリックしてスタートします.右上にDockerのアイコンが表示されたらOKです.
Docker HubからDocker imageをpullしよう
大丈夫です.一から説明します!
前回の記事でDockerはコンテナを作ってそこに環境構築をすると言いました.
そのコンテナはどのようにして作られるのでしょうか?
実はコンテナをいきなり作るのではありません.コンテナはDocker imageから作られます.
Docker imageというのは,コンテナを作るためのもととなるもので,携帯できます(配布したりできる).Docker Hubに保存されているものもDocker imageです.使いたいコンテナがあったらまずDocker imageを手に入れてそれを実行することでコンテナを作ることができます.
Docker fileというのは,ただのTextファイルで,Docker imageを作るための設計書です.Docker fileを使わなくても,コンテナ内で新しいパッケージをインストール(コンテナを更新)してDocker imageにすることができます(が,基本はDocker fileを常にメンテしてDockerfile⇨Docker image⇨コンテナというフローにすることをオススメします.)
大丈夫w 今完全に理解する必要はないですよ.これからハンズオンでやっていくので徐々に慣れていけばOK!!
そう.ということで,まずはDocker HubからなにかのDocker imageをpullしてみましょう!
まずTerminal上で以下のコマンドでDockerにログインします.ログインには先ほど登録したDocker Hubのものを使いましょう.
(本ブログではTerminalではなくiTerm2の使用をオススメしています.まだiTerm2を使っていない人はこちらの記事を参考にいれてみてください!
1 2 3 |
$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: |
UsernameとPasswordを入力しましょう.すると Login Succeeded と表示されればログイン成功です.
それでは早速Docker imageをpullしてみましょう!ここでは試しに hello-world:latest というDocker imageをpullします.
pullをするコマンドは $docker pull {IMAGE名:TAG名} です.今回pullするdocker imageはhell-worldというIMAGE名のlatestというTAGのものです.
このTAGというのはDocker imageのバージョンのようなものだと思っていただいてOKです.
それでは以下のコマンドをTerminalで実行しましょう.
1 |
$ docker pull hello-world:latest |
すると以下のような結果が返ってくると思います.
どうやらlibrary/hello-worldからimageをpullしているようです.
このlibrary/というのはDocker Hub Libraryをさし,その中のhello-worldというレポジトリからpullしているのです..
先ほどDocker Hubにログインしましたよね?(
$docker login )
その状態でpullをすると,まずDockerは指定されたIMAGE名のレポジトリをDocker Hub Libraryからpullしてきます.
なお,hello-worldのレポジトリはこちらにあります.Dockerの公式imageです.
Terminalで $docker images で今手元にあるDocker imageのリストを確認できます.
1 2 3 |
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 12 months ago 1.84kB |
Docker imageからコンテナを作成しよう
このDocker imageはコンテナの元となるものです.
それでは,Docker imageからコンテナを作成(run)してみます!
$docker run {IMAGE名} でrunできます.(同じDocker imageがある場合はTAG名をつけます.{IMAGE名:TAG名}という感じで)
1 |
$docker run hello-world |
すると以下のような文が表示されます.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ |
これは,hello-worldというコンテナが実行され,その実行の結果(テキスト出力)です.
コンテナはサービスの実行環境となると言いましたね?このhello-worldのDocker imageには上記のテキストを出力するという命令があらかじめ設計書に書かれていて,コンテナを作成した時にその命令が実行され,テキストが出力されたのです
大丈夫大丈夫w まだわからなくてもこれから何度も同じようなことをしていくので,その都度説明しますね.この連載が終わる頃には完全に理解していますよ!
コンテナの一覧は $ docker ps -a で確認することができます.
$docker psは,activeのコンテナだけ表示されます.
1 2 3 |
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5e307691162 hello-world "/hello" 14 minutes ago Exited (0) 14 minutes ago sharp_dewdney |
実は普通にDocker imageをrun(optionを付けずに)をすると,コンテナ作成(run)⇨コンテナをexitという流れになります.つまり,もうコンテナの中にはいなくて出ちゃってるんですね〜 なので $docker ps (activeのものだけ表示)をしてもなにも表示されないですよね!
コンテナを出ずにコンテナ内に入るには $docker run -it {IMAGE名:TAG名} bash を実行します.-itというoptionは,コンテナ内でTerminal上にきちんと出力などを表示させたり入力できるようにしたりするいわば「Interactionを可能にする」ものです.
bashというのは,runした後の実行コマンドです.通常runコマンドではコンテナを実行したあとに追加で実行したいコマンドを書きます. $docker run -it {IMAGE名:TAG名} {コマンド}
つまりコンテナ実行したらそのままbashを起動させるということですね.(bashについてはこちらの記事をご参考ください.) $docker run -it {IMAGE名:TAG名} bashこの形はよく使うので覚えておくといいです.
それでは $ docker run -it hello-world bash を実行してみましょう.
1 2 |
$ docker run -it hello-world bash docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown. |
そうなんです,実はhello-worldにはbashというコマンドを受け取るものがないんです.もう一度hello-worldの出力をみてみましょう.
hello-worldのコンテナにはubutuが入っていないので,そもそもbashできないんですね.
UbuntuというのはLinux系のOSの一つです.Linuxについてはこちらの記事で触れています.
今回は長くなったのでここまで!次回の記事ではubuntuコンテナを使って実際にコンテナに入って作業をしてみたいと思います!
まとめ
かなり長くなってしまいましたが,まとめると
- 最初はDockerというのは本当にわかりにくい
- けどめちゃくちゃわかりやすく解説するから頑張って付いてきて
- Docker HubはDocker imageが保管されてる
- Dockerfile⇨Docker image⇨コンテナの流れで作られる.(今回はDocker imageをそのまま落としてきました.)
- ログイン: $docker login
- pull: $docker pull {IMAGE名:TAG名}
- image一覧: $docker images
- imageからコンテナを作る run : $docker run {IMAGE名:TAG名}
- imageからコンテナを作って中にはいる run : $docker run -it {IMAGE名:TAG名} bash
- コンテナ一覧: $docker ps -a
今回の内容があまりわからなくても,また次回同じような作業をするのでご安心を!
何事も反復練習です♪
Twitter(@usdatascientist)ではデータサイエンスのことや海外勤務のことなど,有益な情報を配信しております.
よろしければフォローお願いいたします
それでは!!
第三回更新しました♪実際にコンテナで作業してみます!