どうも、エンジニアのミヤマです。
前回は、Dockerとはどんなものか、をざっくり紹介しました。
https://blog.anysense.co.jp/app/program/post-934/
今回は、実際に手を動かしてDockerをなんとなくでも理解してもらえると。。。
というわけで、やっていきます。
準備するもの(前提)
Dockerを準備しておいてください。
それぞれ確認として、バージョンを確認したり、コンテナを確認したりしておきます。
|
// こんなを実行したり $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES // こんなことしたり $ docker -v Docker version 18.09.0, build 4d60db4 |
今回、ぼくの環境(OS)はmacです。
macであれば、docker for macというのがあるので、簡単にインストールすることができますよ。
さっそく、コンテナを実行してみる
では、さっそくコンテナを実行してみようと思います。
前回のブログで説明したように、Dokcerはイメージをコンテナで実行します。
なのでまずは、ubuntuのイメージをとりあえずもってきます(プルしてきます)。
このイメージは、docker hubというところからもってきますが、コマンドがよしなにやってくれます。
|
// docker hub からubuntuのイメージをプル docker pull ubuntu:18.04 // pullされたイメージを確認 docker images |
次にプルしてきたイメージをコンテナで実行します。
|
docker run -it ubunu:18.04 bash |
そうするとubuntuのイメージが実行されているコンテナの中に入ることができます。
コンテナの中でubuntuが実行されていることを確認するために、以下のようなコマンドを打ってみてもいいかもしれません。
コンテナからは、control+P,Q
で抜けることができます。
コンテナが実行されているか、確認する
そして、コンテナがされているのは、このコマンドで確認できます。
コンテナに名前をつけて、実行する
docker ps すると、コンテナの名前がテキトーにつけられているのがわかります。
これを自分でつけることもできます。まー、したいひとはどうぞ、って感じです。
次のコマンドで、コンテナに名前をつけて実行できます。
|
$ docker run -it --name ubuntu_example ubuntu bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a8fa1646836d ubuntu "bash" 7 seconds ago Up 5 seconds ubuntu_example |
コンテナの中の変更は、削除されてしまう
コンテナは一度削除されると、そのコンテナの中の変更も削除されます。
それを見るために、ちょっとここで実験です。
コンテナの中で適当なファイルを作って、コンテナを削除してみます。
|
// コンテナの中に入る docker exec -it ubuntu_test bash // 適当なフォルダにtest.txtというファイルを作成する touch home/test.txt exit |
そして、コンテナを削除します。
|
// コンテナを止めて docker stop ubuntu_example // 削除する docker rm ubuntu_example // コンテナをもう一度つくる docker run -it --name ubuntu_example ubuntu bash root@0ed654c35eec:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@0ed654c35eec:/# ls home/ さっきのtest.txtない!! |
ここから、またコンテナを作成すると、コンテナの中にはさっきの変更は保存されていないことがわかります。
でも、開発においてこれって困りますよね。
それをどう解決するかを次に紹介します。
コンテナにフォルダをマウントする
コンテナの中の変更は、コンテナの削除のタイミングで削除されてしまいます。
コンテナを使った開発においては、変更されるフォルダは別でコンテナの起動とは別にマウントする、という方法をとります。
こうやって、コンテナの外からマウントします。
コンテナには、ディレクトリを好きなところにマウントすることができます。(ボリュームマウントといいます。)
-vオプションをつけるとマウントすることができます。
このコマンドは、ローカルのフォルダをコンテナの中のディレクトリにマウントするというものです。
では、やってみます。
|
// まずは、マウントするディレクトリをテキトーに作ります。 mkdir hoge_volume // -vでボリュームマウントして、コンテナを実行します。 docker run -it -v hoge_volume:/home/hoge_volume ubnutu_php_example bash // 確認します。 root@9dd6640838f6:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@9dd6640838f6:/# ls home/ hoge_volume マウントしたディレクトリがあります。 |
これで確かに、フォルダがコンテナにマウントできることを確認できました。
ついでに、マウントしたフォルダの中の適当なファイルを編集してみます。
そうすると、コンテナの中のフォルダとマウントしたフォルダはも同期されているはずです。
Dockerfileを作る
「ぼくは、私はubuntuの中でphpを動かしたい」っていう人、コンテナの中でこれをしたい、っていうのがあると思います。
でも、そういうイメージがdocker hubにない、ってことがあると思います。
そういうときは、Dockerfileを使います。
Dockerfileを使うことで、オリジナルのDockerのイメージを作ることができます。
まずは、Dockerfileを作る
ではでは、さっそくDockerfileを作ってみます。
まずは、適当にディレクトリを作って、その中にDockerfileという名前のファイルをつくります。
んで、今回はテキトーにphpでも入れてみます。
|
mkdir hoge cd hoge touch Dockerfile |
そして、そのDockerfileの内容はこのようにしておきます。
|
FROM ubuntu:18.04 RUN apt-get update \ && apt-get install -y tzdata RUN apt-get install -y php |
これの内容としては、ubuntu:18:04のイメージをインストールして、その中にphpをインストールしています。
では、このDockerfileをもとにオリジナルのイメージを作ります。
(今回はおまけで、そのできるイメージに名前をつけておきます。)
コマンドはこんな感じです。
|
docker build --no-cache -t ubuntu_php_example:latest ./ |
イメージができたことを確認
以下のコマンドで、イメージができたことを確認します。
|
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu_php_example latest 30699c4e3904 11 minutes ago 213MB |
これでできてますね。では、このイメージをつかってコンテナを実行してみます。
|
// さっき作ったイメージをつかってコンテナを起動 $ docker run -it ubuntu_php_example bash // コンテナの中でphpのバージョンを確認してみる root@7a9a20204e42:/# php -v PHP 7.2.17-0ubuntu0.18.04.1 (cli) (built: Apr 18 2019 14:12:38) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.17-0ubuntu0.18.04.1, Copyright (c) 1999-2018, by Zend Technologies |
まとめ
今回でなんとなくdockerがどんなもので、どうやって使えるのかイメージできたんじゃないでしょうか?
次回は、もうちょっとdockerを簡単にしてくれるツール、docker-composeを説明してみようとおもいます。
ではでは、今回はこのへんで。