読者です 読者をやめる 読者になる 読者になる

試纏

ためしてまとめる〜色々なトピックやテーマについて試してみたり、まとめてみたりするブログです。

書籍『Ansible実践ガイド』を実践してみた - 第1章 Ansibleの概要

Ansible 読書・実践記録 Python

f:id:shinyaa31:20170116194242p:plain:w200

今朝投稿していた『ゼロから作るDeep Learning』の読書記録と併せて、そういやこっちのテーマも取り組んでおきたいなと思っていたのでした。

それが構成管理ツール『Ansible』です。

ちょうどタイムライン上に絶好の参考書籍の情報が流れていたので、この際なので(交互に)まとめてやっちゃおう!という事でKindle版をポチー。早速第1章に取り組んでみました。当エントリはその読書記録となります。

Ansible実践ガイド (impress top gear)

Ansible実践ガイド (impress top gear)

第1章:Ansibleの概要

  • 公式サイト:Ansible is Simple IT Automation
  • Ansibleは『オペレーション自動化の側面(機能):狭義』としての構成管理を取り扱う(※サービス全体を提供する構成管理プロセス:広義では無い)
  • ビジネスアジリティに於いて求められている要素の1つがDevOpsであり、DevOpsは組織文化の変更を伴うKAIZEN活動である
  • Infrastructure as Code:インフラリソースもアプリ同様、コードを元に自動化しようという仕組み。CI(継続的インテグレーション)のノウハウをインフラにも取り入れた事が最大の特徴、功績。
  • Infrastructure as Codeを実践する事で様々なメリットが得られる。
  • Infrastructure as Codeの対象領域は大きく以下3つ。
    • オーケストレーション(リソース集合体の連携サービスを提供)
    • システムの構成管理
    • ブートストラッピング(OSイメージからの起動設定)
  • Infrastructure as Codeは企業の自動化に対する成熟度と併せて適用すべき範囲を特定していくと良い
  • Ansible
    • Python製の構成管理自動化ツール
    • ChefやPuppet等よりも後発、導入コストはそれらよりも低い。支持も高いものがある。
    • Ansible特徴:
    • 注意点も幾つかある
    • 設計思想:ゴールは『シンプルさと使いやすさ』。従来の構成ツール(ChefやPuppet)は冪等性を主眼に置いている部分もあり、この部分で思想が異なる。
    • Push型アーキテクチャ:ChefやPuppetはPull型
    • Ansibleのユースケース:『オーケストレーション』『システム構成管理』『ブートストラッピング』の多方面で適用可能。

まとめ

という訳で第1章読了。Ansibleが目指すところ、従来のツール(ChefやPuppet等)との比較などがとても分かりやすく解説されていてスムーズに読む事が出来ました。第1章に関しては概要説明に留まっていたのでコード記述は無し。第2章以降(2-2)でインストールが始まるようなので楽しみにしたいと思います。

『ゼロから作るDeep Learning』実践記録 各種環境設定&第1章 Python入門

Python Intellij IDEA Mac 読書・実践記録

f:id:shinyaa31:20170116084551j:plain:w150

最近多方面で評判が良く売れ行きも好調らしい当書籍について自分も読書・実践してみようと思い早速発注、取り組み始めてみました。

Intellij IDEA環境設定

まずは書籍で言及されている実行環境(anaconda 2.1.0)に親しい環境を導入し、Intellij IDEAで利用可能な形に出来るように設定をしてみます。

$ python --version
Python 2.7.10
$ pyenv --version
pyenv 1.0.6
$ pyenv versions
* system (set by /Users/shinyaa31/.pyenv/version)
  3.5.2
$ pyenv install --list | grep anaconda
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
  anaconda-1.6.0
  anaconda-1.6.1
  anaconda-1.7.0
  anaconda-1.8.0
  anaconda-1.9.0
  anaconda-1.9.1
  anaconda-1.9.2
  anaconda-2.0.0
  anaconda-2.0.1
  anaconda-2.1.0
  anaconda-2.2.0
  anaconda-2.3.0
  anaconda-2.4.0
  anaconda-4.0.0
  anaconda2-2.4.0
  anaconda2-2.4.1
  anaconda2-2.5.0
  anaconda2-4.0.0
  anaconda2-4.1.0
  anaconda2-4.1.1
  anaconda2-4.2.0
  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1
  anaconda3-4.2.0
$

書籍ではanaconda 2.1.0と記載があったので近そうなバージョン2.4.0をインストールしてみます。

$ pyenv install anaconda-2.4.0
Downloading Anaconda2-2.4.0-MacOSX-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda2-2.4.0-MacOSX-x86_64.sh
Installing Anaconda2-2.4.0-MacOSX-x86_64...
Installed Anaconda2-2.4.0-MacOSX-x86_64 to /Users/shinyaa31/.pyenv/versions/anaconda-2.4.0

環境切替。

$ pyenv versions
* system (set by /Users/shinyaa31/.pyenv/version)
  3.5.2
  anaconda-2.4.0
$ pyenv global anaconda-2.4.0
$ pyenv rehash
$ python --version
Python 2.7.10 :: Anaconda 2.4.0 (x86_64)

下記エントリの手順に従い、Intellij IDEAで設定を追加。

f:id:shinyaa31:20170113233523p:plain:w500 f:id:shinyaa31:20170113233525p:plain:w500 f:id:shinyaa31:20170113233526p:plain:w700

Intellij IDEA上でanacondaの環境設定が完了しました。

f:id:shinyaa31:20170113233528p:plain:w700

...あれ、でも書籍を見るとPython 3.4.1 | Anaconda 2.1.0という記載になっていますね...導入するバージョン間違えたかな?

Anacondaの公式サイトでPython3.5のMacインストーラのURLを確かめてみると https://repo.continuum.io/archive/Anaconda3-4.2.0-MacOSX-x86_64.pkgとなっています。ってことはpyenvで導入するバージョンも『python3-』とする必要があるっぽいですね。

という事でanaconda3系の現行最新となるanaconda3-4.2.0を導入、

$ pyenv install anaconda3-4.2.0
Downloading Anaconda3-4.2.0-MacOSX-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-4.2.0-MacOSX-x86_64.sh
Installing Anaconda3-4.2.0-MacOSX-x86_64...
Installed Anaconda3-4.2.0-MacOSX-x86_64 to /Users/shinyaa31/.pyenv/versions/anaconda3-4.2.0

$ pyenv versions
  system
  3.5.2
* anaconda-2.4.0 (set by /Users/shinyaa31/.pyenv/version)
  anaconda3-4.2.0
$ pyenv global anaconda3-4.2.0
$ pyenv rehash

インストールされている事を確認。

$ pyenv versions
  system
  3.5.2
  anaconda-2.4.0
* anaconda3-4.2.0 (set by /Users/shinyaa31/.pyenv/version)
$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)
$ 

Intellij IDEAの環境設定も追加し直して、

f:id:shinyaa31:20170115143259p:plain:w600

連携設定完了。

f:id:shinyaa31:20170115143912p:plain:w450

第1章 実践内容

第1章は『Python入門』について。ごく基本的なPythonのお作法・機能に関する部分であったり、ディープラーニングにちなんだライブラリ周り(Numpy及びMatplotlib)に関する触りの部分に言及するに留まったものになっています。特に詰まる所、気になる所等は無かったので本文言及は割愛。

Intellij IDEA&GitHub連携設定

基本的な部分については下記エントリの内容に従いました。『configの修正』までを進めておいて、

メニューの[VCS]→[Import into Version Control]→[Share Project on GItHub]を選択。

f:id:shinyaa31:20170116025837p:plain:w450

プロジェクト名と説明の内容を設定、[Share]押下。

f:id:shinyaa31:20170116025839p:plain:w500

登録内容とコミットメッセージを確認し、[OK]押下。

f:id:shinyaa31:20170116025842p:plain:w450

プロジェクトの登録が完了しました。

f:id:shinyaa31:20170116025845p:plain:w400

GitHubにアクセスしてみます。上記プロジェクトがちゃんと登録出来ています。

f:id:shinyaa31:20170116025846p:plain:w500

まとめ

という訳で、書籍の実践内容というよりIntellij IDEAにおける環境設定周りが主となる内容になってしまいました。必要最低限の環境設定・連携部分はこれで出来たので、引き続き書籍の読書&実践を進めて行こうと思います。

Pythonの実行環境をmacOS Sierra環境で整えつつIntellij IDEAとの連携設定も行う手順のまとめ

Python Intellij IDEA Mac

色々学習したい事を実現する為にPythonの実行環境を整えるのと併せて、折角ならば開発環境としてもちゃんと整備しておきたい、効率的にコーディングしたいという事で手持ちの環境(Intellij IDEA Ultimate Edition)と統合して行こうじゃないか、という事で当エントリの内容を纏めるに至りました。

実現したいこと

  • 新調したMacbook(無印:macOS Sierra)にPythonの実行環境をpyenvとvirtualenvとpyenv-virtualenvで綺麗に揃え、整えたい
  • Python2.7系/Python3.x系/その他各種分析・機械学習用のライブラリを適宜切り替えて使いたい
  • 切り替えた環境をIntellij IDEA(Ultimate Edition)の環境と連動させてIDE上でPythonコードをがしがし書いて行きたい

参考情報

以下の各種エントリを大いに参考にさせて頂きました。ありがとうございます。

実践手順

事前準備・作業前の状況

導入する環境は買ったばかりのMacbook無印 OS:macOS Sierra。 Pythonについては初期状態で下記のバージョンのものが導入されていました。

$ python --version
Python 2.7.10

Gitについても購入時点の環境で下記バージョンのものが導入済の状態。

$ git --version
git version 2.10.1 (Apple Git-78)

以下のコマンドでbrewのアップデートも兼ねてgitをアップグレード。(あ、ちゃんと🍺 マークが表示されてる!)

$ brew update
$ brew upgrade
$ brew install git
==> Downloading https://homebrew.bintray.com/bottles/git-2.11.0.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring git-2.11.0.sierra.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions

zsh functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Summary
🍺  /usr/local/Cellar/git/2.11.0: 1,452 files, 32.4M
$ 

...したつもりでしたがバージョンは変わらずでしたね。

$ git --version
git version 2.10.1 (Apple Git-78)

pyenvとvirtualenvとpyenv-virtualenvのインストール

pyenvのインストール

pyenvのインストール:

$ brew install pyenv
$ pyenv --version
pyenv 1.0.6

切替可能なPythonバージョン一覧の表示:

$ pyenv versions
* system (set by /Users/shinyaa31/.pyenv/version)

導入可能なバージョン一覧の確認:手元の環境では以下一覧が対象となっていました。

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5
  2.5.1
  2.5.2
  2.5.3
  2.5.4
  2.5.5
  2.5.6
  2.6.6
  2.6.7
  2.6.8
  2.6.9
  2.7-dev
  2.7
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  2.7.8
  2.7.9
  2.7.10
  2.7.11
  2.7.12
  2.7.13
  3.0.1
  3.1
  3.1.1
  3.1.2
  3.1.3
  3.1.4
  3.1.5
  3.2-dev
  3.2
  3.2.1
  3.2.2
  3.2.3
  3.2.4
  3.2.5
  3.2.6
  3.3.0
  3.3-dev
  3.3.1
  3.3.2
  3.3.3
  3.3.4
  3.3.5
  3.3.6
  3.4.0
  3.4-dev
  3.4.1
  3.4.2
  3.4.3
  3.4.4
  3.4.5
  3.5.0
  3.5-dev
  3.5.1
  3.5.2
  3.6.0
  3.6-dev
  3.7-dev
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
  anaconda-1.6.0
  anaconda-1.6.1
  anaconda-1.7.0
  anaconda-1.8.0
  anaconda-1.9.0
  anaconda-1.9.1
  anaconda-1.9.2
  anaconda-2.0.0
  anaconda-2.0.1
  anaconda-2.1.0
  anaconda-2.2.0
  anaconda-2.3.0
  anaconda-2.4.0
  anaconda-4.0.0
  anaconda2-2.4.0
  anaconda2-2.4.1
  anaconda2-2.5.0
  anaconda2-4.0.0
  anaconda2-4.1.0
  anaconda2-4.1.1
  anaconda2-4.2.0
  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1
  anaconda3-4.2.0
  ironpython-dev
  ironpython-2.7.4
  ironpython-2.7.5
  ironpython-2.7.6.3
  ironpython-2.7.7
  jython-dev
  jython-2.5.0
  jython-2.5-dev
  jython-2.5.1
  jython-2.5.2
  jython-2.5.3
  jython-2.5.4-rc1
  jython-2.7.0
  jython-2.7.1b1
  jython-2.7.1b2
  jython-2.7.1b3
  miniconda-latest
  miniconda-2.2.2
  miniconda-3.0.0
  miniconda-3.0.4
  miniconda-3.0.5
  miniconda-3.3.0
  miniconda-3.4.2
  miniconda-3.7.0
  miniconda-3.8.3
  miniconda-3.9.1
  miniconda-3.10.1
  miniconda-3.16.0
  miniconda-3.18.3
  miniconda2-latest
  miniconda2-3.18.3
  miniconda2-3.19.0
  miniconda2-4.0.5
  miniconda2-4.1.11
  miniconda3-latest
  miniconda3-2.2.2
  miniconda3-3.0.0
  miniconda3-3.0.4
  miniconda3-3.0.5
  miniconda3-3.3.0
  miniconda3-3.4.2
  miniconda3-3.7.0
  miniconda3-3.8.3
  miniconda3-3.9.1
  miniconda3-3.10.1
  miniconda3-3.16.0
  miniconda3-3.18.3
  miniconda3-3.19.0
  miniconda3-4.0.5
  miniconda3-4.1.11
  pypy-c-jit-latest
  pypy-c-nojit-latest
  pypy-dev
  pypy-stm-2.3
  pypy-portable-2.3.1
  pypy-portable-2.4
  pypy-portable-2.5
  pypy-portable-2.5.1
  pypy-stm-2.5.1
  pypy-portable-2.6
  pypy-portable-2.6.1
  pypy-portable-4.0
  pypy-portable-4.0.1
  pypy-portable-5.0
  pypy-portable-5.0.1
  pypy-portable-5.1
  pypy-portable-5.1.1
  pypy-portable-5.3.1
  pypy-portable-5.4
  pypy-portable-5.4.1
  pypy-portable-5.6.0
  pypy-1.5-src
  pypy-1.5
  pypy-1.6
  pypy-1.7-dev
  pypy-1.7
  pypy-1.8-dev
  pypy-1.8
  pypy-1.9-dev
  pypy-1.9
  pypy-2.0-dev
  pypy-2.0-src
  pypy-2.0
  pypy-2.0.1-src
  pypy-2.0.1
  pypy-2.0.2-src
  pypy-2.0.2
  pypy-2.1-src
  pypy-2.1
  pypy-2.2-src
  pypy-2.2
  pypy-2.2.1-src
  pypy-2.2.1
  pypy-2.3-src
  pypy-2.3
  pypy-2.3.1-src
  pypy-2.3.1
  pypy-2.4.0-src
  pypy-2.4.0
  pypy-2.4-beta1-src
  pypy-2.4-beta1
  pypy-2.5.0-src
  pypy-2.5.0
  pypy-2.5.1-src
  pypy-2.5.1
  pypy-2.6.0-src
  pypy-2.6.0
  pypy-2.6.1-src
  pypy-2.6.1
  pypy-4.0.0-src
  pypy-4.0.0
  pypy-4.0.1-src
  pypy-4.0.1
  pypy-5.0.0-src
  pypy-5.0.0
  pypy-5.0.1-src
  pypy-5.0.1
  pypy-5.1-src
  pypy-5.1
  pypy-5.1.1-src
  pypy-5.1.1
  pypy-5.3-src
  pypy-5.3
  pypy-5.3.1-src
  pypy-5.3.1
  pypy-5.4-src
  pypy-5.4
  pypy-5.4.1-src
  pypy-5.4.1
  pypy-5.6.0-src
  pypy-5.6.0
  pypy2-5.3-src
  pypy2-5.3
  pypy2-5.3.1-src
  pypy2-5.3.1
  pypy2-5.4-src
  pypy2-5.4
  pypy2-5.4.1-src
  pypy2-5.4.1
  pypy2-5.6.0-src
  pypy2-5.6.0
  pypy3-dev
  pypy3-portable-2.3.1
  pypy3-portable-2.4
  pypy3-2.3.1-src
  pypy3-2.3.1
  pypy3-2.4.0-src
  pypy3-2.4.0
  pypy3.3-5.2-alpha1-src
  pypy3.3-5.2-alpha1
  pypy3.3-5.5-alpha-src
  pypy3.3-5.5-alpha
  pypy3.5-c-jit-latest
  pyston-0.5.1
  pyston-0.6.0
  stackless-dev
  stackless-2.7-dev
  stackless-2.7.2
  stackless-2.7.3
  stackless-2.7.4
  stackless-2.7.5
  stackless-2.7.6
  stackless-2.7.7
  stackless-2.7.8
  stackless-2.7.9
  stackless-2.7.10
  stackless-2.7.11
  stackless-2.7.12
  stackless-3.2-dev
  stackless-3.2.2
  stackless-3.2.5
  stackless-3.3-dev
  stackless-3.3.5
  stackless-3.4.1
  stackless-3.4.2

環境切替確認

任意の(導入可能な)Python環境をインストールし、切り替えてみる:あれ?切り替わってないですね...

$ pyenv install 3.5.2
$ pyenv global 3.5.2
$ pyenv rehash
$ python --version
Python 2.7.10

下記エントリに基づいて環境変数設定を行ってみたが状況変わらず。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ source .bash_profile 

下記エントリを参考にevalコマンドを実行したところ、無事解決しました。

$ eval "$(pyenv init -)"
$ python --version
Python 3.5.2

下記エントリの様に以下3行を ~/.bash_profileに追記しておくのが良いようですね。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

改めてバージョン切替を確認。

## 一旦元に戻してみる
$ pyenv global system
$ pyenv rehash
$ pyenv versions
* system (set by /Users/shinyaa31/.pyenv/version)
  3.5.2
$ python --version
Python 2.7.10

## 再度3.5.2に切替
$ pyenv global 3.5.2
$ pyenv rehash
$ python --version
Python 3.5.2

pyenvの利用可能コマンドやpyenvの使い方についてはこの辺りを参考にしておくと良さそうです。個人用リファレンスも兼ねてメモ。

virtualenvで環境を作成、整備

大元のバージョン(system:2.7.10)に一旦戻し、virtualenvをインストール。sudo実行時のオプションとして『-H』を付与しています。

$ pyenv global system
$ pyenv rehash
$ python --version
Python 2.7.10
$ sudo -H pip install virtualenv

ちなみに付与せず実行すると以下のようなアラートメッセージが表示されます。これを出さないようにするための措置としてオプションを付与して実行しています。

The directory '/Users/shinyaa31/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/shinyaa31/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

切り替えた環境の方でも念の為virtualenvを導入しておく。(必要なのかな?)

$ pyenv global 3.5.2
$ pyenv rehash
$ python --version
Python 3.5.2
$ sudo -H pip install --upgrade pip
$ pip -V
pip 9.0.1 from /Users/shinyaa31/.pyenv/versions/3.5.2/lib/python3.5/site-packages (python 3.5)
$ sudo -H pip install virtualenv

上記作成環境をIntellij IDEAで連携

導入する環境としてはIntellij IDEA Ultimate Editionを用いています。

f:id:shinyaa31:20161231043110p:plain:w550

Intellij IDEA Python Pluginのインストール

Intellij IDEAでPythonを扱うにはプラグインが必要です。ですのでまずはそこから。

Intellij IDEA起動後、[Preferences]を選択。

f:id:shinyaa31:20161231044258p:plain:w550

[Plugins]→[Browse Repositories]を選択。

f:id:shinyaa31:20161231044301p:plain:w550

そのものズバリ[Python]というものがありますのでこれをインストール。インストールが終わるとIntellij IDEAの再起動を促されますので従います。

f:id:shinyaa31:20161231044305p:plain:w550

Intellij IDEA pyenv連携設定

pyenvを使って任意のバージョンを導入すると、以下の様な形で個別にバージョン毎のフォルダ及び構成が作成されます。Intellij IDEAの設定ではこのパスを読み込ませる事で個別の環境設定を踏まえたPythonプロジェクトを作成する事が可能です。ここでは /Users/shinyaa31/.pyenv/versions/3.5.2/bin/python3.5 のパス情報を設定する形で進めたいと思います。

$ pwd
/Users/shinyaa31/.pyenv/versions/3.5.2/bin
$ ls
2to3            idle            pip3            pydoc3.5        python3-config      python3.5m-config
2to3-3.5        idle3           pip3.5          python          python3.5       pyvenv
easy_install        idle3.5         pydoc           python-config       python3.5-config    pyvenv-3.5
easy_install-3.5    pip         pydoc3          python3         python3.5m      virtualenv

Intellij IDEAを起動、Pythonプロジェクトを作成。ここではデフォルトで選択可能なPython SDKを選ぶ形で一時的にプロジェクトを作成して行きます。

f:id:shinyaa31:20161231053923p:plain:w500

プロジェクト作成後、[File]→[Project Structure]を選択。

f:id:shinyaa31:20161231053955p:plain:w350

[Project SDK]から[New]→[Python SDK]を選択。

f:id:shinyaa31:20161231054111p:plain:w600

次いで[Add Local]を選択。

f:id:shinyaa31:20161231054311p:plain:w500

パス指定を求められますので上記指定のパスをここで設定します。ですがこの部分、macOSの[Open]のUIだと隠しフォルダの指定が出来ない模様。なので下記エントリの小技を用いつつ、上記指定パス(の上位フォルダ)を貼り付け。

f:id:shinyaa31:20161231054440p:plain:w500

対象としたいパスのファイルを指定します。

f:id:shinyaa31:20161231054713p:plain:w500

pyenvで導入した新たなPythonバージョンの環境をSDKに追加する事が出来ました! f:id:shinyaa31:20161231054920p:plain:w500

ちゃんと導入したバージョンでプログラムが動くかを試してみたいと思います。問題無さそうですね。

f:id:shinyaa31:20161231055032p:plain:w650

まとめ

という訳で諸々の環境設定、連動設定を行ってみた訳ですが、virtualenvはIntellij IDEA連携に必要無かったですね...。

ひとまずこれでPython系の開発環境をIntellij IDEAで整える方法は分かってきたので、適宜必要な環境を作成・管理して行こうと思います。

Docker for Macインストール&入門実践記録

Docker

当エントリは下記"学習記録まとめ"に引き続いての入門記事実践記録のまとめエントリとなります。内容的には被る部分が大半でしたが、Mac上でスムーズに作業が行えるのはやはり便利ですし魅力的ですね。

参考にしたページは以下の内容となります。

Docker for Mac導入に際してのシステム要件:

Docker for Macを利用する際は環境的に以下の条件を満たしている必要があるようです。

  • Macのモデルが2010もしくはそれより新しいものであること。
  • macOSのバージョンが10.10.3(Yosemite)もしくはそれより新しいものであること。
  • 最低4GBのRAM。
  • VirtualBoxのバージョンが4.3.30以上であること。

これらの要件を満たしていない場合、別の手段として『Docker Toolbox』を使って環境を導入する事が可能となっているようです。当エントリでは『Docker for Mac』を使った環境設定を進める為Toolboxの手順については割愛します。

Docker for Mac インストール手順

手順は下記ドキュメントに纏められていますので、手順に従い作業を進めて行きます。

Step1.Docker for Macのインストール及び実行

インストーラを公式サイトより入手します。下記サイトの『Download Docker for Mac』の項より、"Stable channel"下の[Get Docker for Mac [stable]]を押下、インストーラをダウンロード。

f:id:shinyaa31:20170108111157p:plain:w700

ダウンロード完了後に起動。Docker.appをApplicationフォルダ配下にドラッグアンドドロップし、

f:id:shinyaa31:20170108110811p:plain:w450

Applicationフォルダ配下のDocker.appをダブルクリックして起動させます。

f:id:shinyaa31:20170108110815p:plain:w700

ウェルカムメッセージの表示。[Next]押下。

f:id:shinyaa31:20170108110817p:plain:w450

Dockerを実行するには権限が必要な旨メッセージが表示されます。この後OSのユーザーパスワードを求められるので手順に従い入力して先に進めます。

f:id:shinyaa31:20170108110819p:plain:w450

Dockerの起動を示すダイアログが表示されました。[Got it!]押下。

f:id:shinyaa31:20170108110821p:plain:w300

メニューバーのクジラアイコンを展開、[About Docker]を選択してみます。

f:id:shinyaa31:20170108110824p:plain:w300

Dockerのバージョンが表示されました。2017/01/08時点でのバージョンは1.12.5となっている様です。

f:id:shinyaa31:20170108110826p:plain:w450

Step2.導入済みDocker構成要素の各種バージョンを確認

Docker Engine, Compose, and Machineのバージョンをdocker --versionコマンドでそれぞれ確認してみます。Engine, Compose, Machineそれぞれについては以下ドキュメントを参照。

$ docker --version
Docker version 1.12.5, build 7392c3b

$ docker-compose --version
docker-compose version 1.9.0, build 2585387

$ docker-machine --version
docker-machine version 0.8.2, build e18a919 

ちなみに指定無しだとこのような形でClient/Server双方のバージョン情報が表示されます。

$ docker version
Client:
 Version:      1.12.5
 API version:  1.24
 Go version:   go1.6.4
 Git commit:   7392c3b
 Built:        Fri Dec 16 06:14:34 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.5
 API version:  1.24
 Go version:   go1.6.4
 Git commit:   7392c3b
 Built:        Fri Dec 16 06:14:34 2016
 OS/Arch:      linux/amd64

Step3.アプリケーションの探索とサンプルの実行

コマンドラインターミナルを開き、Dockerが期待通りの挙動を示すかどうか確認してみます。docker versionコマンドでDockerのインストール自体の確認は行えたので、以降ではdocker psdocker runを使ってDockerが起動するかどうかを試してみます。

docker runコマンドを用い、以下の形で処理実行。起動したばかりで手元にimageは存在していませんが、docker runコマンド実行時に対象イメージがローカルにない場合、イメージの取得(docker pull)も併せて行ってくれるようです。

$ docker run -d -p 80:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx

75a822cd7888: Pull complete 
0aefb9dc4a57: Pull complete 
046e44ee6057: Pull complete 
Digest: sha256:fab482910aae9630c93bd24fc6fcecb9f9f792c24a8974f5e46d8ad625ac2357
Status: Downloaded newer image for nginx:latest
5b3132df3096a61dbe70184afb3e1c5a38e0998e4dffaa51ed93a1af6c5a3c43

docker psコマンドで稼働中のコンテナを表示出来ます。上記で実行したものが稼働している様です。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
5b3132df3096        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp, 443/tcp   webserver
$ 

この設定では、nginxによりWebサーバがポート:80で稼働する様になっています。[http://localhost/]のURLでアクセスするとブラウザ上にnginxのWelcomeページが表示されました。コンテナの稼働についても問題無さそうです。

f:id:shinyaa31:20170108112308p:plain:w600

確認が取れたので、稼働中のコンテナとイメージを停止・削除します。

ユーザーがコンテナを停止または削除するまで、上記のnginxによるWebサーバーはコンテナ上で指定のポートにて稼働し続けます。

Webサーバを止めたい場合はdocker stop webserverを実行します。再び起動させたい場合はdocker start webserverを実行します。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
5b3132df3096        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp, 443/tcp   webserver
$ docker stop webserver
webserver

稼働を止めたコンテナはdocker psでは表示されなくなります(稼働中のコンテナのみ表示させるコマンドのため)。停止しているものも含めた全てのコンテナを表示するにはdocker ps -aとオプションを付与してdocker psコマンドを実行します。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
5b3132df3096        nginx               "nginx -g 'daemon off"   6 minutes ago       Exited (0) 5 seconds ago                       webserver

上記稼働中のコンテナの停止&削除を1回で行う場合はdocker rm -f webserverで対応可能です。このコマンドを実行するとコンテナは削除されますが、イメージは残ります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
5b3132df3096        nginx               "nginx -g 'daemon off"   6 hours ago         Up 4 seconds        0.0.0.0:80->80/tcp, 443/tcp   webserver

$ docker rm -f webserver
webserver

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              01f818af747d        11 days ago         181.6 MB

取得済みイメージの一覧はdocker imagesで確認出来ます。また、不要になったイメージの削除はdocker rmiで行えます。イメージIDもしくはイメージ名を指定する事で削除する形となります。今回の例で言えばdocker rmi nginxを実行する事でイメージの削除を行う形となります。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              01f818af747d        11 days ago         181.6 MB
$ docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:fab482910aae9630c93bd24fc6fcecb9f9f792c24a8974f5e46d8ad625ac2357
Deleted: sha256:01f818af747d88b4ebca7cdabd0c581e406e0e790be72678d257735fad84a15f
Deleted: sha256:473ebc9bec6f78c39877b6655ff7c464271d36464442ed27b10be957201e364a
Deleted: sha256:1802fbcbaa5e7496944e22a9fd0cb72051515a66e382b7148cf4098a92571221
Deleted: sha256:b6ca02dfe5e62c58dacb1dec16eb42ed35761c15562485f9da9364bb7c90b9b3
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

まとめ

以上の内容で『Get started with Docker for Mac』の手順は終了となります。ドットインストールで実践していた内容の振り返りという感じですね。何の違和感も無く手順を進める事が出来ました。

Docker for Macで紹介されている参考情報・学習のための情報源としては以下のものが挙げられています。日本語ドキュメントとして既に展開されているものがありますので、『例で学ぶ』の部分などはそのまま読み進めながら実践して行く事で一通りの基本的な部分は把握して行く事が出来そうです。

AWS Batchに興味アリ→AWS Batchってコンテナ使えるらしいぞ、から2つのエントリを経てDockerに入門してみた訳ですけれども、これでDockerではどういう事が出来るのか、という部分について雰囲気を掴む事が出来ました。

Dockerの効果的な使い方は?どういうユースケースで使うのが良いのか?という部分が次に気になる所ではあります。公式サイトに以下『Use Cases』というページがあり、CI/CD, DevOps, Infrastructure Optimizationと3つのケースが挙げられています。この辺りはなるほど確かにそうだよねという思いですが、AWS Batchで使う時の様なバッチ処理、またはビッグデータ周りの部分でDockerコンテナ(Amazon ECR含めて)技術をどういう風に活用して行くのが良いのかなという部分についてはまだしっくり来ていない部分もあったりします。今後はこの辺り情報収集して行ければと思っております。

ドットインストール『Docker入門』学習記録まとめ

Docker

当エントリはDockerの基本中の基本を学ぶ為、『ドットインストール』で紹介されている講座の1つである『Docker入門』の全11回の内容について学習・実践してみた内容となっています。まず初めに『Dockerとは何ぞや?』というところから把握するにはこの辺りから始めるのが良さそうと思いまして、現時点の状況でこの講座学習を進めて行った際の手順等を学習記録として残しておこうと思います。

前提・背景

  • 元々はAWS Batchについての興味関心からでした。
  • AWS Batchではコンテナイメージを使って処理を実行させる事も可能になっています。
  • 個人的にはDockerを含めたコンテナ技術周りには疎かった為、これを機に本格的に取り組んでみようと思った次第です。
  • 当講座ではUbuntuをOSとして用意し、その中にVagrantを準備しDockerをインストールするという手順で進めています。
  • 今回実践している環境はMac(OS:Sierra)。なのでMac上にVargantとVirtual Boxを導入し、仮想環境としてUbuntuを用意する方向で進めます。
  • なお、2017年現在では『Docker on Mac』なるものも出て来ており、最初からこっち使えば良いじゃんという気もするが、Dockerの使い方を学ぶという事でまずは手始めにドットインストールの手順に従ってみたいと思います。
  • Docker on Macのページにも学習用のチュートリアルが存在するが、こちらはドットインストール『Docker入門』終了後に試す方向で。

学習記録

#01 Dockerとはなにか?

講座#01では以下の内容について言及しています。

  • Dockerについての非常に簡潔な紹介。
  • 必要な知識や作業を進める環境に関する説明。

#02 Ubuntuを用意しよう

講座#02では以下の内容について言及しています。

  • Ubuntu環境の用意と接続確認

#02 実践内容

Vagrant by HashiCorpにアクセスし、Vargantのインストーラを入手。バージョンは1.9.1(vagrant_1.9.1.dmg)。入手後に起動&インストール作業実施。

f:id:shinyaa31:20170107022324p:plain:w500

バージョン確認及びヘルプメニュー確認。

$ vagrant help
(ヘルプ内容が表示されている事を確認)
$ vagrant --version
Vagrant 1.9.1

下記サイトにアクセスし、必要となるUbuntu環境のVargantの標準テンプレート(base boxesと呼ぶらしい)のURLを入手。ドットインストールでは14.04を用いていたがここではせっかくなので新しめのUbuntu16.04のものを使うことにしてみます。

以下のものだと新しめ且つDockerが有効となっているのでちょうど良さそうです。

Ubuntu 16.04 with Docker enabled (based on amd64 server iso file)
https://github.com/jose-lpa/packer-ubuntu_lts/releases/download/v3.1/ubuntu-16.04.box

vagrant box addでboxを追加。

$ vagrant box add ubuntu1604_docker_enabled https://github.com/jose-lpa/packer-ubuntu_lts/releases/download/v3.1/ubuntu-16.04.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu1604_docker_enabled' (v0) for provider: 
    box: Downloading: https://github.com/jose-lpa/packer-ubuntu_lts/releases/download/v3.1/ubuntu-16.04.box
==> box: Successfully added box 'ubuntu1604_docker_enabled' (v0) for 'virtualbox'!

専用のディレクトリを設け、そこで初期化を実施。併せて環境のIPアドレス設定も行います。

$ pwd
/Users/shinyaa31/Vagrant
$ mkdir Vagrant
$ cd Vagrant/
$ mkdir Docker
$ cd Docker/
$ vagrant init ubuntu1604_docker_enabled
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$ ls
Vagrantfile
$ vi Vagrantfile
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "private_network", ip: "192.168.11.22"

環境Up。何か怒られた。この時はVirtual Boxが当該環境では必要となる事を把握しておりませんでした。

$ vagrant up
:
Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.
:
The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

という事でVirtual Boxをインストール。

f:id:shinyaa31:20170107023616p:plain:w600

インストール完了後、環境作成は行わずそのままで。

f:id:shinyaa31:20170107023655p:plain:w600

vagrant up再実行。まだ怒られます。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu1604_docker_enabled'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: Docker_default_1483374501136_97041
==> default: Clearing any previously set network interfaces...
The specified host network collides with a non-hostonly network!
This will cause your specified IP to be inaccessible. Please change
the IP or name of your host only network so that it no longer matches that of
a bridged or non-hostonly network.
$ 

エラーメッセージを調べてみると、IPアドレスの設定がおかしいらしい。確かに衝突するIPアドレスを設定していました。設定ファイルを衝突しないIPアドレス体系のものに変更します。

  # config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "private_network", ip: "192.168.99.88"

再々実行。しかし以下のメッセージが延々出続けています。

    default: Warning: Remote connection disconnect. Retrying...

どうやらこの辺が怪しいらしいぞ。試してみますかね...

...と思ったら何か上手いこと終わってた。アレ?バージョンが新しくなって改善されたのかな。それとも一定時間掛かるものなのかこれは。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/shinyaa31/Vagrant/Docker
$ 

vagrant sshでログインを試みます。ログイン出来ました!以下の様な構成及びストレージ容量の環境となっている様です。

$ vagrant ssh
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-57-generic x86_64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
vagrant@ubuntu:~$ 
vagrant@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            480M     0  480M   0% /dev
tmpfs           100M  1.8M   98M   2% /run
/dev/sda3        18G  1.5G   16G   9% /
tmpfs           497M     0  497M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           497M     0  497M   0% /sys/fs/cgroup
/dev/sda1       180M   91M   76M  55% /boot
vagrant         465G   40G  426G   9% /vagrant
vagrant@ubuntu:~$ 

VirtualBox上でも以下の様な形で構成を確認する事が出来ています。

f:id:shinyaa31:20170107024856p:plain:w700

#03 Dockerをインストールしよう

講座#03では以下の内容について言及しています。

  • 構築したVagrantの環境にDockerをapt-getコマンドにてインストール。

#03 実践内容

講座では下記のコマンドで群でインストールと設定を行っていますが、

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

今回用意した環境では既にDockerが有効となっている為、上記コマンドを実行せずとも既に導入がなされています。バージョン確認のコマンドによるとv1.12.5が入っているようです。

vagrant@ubuntu:~$ sudo docker --version
Docker version 1.12.5, build 7392c3b

#04 作業の流れと用語を理解しよう

講座#04では以下の内容について言及しています。

  • Dockerの用語解説、流れをイメージにて説明

#04 実践内容

基本的なDockerのコマンドについて把握。

  • docker pull :Docker Hubレジストリにある構築済みイメージの取得 (詳細)
  • docker commit:コンテナのファイル変更や設定を、新しいイメージに収容 (詳細)
  • docker run:指定されたイメージ上に書き込み可能なコンテナ・レイヤを作成&開始 (詳細)
  • docker push:イメージを Docker Hub レジストリや、自分で作成したレジストリで共有 (詳細)

以上コマンドを活用する事で、作成した環境を別の環境で活用する事が可能となります。(docker indexから docker pull & docker run)

#05 Imageを操作してみよう

講座#05では以下の内容について言及しています。

  • 引き続きdockerコマンド各種についての紹介。Dockerコンテナ内部でのコマンドについて解説。

#05 実践内容

講座で紹介されていた https://index.docker.io は現時点では下記URLのDocker Hubにリダイレクトするようになっています。

f:id:shinyaa31:20170107170639p:plain:w600

docker search ( Docker Hub上のイメージを検索 )
vagrant@ubuntu:~$ sudo docker search centos
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                 The official build of CentOS.                   2981      [OK]       
jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8...   54                   [OK]
nimmis/java-centos                     This is docker images of CentOS 7 with dif...   20                   [OK]
consol/centos-xfce-vnc                 Centos container with "headless" VNC sessi...   17                   [OK]
million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   12                   [OK]
torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]
egyptianbman/docker-centos-nginx-php   A simple and highly configurable docker co...   6                    [OK]
nathonfowlie/centos-jre                Latest CentOS image with the JRE pre-insta...   5                    [OK]
centos/mariadb55-centos7                                                               3                    [OK]
centos/tools                           Docker image that has systems administrati...   2                    [OK]
harisekhon/centos-java                 Java on CentOS (OpenJDK, tags jre/jdk7-8)       2                    [OK]
harisekhon/centos-scala                Scala + CentOS (OpenJDK tags 2.10-jre7 - 2...   1                    [OK]
centos/redis                           Redis built for CentOS                          1                    [OK]
blacklabelops/centos                   CentOS Base Image! Built and Updates Daily!     1                    [OK]
darksheer/centos                       Base Centos Image -- Updated hourly             1                    [OK]
timhughes/centos                       Centos with systemd installed and running       1                    [OK]
repositoryjp/centos                    Docker Image for CentOS.                        0                    [OK]
wenjianzhou/centos                     centos                                          0                    [OK]
januswel/centos                        yum update-ed CentOS image                      0                    [OK]
vcatechnology/centos                   A CentOS Image which is updated daily           0                    [OK]
grayzone/centos                        auto build for centos.                          0                    [OK]
ustclug/centos                          USTC centos                                    0                    [OK]
grossws/centos                         CentOS 6 and 7 base images with gosu and l...   0                    [OK]
smartentry/centos                      centos with smartentry                          0                    [OK]
kz8s/centos                            Official CentOS plus epel-release               0                    [OK]
vagrant@ubuntu:~$ 
docker pull (イメージの取得)
$ sudo docker pull centos
Using default tag: latest
latest: Pulling from library/centos
45a2e645736c: Pull complete 
Digest: sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799
Status: Downloaded newer image for centos:latest
$
docker images (取得済みイメージ一覧の確認)
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              67591570dd29        3 weeks ago         191.8 MB
docker inspect (取得イメージの詳細内容確認)
vagrant@ubuntu:~$ sudo docker inspect centos:latest
[
    {
        "Id": "sha256:67591570dd29de0e124ee89d50458b098dbd83b12d73e5fdaf8b4dcbd4ea50f8",
        "RepoTags": [
            "centos:latest"
        ],
        "RepoDigests": [
            "centos@sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2016-12-15T18:21:23.875991987Z",
        "Container": "779bf0c18c57d46c6388f6170e5460248b71e6e2f4401e7344e4cb1da8138251",
        "ContainerConfig": {
            "Hostname": "1b0d6163fdc2",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:e48874078389760e563a915f3f1fd8cc0cd1c476d6536e6d692ba7a79120d913",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "build-date": "20161214",
                "license": "GPLv2",
                "name": "CentOS Base Image",
                "vendor": "CentOS"
            }
        },
        "DockerVersion": "1.12.1",
        "Author": "https://github.com/CentOS/sig-cloud-instance-images",
        "Config": {
            "Hostname": "1b0d6163fdc2",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:e48874078389760e563a915f3f1fd8cc0cd1c476d6536e6d692ba7a79120d913",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "build-date": "20161214",
                "license": "GPLv2",
                "name": "CentOS Base Image",
                "vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 191846488,
        "VirtualSize": 191846488,
        "GraphDriver": {
            "Name": "aufs",
            "Data": null
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:34e7b85d83e48a22bd5dfa2b6b9ee9565b7ef672f09b3d2409c61635f9bca4db"
            ]
        }
    }
]
vagrant@ubuntu:~$ 
docker rmi (取得イメージの削除)
vagrant@ubuntu:~$ sudo docker rmi centos     
Untagged: centos:latest
Untagged: centos@sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799
Deleted: sha256:67591570dd29de0e124ee89d50458b098dbd83b12d73e5fdaf8b4dcbd4ea50f8
Deleted: sha256:34e7b85d83e48a22bd5dfa2b6b9ee9565b7ef672f09b3d2409c61635f9bca4db
vagrant@ubuntu:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

#06 Containerを操作してみよう

講座#06では以下の内容について言及しています。

  • Dockerコンテナ内部でのコマンドについて解説。の続き。

#06 実践内容

上記で削除してしまったコンテナを再取得。

vagrant@ubuntu:~$ sudo docker pull centos
Using default tag: latest
latest: Pulling from library/centos
45a2e645736c: Pull complete 
Digest: sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799
Status: Downloaded newer image for centos:latest
vagrant@ubuntu:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              67591570dd29        3 weeks ago         191.8 MB
vagrant@ubuntu:~$ 

dockerコンテナの実行と実行結果の確認、コンテナの削除まで。

docker run(コンテナの実行)
  • docker run:コンテナの実行 (詳細)
vagrant@ubuntu:~$ sudo docker run centos:latest echo "hello docker world"
hello docker world
docker ps(実行中コンテナの表示)
  • docker ps:実行中コンテナの表示 (詳細)
    • -a オプションを付けると"全てのコンテナを表示"可能。
vagrant@ubuntu:~$ sudo docker ps   
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
vagrant@ubuntu:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
fcd1cc2ec388        centos:latest       "echo 'hello docker w"   2 minutes ago       Exited (0) 2 minutes ago                       evil_euler
docker rm(コンテナの削除)
  • docker rm:コンテナの削除 (詳細)
vagrant@ubuntu:~$ sudo docker rm fcd
fcd
vagrant@ubuntu:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
vagrant@ubuntu:~$ 

#07 実行中のContainerを操作しよう

講座#07では以下の内容について言及しています。

  • 実行中のコンテナ内での各種操作

#07 実践内容

バックグラウンドで実行(-dオプションを付与)

以下の形で-dオプションを付与するとバックグラウンドで実行が可能となる。

vagrant@ubuntu:~$ sudo docker run -d centos free -s 3
4be1ef225fb7fb56b874e66abb7db2490c5a3a44d6f49524cfa8c3541c4ae55c
vagrant@ubuntu:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4be1ef225fb7        centos              "free -s 3"         27 seconds ago      Up 26 seconds                           kickass_minsky
ログ内容の確認
vagrant@ubuntu:~$ sudo docker logs 4be
              total        used        free      shared  buff/cache   available
Mem:        1016164       61344      514496        3532      440324      794156
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        1016164       53748      522072        3528      440344      801772
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        1016164       53748      522072        3528      440344      801772
Swap:             0           0           0
:
:
docker attach(実行中のコンテナにアタッチ)
vagrant@ubuntu:~$ sudo docker attach --sig-proxy=false 4be
              total        used        free      shared  buff/cache   available
Mem:        1016164       57672      517976        3528      440516      797840
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        1016164       57688      517960        3528      440516      797824
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        1016164       57680      517960        3528      440524      797824
Swap:             0           0           0
^C
docker stop/docker kill(実行中のコンテナを停止)
vagrant@ubuntu:~$ sudo docker kill 4be
4be
vagrant@ubuntu:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
vagrant@ubuntu:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
4be1ef225fb7        centos              "free -s 3"         2 minutes ago       Exited (137) 11 seconds ago                       kickass_minsky
docker start(コンテナを起動)
vagrant@ubuntu:~$ sudo docker start 4be
4be
vagrant@ubuntu:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4be1ef225fb7        centos              "free -s 3"         2 minutes ago       Up 2 seconds                            kickass_minsky
vagrant@ubuntu:~$ 

#08 ContainerからImageを作ってみよう

講座#08では以下の内容について言及しています。

  • 実行中のコンテナ内でイメージ作成

#08 実践内容

docker runでは、以下のオプションを付けて実行する事が可能となっている。

シンプルな検証としてテキストファイルを配置。

vagrant@ubuntu:~$ sudo docker run -i -t centos /bin/bash
[root@de44ce5f623f /]# touch hello-docker.txt
[root@de44ce5f623f /]# ls
anaconda-post.log  etc               lib         media  proc  sbin  tmp
bin                hello-docker.txt  lib64       mnt    root  srv   usr
dev                home              lost+found  opt    run   sys   var
[root@de44ce5f623f /]# exit
exit
vagrant@ubuntu:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
de44ce5f623f        centos              "/bin/bash"         About a minute ago   Exited (0) 25 seconds ago                       amazing_bose
vagrant@ubuntu:~$ 
docker commit(コンテナのコミット)

イメージの名称付けには『ユーザー名/任意名称』という慣習があるとの事。これに倣って『shinyaa31/hello』と付けてみる。

vagrant@ubuntu:~$ sudo docker commit de4 shinyaa31/hello
sha256:6af22b4e847281ee5a44cb3e47789bdab366e9fb6090bfb045fbc62f864de939

作成完了。別のイメージが出来ている。

vagrant@ubuntu:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
shinyaa31/hello     latest              6af22b4e8472        15 seconds ago      191.8 MB
centos              latest              67591570dd29        3 weeks ago         191.8 MB

上記と同様の形でdocker起動、中身を確認。作成したテキストファイルが存在している(イメージの共有・連携が出来ている)事が確認出来た。

vagrant@ubuntu:~$ sudo docker run -i -t shinyaa31/hello /bin/bash
[root@a359357e7ecf /]# ls
anaconda-post.log  dev  hello-docker.txt  lib    lost+found  mnt  proc  run   srv  tmp  var
bin                etc  home              lib64  media       opt  root  sbin  sys  usr
[root@a359357e7ecf /]#

#09 実行中のContainerを操作しよう

講座#09では以下の内容について言及しています。

  • Dockerfileの作成と動作確認

#09 実践内容

『Dockerfile』というファイルを用意してdocker buildコマンドを利用する事で新しいイメージを効率的に作成する事が可能。

Dockerfileを作成。

vagrant@ubuntu:~$ pwd
/home/vagrant
vagrant@ubuntu:~$ vi Dockerfile
FROM centos
MAINTAINER shinyaa31 <shinyaa31@gmail.com>
# RUN: done when building.
RUN echo "Now Building..."
# CMD: done when runnning.
# CMD echo "Now Running..."
# Recommended style is below.
CMD ["echo","Now Running..."]
docker build(パスにあるソースコードから新しいイメージを構築)

ファイルを使って任意のイメージ名を指定し、build実行。カレントディレクトリのファイルを指定する為に最後にドット(.)を付与しています。途中、『Now Building...』というメッセージがecho文によって出力されている事が確認出来ます。

vagrant@ubuntu:~$ sudo docker build -t shinyaa31/echo .
Sending build context to Docker daemon 27.65 kB
Step 1 : FROM centos
 ---> 67591570dd29
Step 2 : MAINTAINER shinyaa31 <shinyaa31@gmail.com>
 ---> Running in 7dd71697ec2a
 ---> 5db08ac066fb
Removing intermediate container 7dd71697ec2a
Step 3 : RUN echo "Now Building..."
 ---> Running in 7f3fc58765ee
Now Building...
 ---> 013e85372869
Removing intermediate container 7f3fc58765ee
Step 4 : CMD echo Now Running...
 ---> Running in dcb4d2bd3b56
 ---> d9613c6c7a69
Removing intermediate container dcb4d2bd3b56
Successfully built d9613c6c7a69
vagrant@ubuntu:~$ 

イメージの存在及び実行の確認。

vagrant@ubuntu:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
shinyaa31/echo      latest              d9613c6c7a69        47 seconds ago      191.8 MB
shinyaa31/hello     latest              6af22b4e8472        33 minutes ago      191.8 MB
centos              latest              67591570dd29        3 weeks ago         191.8 MB
vagrant@ubuntu:~$ sudo docker run shinyaa31/echo
Now Running...
vagrant@ubuntu:~$ 

#10 Webサーバーを立ち上げてみよう

講座#10では以下の内容について言及しています。

  • Webサーバ(httpd)をインストールしたDockerイメージを構築し、実行

#10 実践内容

httpdをインストールし、設定を行うコマンドなどを踏まえた設定ファイルを作成。出来る事の一覧は公式リファレンスを参照。

FROM centos
MAINTAINER shinyaa31 <shinyaa31@gmail.com>
# RUN: done when building.
# RUN echo "Now Building..."
# CMD: done when runnning.
# CMD echo "Now Running..."
# Recommended style is below.
# CMD ["echo","Now Running..."]
RUN yum install -y httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

追加するHTMLファイルも以下のように作成。

vagrant@ubuntu:~$ vi index.html 
<html>
Hello Docker World!!
</html>

build実行。途中Warningが出たりしているがひとまず完遂はした模様。

vagrant@ubuntu:~$ sudo docker build -t shinyaa31/httpd .
Sending build context to Docker daemon 29.18 kB
Step 1 : FROM centos
 ---> 67591570dd29
Step 2 : MAINTAINER shinyaa31 <shinyaa31@gmail.com>
 ---> Using cache
 ---> 5db08ac066fb
Step 3 : RUN yum install -y httpd
 ---> Running in 9b8b2e1727b5
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-45.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-45.el7.centos for package: httpd-2.4.6-45.el7.centos.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-45.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-45.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-45.el7.centos.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-45.el7.centos.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-45.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution
:
:
:
Installed:
  httpd.x86_64 0:2.4.6-45.el7.centos
 
Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7
  apr-util.x86_64 0:1.5.2-6.el7
  centos-logos.noarch 0:70.0.6-3.el7.centos
  httpd-tools.x86_64 0:2.4.6-45.el7.centos
  mailcap.noarch 0:2.1.41-2.el7
 
Complete!
 ---> 919d07db48dd
Removing intermediate container 9b8b2e1727b5
Step 4 : ADD ./index.html /var/www/html/
 ---> c0dac01be111
Removing intermediate container 8fd322aa0156
Step 5 : EXPOSE 80
 ---> Running in 2d70733b770f
 ---> 335f7edd01f3
Removing intermediate container 2d70733b770f
Step 6 : CMD /usr/sbin/httpd -D FOREGROUND
 ---> Running in 4110ad3786fc
 ---> 0eeca56b99b2
Removing intermediate container 4110ad3786fc
Successfully built 0eeca56b99b2

Docker起動。起動時のオプションでポート転送も行っている。

vagrant@ubuntu:~$ sudo docker run -p 8080:80 -d shinyaa31/httpd
dee11d34434495643176dd5d5c20677ec8c6e8887151b906502545e6c340ed1c

Vagrant起動時に設定したホストIP+上記docker起動で指定したポート番号でアクセス。

f:id:shinyaa31:20170108013911p:plain:w500

#11 実行中のContainerを操作しよう

講座#11では以下の内容について言及しています。

  • 作成したをDockerHubに登録

#11 実践記録

DockerHubへのXXの登録を行うにはDockerHubへのユーザー登録を事前に済ませておく必要があります。サイトからユーザー登録を行い、ログイン確認まで済ませておきます。

f:id:shinyaa31:20170108035617p:plain:w600

ログインの確認まで出来たらコンソールからもログインを確認。

vagrant@ubuntu:~$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. 
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: shinyaa31
Password: 
Login Succeeded
vagrant@ubuntu:~$ 

docker pushコマンド実行、DockerHubへの登録を行います。

vagrant@ubuntu:~$ sudo docker push shinyaa31/httpd
The push refers to a repository [docker.io/shinyaa31/httpd]
260e0a0e85af: Pushed 
4239a8fe2e8d: Pushed 
34e7b85d83e4: Mounted from library/centos 
latest: digest: sha256:f8ed1ec3bc5488fe34245bca3c8f931f5c5a6db737ea56e9392ea63de89f33e2 size: 948

DockerHubにアクセスし、登録した内容を確認出来ました。

f:id:shinyaa31:20170108040842p:plain:w600

まとめ

以上でドットインストール『Docker入門』全11回の講座学習完了です。Docker自体は今回触るのが初めてでしたが、動画で非常に分かりやすく解説がなされており非常にスムーズに学ぶ事が出来ました。動画を眺めているだけでもトータル30分程度なので取っ掛かりの学習として選択するにはちょうど良いコンテンツだと思います。ざっくりDockerについて学ぶ事が出来たので次はDocker for Macやその他入門解説エントリ等を読み進めて理解を深めて行きたいと思います。

参考情報

USB-C/HDMI/USB/LAN/SDカード接続をまとめて対応出来るオールマイティなUSBドック『ALMIGHTY DOCK C1』が評判通り素晴らしいのでオススメな件

Mac

個人用Macbook(無印)を購入するにあたり懸案の1つでもあった『アクセサリー類』問題。Macbook無印の場合、USB-Cの接続口が1つしか無いために通常であればタコ足配線的に各種コード類を接続しないとならない為、見た目的には決して綺麗なものではありませんでした。

...というのをSNSで書いたところ『こういうモノがあるらしい』という情報を頂き、物は試しで購入してみる事に。それがこの『ALMIGHTY DOCK C1』です。

f:id:shinyaa31:20170108090113p:plain:w700

名前の通り、あらゆる接続口を1つに集約したこのアクセサリー。やはり同じ悩みからこの商品に目を付けておられる方も非常に多く、現在その多くが品切れで次回入荷待ちの状態。私もAmazon経由で入荷待ち状態ながらも発注していたところ、キャンセル待ちの状態になり当初の予定より早く手元に届く事になりました。

届いたブツがこちらになります。

f:id:shinyaa31:20170108061735p:plain:w300

ALMIGHTY DOCK C1使用前の状態:

ALMIGHTY DOCK C1を使用する前の状態が以下になります。まずMacbook本体にUSB-C Digital AV Multiportアダプタを接続、電源/HDMI/USDハブをそれぞれ繋ぎつつ、

f:id:shinyaa31:20170108061750p:plain:w700

USBハブから更にLANケーブルやSDカード、その他USB接続が必要なものを継ぎ足していました。利用する分には特段これで困る事は無いですが、持ち運びの面を考えるとパーツが多くなってしまいますしやはり見た目的には美しくは無いですよね...

f:id:shinyaa31:20170108061754p:plain:w700

ALMIGHTY DOCK C1使用後の状態:

そしてこちらがALMIGHTY DOCK C1に各種接続を行った状態。USBハブを1つ噛まさなくて済むようになり、スッキリしました。SDカード類もここに挿せるようになっているのは非常に嬉しい限りですね。

f:id:shinyaa31:20170108061759p:plain:w700

製品レビューには『すごい熱を持つ』とのコメントも幾つか見られましたが、今のところそこまで熱くなっているようにはなっていないです、暫く使い込んだり、接続アクセサリーが増えてくるともしかしたら変化も見られるようになるかもしれませんが、そのあたりは経過含め観察してみようと思います。

これ1つでMacbook周りのアクセサリー類の取扱いが非常にコンパクトになり、移動先でもとても重宝しそうです。これはかなり良い買い物だったと思います。従来のパーツについては家での接続用とし、この『ALMIGHTY DOCK C1』は外出用として活用して行こうかなと思います。USB-C対応のMacBook Air/Pro/無印をご利用の皆様も是非購入を検討してみてはいかがでしょうか。オススメです!

追記

ALMIGHTY DOCK C1を介して給電/充電が出来るかどうかについても試してみました。結果は以下の通り。一応平気そうではありますが、ドックへの接続を色々している(上で給電/充電)となると、供給電力?の制限に引っ掛かりそうではありますのでご注意を。

f:id:shinyaa31:20170109191633p:plain:w450 f:id:shinyaa31:20170109191637p:plain:w450

追記2

HDMI連携は行ける、でもVGAはどうなのだろうか?という事で以下製品を発注、接続確認してみました。

繋いだ時の写真が以下。この組み合わせで、手元で試した環境ではうまく接続・表示出来ていました。(ちなみに純正マルチポートアダプタと上記HDMI to VGA変換アダプタの組み合わせでは手元の環境では上手く行かず...)

f:id:shinyaa31:20170120134422p:plain

Macbook用のハードカバーを調達した(けれども...)

Mac

先日調達した個人用Macbook無印ですが、現状『むき出し』な状態。

そのため、以下2点を満たすようなカバーを改めて購入しようと思い立つに至りました。どちらかというと1つめの『ステッカー保護』の方が目的としては優先度が高いです。

  • 本体に貼ったステッカーを保護したい。
  • ステッカーがちゃんと見える形にしたい。(なので必然的にクリアなやつになる)
  • 可能であれば耐衝撃性を高めたい。

幾つか調べてみた上で良さそうだなと思ったのがApple Storeでも紹介されている以下の2つ。

Incase Hardshell Case for MacBook

まずはこちらの『Incase Hardshell Case for Macbook』。Apple Storeで紹介されているものだしこれで良いかなーと思いましたが、下記キャプチャにあるように、耐衝撃性を高める為に施された凹凸加工により、完全にクリアとは言えない状態。実際にApple Storeに足を運んで実物を見させてもらいました(実物はApple Store銀座にしか在庫が無いっぽいので銀座店に出向いた)が、確かに若干白味掛かってボヤケた感じになってしまう見た目になってしまいました。なのでこちらは断念。

f:id:shinyaa31:20170108042512p:plain:w600

Power Support Air Jacket for MacBook

次いでこちらの『Power Support Air Jacket for MacBook』。こちらは見た感じ完全クリアっぽい。Apple Storeの人に聞いてみたけどこちらは在庫として置いてないっぽい。また、こちらの製品はApple Store的にも正規品扱いとはなっていない模様で若干濁した物言いでした。とは言えこのクリアさは捨て難いと思い、Apple Store経由で発注。

届いたのがこちら。

f:id:shinyaa31:20170108043803p:plain:w600

ですが実際箱を開けてみると表側の真ん中辺りに無数の傷が... f:id:shinyaa31:20170108043826p:plain:w600

実際カバーを付けてみるとこんな感じです。クリアさについては貼っているステッカーの見え方的に良い感じではあるのですが、新品で購入したものでこの状態では正直不満と言わざるを得ない。

f:id:shinyaa31:20170108044929p:plain:w600

背面の足場を保護するゴム部分についても1箇所どうしても本体を嵌めた際に外れてしまう部分があり、仕方なくバランスを取ってもう1箇所も外す事に。左側がちゃんと付いている状態、右側が外れてしまっている状態のものです。

f:id:shinyaa31:20170108045552p:plain:w300 f:id:shinyaa31:20170108045719p:plain:w300

安くない料金を支払ってしまったので仕方なく使おうとは思いますが、ちょっとこの品質的には不満ですね...『MADE in KOREA』と箱に記載があったのでその辺を疑わざるを得ない。

...ん?

「正規品証明シール」とは、特殊な加工が施されたフィルムシールで、製造技術、装置は日本にしか無く、厳しく管理されています。

正規品証明シールってのも見当たらないし、先述の通り、箱に記載のあるのは『MADE in KOREA』の文字。これってひょっとして偽物?いやまさかねぇ...連休明けに問い合わせてみるかのう...

f:id:shinyaa31:20170108050852p:plain:w600