タイトル通りです、Docker を触り始めました。
調べつつ導入方法から始めたのでそんなメモです。
目次
というか Docker ってなんですか?
Docker について、少しわかっている気でわかっていないことが多いぞと、
すぐに気が付いたのでいくつか見ながら確認。
(技術書典での購入物だったり、WEB の資料とか)
一旦以下の認識で進める。
- Docker
OS レベルのコンテナと呼ばれる仮想化環境を提供する OSS
- DockerFile
コンテナイメージのカスタマイズを定義するファイル
- Docker Compose
複数のコンテナをまとめて管理するためのツール
Docker の導入
Qiita Docker を Mac にインストールするを参考にしながら導入。
コマンド
バージョン確認
イメージ関連
イメージの検索
docker hubでも検索できる。
イメージの取得
取得済みイメージの一覧
1 2
| docker image ls docker images
|
取得済みイメージの設定詳細を表示
取得済みイメージを削除
イメージをまとめて削除
1
| docker image rm $(docker images -q -a)
|
コンテナ関連
コンテナの実行状況
1 2 3 4 5 6
| docker container ls docker ps
docker container ls -a docker ps -a
|
コンテナの作成(取得済みイメージがなければ取得から)、実行
1 2 3
| docker run "イメージ名"
docker run [オプション] "イメージ名" [コマンド] [引数]
|
上記のdocker run "イメージ名"
最少コマンドに見えるが、落とし穴だった。
例えば CentOS のコンテナを実行時にdocker run centos
とすると、コンテナから出られない状態になった・・・。
例に上がっていた helloworld イメージのコンテナは実行例として、docker run hello-world
としていた。
docker inspect hello-world
で確認すると"CMD"
が[/hello]
となっている。/hello
を実行して終了しているようです。
対してdocker inspect centos
では、"CMD"
は以下のようになっています。
1 2 3 4 5 6
| [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash"]" ]
|
となっていた。
入力を待ち受けているっぽい。
実行後に終了しないイメージなら、以下の 2 択になりそうです。
1 2 3 4 5 6
|
docker run -it "イメージ名"
docker run -d "イメージ名"
|
ちなみに、コマンドで例えばdocker run centos ls
のように ls を渡すと実行後元のターミナルに戻ってくることができる。
コンテナの作成だけする
1 2 3 4 5
| docker create "イメージ名"
docker create [オプション] "イメージ名" [コマンド] [引数]
docker create -it "イメージ名"
|
docker create -d ~~~
が無く、バックグラウンドモードの「作成だけ」は無い。
コンテナの開始
1 2 3 4
| docker start "CONTAINER ID"or"NAMES"
docker start -ai "CONTAINER ID"or"NAMES"
|
コンテナの停止
1
| docker stop "CONTAINER ID"or"NAMES"
|
コンテナの削除
1
| docker rm "CONTAINER ID"or"NAMES"
|
コンテナをまとめて削除
1
| docker container rm $(docker ps -q -a)
|
バックグラウンド実行しているコンテナをフォアグラウンドに持ってくる
1 2
| docker attach --sig-proxy=false "CONTAINER ID"or"NAMES"
|
新しいプロセスを実行しているコンテナに追加する
1 2 3 4 5 6
| docker exec [オプション] "CONTAINER ID"or"NAMES" "コマンド"
docker exec -it "CONTAINER ID"or"NAMES" bash
docker exec -d "CONTAINER ID"or"NAMES" ping ~.~.~.~
|
コンテナからイメージを作る
1 2
| docker commit "CONTAINER ID"or"NAMES" "リポジトリ名:タグ"
|
作成したイメージからまたコンテナを作成できる。
run と create のオプション
docker run
とdocker create
のオプションは非常に多い。とはいえよく使われていたのは以下に記載のものでしょう。
1 2 3 4 5 6 7 8 9 10 11 12
| -p
-v
--name
-e
|
特に、-e
はdockerhub mysqlを見ると、データベースのユーザー名設定ほか設定手順に記載があるので押さえておく必要があるみたい。
dockerfile
dockerfile を使用することで、イメージのカスタマイズができる。
docker イメージから、カスタマイズを加えて、docker イメージを作成する。
1 2 3 4
| docker build [オプション] "dockerfileの保存先ディレクトリのパス"
docker build -t "リポジトリ名:タグ" .
|
dockerfile の書き方
dockerfileに記載するコマンド群1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| FROM "dockerイメージ名"
MAINTAINER "名前"
RUN "コマンド"
CMD "コマンド"
ADD "ローカルファイル/ディレクトリ名" "追加先パス"
COPY "ローカルファイル/ディレクトリ名" "追加先パス"
WORKDIR "ディレクトリパス"
ENV "環境変数名"="値"
USER "ユーザー名"
EXPOSE "ポート番号"
|
以上をもとに、
centos の docker イメージを元に、which コマンド、nano コマンドを追加する dockerfile を作ってみました。
1 2 3 4 5 6
| from centos MAINTAINER octo8080
RUN echo "Now building....."
RUN yum install -y which nano
|
これをもとにイメージを作成して、実行します。
1 2 3 4
| docker build -t centos-wwn .
docker run -it centos-wwn
|
コンテナ名の中で、which nano
で結果が返ってくれば OK!
CMD
を設定しなかったが、この時は元のイメージの内容を引き継いでいるよう。
今度は、web サーバを立ち上げる dockerfile を作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from centos MAINTAINER octo8080
RUN echo "Now building....."
RUN yum install -y nginx
WORKDIR /usr/share/nginx/html COPY ./index.html . RUN chmod 755 ./index.html
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
|
CMD ["nginx","-g","daemon off;"]
の部分は、nginx イメージの inspect 結果を参考にしてます。
同じ階層に適当に index.html も作っておきビルドと実行。
1 2 3 4
| docker build -t centos-nginx .
docker run -it centos-nginx
|
localhost にブラウザでアクセスすると、自身で用意した index.html の内容が表示される。
Docker Compose
といいたいとこですが、長くなったので Docker Compose は次にします。別に書きました。
Docker を触り始めました 2 - Docker Compose -
Docker をちゃんと触り始めたのですが、VMWare WorkStation player で仮想マシンを個別に立ち上げてきたこともあり、非常に手軽でいいなぁ。というのが感想でした。
今回だと nginx を立ち上げるイメージを作ってみました。しかし、実運用では nginx のイメージがあるのでそちらを使って、dockerfile で.conf 他を追加して使うのがいいのかなと思いました。
ではでは。