Theories of Pleiades

技術の話とかイベントに行った話とか思ったこととか

Docker入門備忘録① Dockerの基本コマンドを使えるようになる

TL;dr

  • docker runの基本的なコマンドを使う
  • コンテナにローカルのディレクトリをマウントする


想定層

  • dockerが本当にわからない
  • dockerの基本的なコマンドも使えない
  • docker-composeの良さがよくわからないし何をしているのかもわからない


Dockerの概要

Dockerの中にコンテナと呼ばれる無数の仮想環境を作ることができる。

DockerHubにはたくさんのイメージ(=既に出来上がった環境)が転がっているので,それをdocker pullで拾ってくると使えるようになる。


docker pullで拾ってきたイメージをdocker runで有効化し(=コンテナ化)再生することができる。


docker psをすると現在立ち上がってるコンテナの一覧が見れる。

docker ps -aで現在存在する(止まっているコンテナも含む)コンテナを一覧できる。


docker stopでコンテナを停止できる。

docker rmでコンテナを削除できる(このとき元になったイメージは残る)。

元のイメージを削除したい場合はdocker rmi,現在システム上にあるイメージはdocker imagesで確認できる。


docker execでコンテナの中に入ってコマンドを実行できる。


Docker上にGolangの実行環境を作ってみる

まずはGolangを実行するためのイメージを拾ってきます。

$ docker pull golang


$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
golang              latest              36e5881731e4        6 days ago          774MB

正常にgolangというイメージが取得できていることがわかります。


このイメージを使ってコンテナを作ります。

$ docker run -d -it --name golang_container golang
85f7fd1c6ea3155d8a6ac6cf924715d20c0e2f3dd9235756298ef1710d6389a4
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
85f7fd1c6ea3        golang              "bash"              6 seconds ago       Up 5 seconds                            golang_container

コマンドを解説していきます。


docker run -d -it --name golang_container golanggolangというイメージを元にしたコンテナgolang_containerを作っています。

-dフラグはバックグラウンドで実行するという意味です。これがなければ直接ターミナル上でコンテナが起動します。

-itフラグはコンテナ上で任意のコマンドを実行し,ターミナルにつなげます(lscatなど。今回の場合(?)指定がない場合bashが起動します)。

--nameフラグはコンテナに名前を付けています。名前は直後の引数に指定します。この場合はgolang_containerです。

最後にgolangとして元にするイメージを指定します。


よって,今回の例では,golangというイメージを元に作成したコンテナにgolang_containerと名付け,bashをバックグラウンドで実行しています。

この例でbashをバックグラウンドで実行している理由として,今回利用しているgolangイメージの場合デフォルトの状態だとコンテナを実行したときに何もせず終了してしまうためです。

本来ならこの中でサーバプログラムを実行するなどして永続的に終了しないようにするのですが,今回は説明のためにbashを実行したままにしてコンテナが止まらないようにしています(今回の例で-itを付け忘れるとdocker psに出てこなくなります)(正直この辺よくわかっていません)。


コンテナの中に入ってみます。

$ docker exec -it golang_container /bin/bash
root@bac2899e4a10:/go#

コンテナ内のbashが立ち上がり,ターミナルに接続され入出力ができるようになりました。

この中にはデフォルトでbin,srcの2つのディレクトリがあります。この中に自由にソースを作成し,実行できます。


動作確認ができたので,コンテナから出て,コンテナを削除します。

root@bac2899e4a10:/go# exit
exit
$ docker stop golang_container
golang_container
$ docker rm golang_container
golang_container


$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


コンテナからホストのディレクトリにアクセスできるようにする

Dockerを使う際,ふつうコンテナの中でソースを書いたりすることはありません。ホスト側で作ったソースコードをDockerコンテナ上から実行したいと思うはずです。

そのような場合,ホストのディレクトリをコンテナ内にマウント(=対応付け)することができます。


ホストの./src/appをコンテナ内の/go/src/appにマウントします。

$ docker run -d -it --name golang_container -v $(pwd)/src/app:/go/src/app golang
b303f3e4eb06db65242bafb1e746f90d187c354b8eb3597776011b36486057e1

このコマンドでは,新しく-vフラグが出てきました。
直後の引数に[ホスト側の絶対パス]:[コンテナ側の絶対パス]と指定することで,ふたつのディレクトリを結びつけることができます。

$(pwd)と書いたところには,カレントディレクトリの絶対パスが出力されます。


実際に以下のようなファイルをホストのsrc/app下に置いておきます。

package main

import (
  "fmt"
)

func main() {
  fmt.Println("Hello, golang from docker!")
}

このソースをコンテナ上で実行してみます。

$ docker exec -it golang_container /bin/bash
root@b303f3e4eb06:/go# go run src/app/hello.go
Hello, golang from docker!


正しくコンテナ上からホスト側のディレクトリに存在するファイルを読み込み,実行できました!


まとめ

  • golangのイメージからコンテナを作成しホストで作成したプログラムを実行できた


気が向いたらっていうか勉強したらDockerfileの話とかdocker-composeの話とか書きます。


参考にしたもの

qiita.com