@itachi-PのRailsを中心とした学習記録&ポートフォリオ作成メモ 学習効率上アウトプットを増やす必要性を感じた為、Qiitaと使い分け毎日気軽に自分用メモをアウトプットする場、計画性を身に付けるセルフコントロールの一環として2019/3/22開始 強烈な自己否定・批判癖が染み付いてるので客観的に問題点を見据えながらバランス取りつつ<楽しく>記述 基本的に文章書くこと自体は好きっぽい

当面の間Docker習得を最優先目標とする

脇道に逸れない

  • Docker習得までDocker習得以外のことは全て止める
  • ProgateのReactとかGo(lang)とか気になっても視界の外に出す、Docker習得まで手を出さない

Dockerfile

  • 開発環境用と本番環境用にファイル名を分けた方が良い(Dockerfile.env等)
  • build時に1行につき1つのコマンドを上から順に実行
  • # から始まる行はコメント
  • {コマンド} {オプション(--rm, -wなど)} {オプション引数(ディレクトリパスなど)}
主なDockerコマンド
命令 説明
FROM イメージを指定「リポジトリー:タグ名」
MAINTAINER イメージ作成者名
ENV イメージ作成時やコンテナー実行の環境変数を設定
RUN コマンドの実行
ADD/COPY イメージ内にファイルやディレクトリをコピー
EXPOSE コンテナーで使用するポート番号を指定
CMD/ENTRYPOINT コンテナー起動時に実行するコマンドを指定
VOLUME ホストの一時保存ディレクトリを割り当てるディレクトリを指定
WORKDIR RUN,CMD,ENTRYPOINTを実行する時のカレントディレクトリを指定
DockerでCentOSのイメージをpullしてdocker runで中に入る
  1. Ubuntu(WSL)を起動し、sudo cgroupfs-mount && sudo service docker start

※テスト sudo docker run hello-world

終了済みも含めたプロセスを表示 sudo docker ps -a

  1. まずゲストOSであるCentOSをpull
# ダウンロード可能なCentOSのイメージ一覧を表示  
$ sudo docker search centos | more  

# リストの中(トップ)にあるオフィシャルビルド版をpull  
$ sudo docker pull centos  
  1. コンテナーの中に入ってターミナルから中身を書き換える
    -i インタラクティブモード(コンテナの標準入力を有効化), -t ターミナル起動(tty有効化)
$ sudo docker run -i -t centos /bin/bash  

(注)公式最新の”Get started with Docker for Windows”では以下の説明

(コマンドプロンプト)  
C:\Users\user> docker run --interactive --tty ubuntu bash  
  1. コンテナー内部で色々インストールなどをしてもいいが、今回はとりあえずtouchコマンドで適当にファイル作成してexit

  2. 上記によって変更の加えられたコンテナーを別のイメージとしてコミット

$ sudo docker ps -a # 先程変更を加えたコンテナーのID(16進数の12文字)を確認  

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES  
c471ef18ed0f        ubuntu              "/bin/bash"              2 minutes ago       Exited (0) About a minute ago                       zealous_sinoussi  

# 一意なIDとして特定できれば良いのでCONTAINER IDは最初の3文字ほども入力すれば問題ない  
# イメージに付ける名前は慣習としてユーザー名/何を目的としたイメージかわかりやすい名前(変更を加えた部分等)  
$ sudo docker commit c47 itachi/hello  
sha256:3fe9bb25049f591668c12abc7c4a86352a975668e53cfa2f145ececd81962426  

これで変更の加えられたコンテナーがイメージとして生成された


(確認作業)

$ sudo docker images  # 先程コミットしたイメージの存在を確認  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
itachi/hello        latest              3fe9bb25049f        2 minutes ago       69.9MB  

# コンテナー内部に入って先程touchコマンドで適当に作成したファイルが存在するか確認  
$ sudo docker run -i -t itachi/hello /bin/bash  
root@41924ea50ac4:/# ls -al  

この流れでオリジナルアプリを作成し、ミドルウェアごとセットでリモートリポジトリに公開することによってどの環境で誰が実行しても(Dockerがインストールされたマシンである限り)ローカル環境に依存しない同じ環境で実行できる。

利点の1つとして、CentOS + MySQL + Railsアプリ等の組み合わせのそれぞれを1つづつのコンテナーとしてDocker composeを用いて組み合わせることで
「OSやDBを別のものに変えてみる」
「DBやRails,Ruby等のバージョンを変えてみる」

等の環境構築(の使い捨て化)が容易に可能となる。

ここまでの流れざっくりまとめ

  1. OSやミドルウェア等のイメージをダウンロードdocker pull
  2. pullしたイメージを起動しコンテナー内部に入るdocker run
  3. コンテナー内部で加えた変更を別のイメージとして保存docker commit
  4. 生成したイメージをリモートリポジトリにアップするdocker push

この1.~3.の流れをスクリプトとして自動化する為に書くのがDockerfile
それを実行するのがdocker build

次のステップ - Dockerfileの記述とbuild

Dockerfile

# FROM 何のイメージを元にするか  
# 指定のイメージがローカルにない場合は(可能であれば)build時にダウンロードされる  
FROM centos  
# MAINTAINER 誰が書いたか  
MAINTAINER Itachi Shinohara <itachip38@gmail.com>  
# RUN: buildする時に実行される  
RUN echo "now building..."  
# CMD: buildされたイメージからコンテナーを作る(runコマンドを実行する)時に実行される  
# CMD echo "now running..."  
# 上記でも可だが、CMDに関しては下記のように書くのが推奨  
CMD ["echo", "now running..."]  

上記Dockerfileの実行(及びイメージの命名)

$ sudo docker build -t itachi/echo .  

itachi/echoがbuildによって生成されるイメージの名前
最後の.はDockerfileがカレントディレクトリにあることを指定

ビルドが完了すると先程命名したitachi/echoという名前でイメージが生成されている
これを実行(docker run)するとDockerfile中のCMDだけが実行される
(既にbuildが終わっているのでRUN等の中身は関係ない)

$ sudo docker run itachi/echo  
now running...  

現在(Ver1.13以降)は各コマンドとも新コマンド推奨
基本的にdocker xxxdocker container xxx or docker image xxx
他にnetwork, system, volume等もある
volumeの実体は複数のコンテナーから共通してアクセスできるローカルのディレクトリ

※下記の3種類はただcontainer or image が間に挟まるだけでなく一部記述変更
docker ps → docker container ls
docker images → docker image ls
docker rmi → docker image rm

参考(公式は日本語翻訳版)

Docker ドキュメント日本語化プロジェクト
Docker-composeリファレンス
Docker入門

このログへのコメント

コメントはありません