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 golang
でgolangというイメージを元にしたコンテナgolang_container
を作っています。
-d
フラグはバックグラウンドで実行するという意味です。これがなければ直接ターミナル上でコンテナが起動します。
-it
フラグはコンテナ上で任意のコマンドを実行し,ターミナルにつなげます(ls
やcat
など。今回の場合(?)指定がない場合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の話とか書きます。