azukipochette's weblog

memory dump (mini)

WSL (Ubuntu 18.04) に Terraform をコマンドラインでインストールする方法

以下のコマンドを bash 上で実行します。

なお、記事を書いている現時点では以下の URL が最新ですが、今も URL が最新とは限らないので、https://releases.hashicorp.com/terraform から最新を探してくださいね。

sudo apt-get install unzip
wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip
unzip terraform_0.11.7_linux_amd64.zip
sudo mv terraform /usr/local/bin/

バージョン情報を表示して、呼び出せるかどうかをを確認します。

terraform --version

以下のような感じでバージョン情報が表示されれば OK です。

Terraform v0.11.7

Enjoy!

Ubuntu (Ubuntu 18.04 with WSL) でビープ音を止める

/etc/inputrc を開き、下記行を検索してコメントを無効にします。

set bell-style none

VIM のビープ音も止める

もし VIM 使いなら VIM のビープ音も止めたいのではないかと思います。

その場合は、以下のコマンドを実行します。

set belloff=all

これで間違っても静かに対応できますね。Enjoy!

Docker on VMWare Workstation と WSL で快適生活

前回の続編です。

今回は、WSL (Windows Subsystem for Linux) から VMWare Worksation 上で動作する Docker-machine を操作する方法です。 なお、WSL 上で動作する Linux ディストリビューションは複数ありますが、私は、最近リリースされた Ubuntu 18.04 を使ってます。

WSL に Docker-CE をインストールする

Ubuntu に対して Docker をインストールします。

Docker のインストール方法は公式に手順があるので、素直に従います。

apt-get install で docker-ce が見つからないと言われたら...

ちゃんとリポジトリを追加したのに docker-ce がないといわれるぞ!言われた場合は、もう少しちゃんとマニュアルを読みましょう。

現時点で Ubuntu 18.04 向けの docker-ce は stable には無いので、edge か test にする必要があります。test はちょっとアレなので、edge ぐらいがいいのではないでしょうか。 というわけで、以下のコマンドを代わりに実行します。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   edge"

.bashrc を変更する

~/.bashrc に以下の行を追加します。

MACHINE_IP=`'/mnt/c/Program Files/Docker Toolbox/docker-machine.exe' ls 2>/dev/null | grep default | awk '{ print $5}'`

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="$MACHINE_IP"
export DOCKER_CERT_PATH="/mnt/c/Users/$USER/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"

なお、docker-machine コマンドで作成する環境の名前は default を想定しています。 別の名前にしている場合は、grep の引数と DOCKER_MACHINE_NAME の値を適宜変更してください。

内容は読むとわかりますが、docker-machine コマンドを実行して、出力結果から Grep で default 環境の行を取り出し、さらに IP アドレス部分を AWK で取り出して変数を作成、それを DOCKER_HOST 環境変数に設定することにより、接続できるようにしています。これで、毎回環境変数を更新する必要はありませんね (ヤッタ!)。

更新後は、ターミナルを再起動するか、以下のコマンドを実行して .bashrc を再読み込みします。

source ~/.bashrc

設定がうまく動いているかどうかを確認する

bash 上で以下のコマンドを実行します

docker version

以下のように出力結果に Server が表示されていれば、あとは普通に docker コマンドが使えます。

Client:
 Version:      18.05.0-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   f150324
 Built:        Wed May  9 22:16:13 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.05.0-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.10.1
  Git commit:   f150324
  Built:        Wed May  9 22:20:42 2018
  OS/Arch:      linux/amd64
  Experimental: false

試しに hello-world コンテナでも実行してみます。

docker run hello-world

以下のような出力が得られれば成功です。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

それでは、良い Docker on VMWare workstation 生活を。Enjoy!

VMWare Workstation で Docker 生活

はじめに

こん**わ。

なんだか VMWare 自体がやる気がないように見える VMWare Workstation。 Docker も Hyper-V 対応になって、時代は Hyper-V なんじゃないの...と思い出しているかもしれない皆様、いかがお過ごしでしょうか。

私はしばらくの間 Docker は VMWare Workstation 上で使えないのだと思っていて、Vagrant + VMWare Workstation で CoreOS を動かしてその上で Docker を扱っていましたが、実は VMWare Workstation でも Docker が扱えることがわかったので、今日はこの話をまとめます。

Docker Machine VMWare Workstation Drive の導入

世の中には VMWare 愛のある人がいるもので、Docker 用の VMWare Workstation ドライバーを書いてくれています。

Docker for Windows というのは簡単に言うと、docker-machine というコマンドを使って Docker を動かす Linux 仮想マシンを起動して、その環境を docker コマンド経由で操作するようなことをしています。 通常、docker-machine コマンドのドライバーは Hyper-V か VirtualBox なわけですが、これを上記の docker-machine-vmwareworkstation を使うことで、VMWare 上で動作する仮想マシンを用意することができます。

インストール手順は、上記の GitHub のページの "Installation" に書いてあるので読んでください。 なお、最初にある "Install Docker Toolbox" というのは、以下にあります。

start.sh のスクリプトはまるっと置き換えてしまえば大丈夫です。

docker-machine-driver-vmworkstation.exe はパスが通っているフォルダーに置くか、docker-machine.exe のあるフォルダーのどちらかに置くことになりますが、私は docker-machine.exe のフォルダに直接置いています。*1

docker-machine を実行する

docker-machine コマンドを使って、docker を動かす Linux (boot2docker) 仮想マシンを作成します。

docker-machine create --driver=vmwareworkstation default

私は既定のまま使っていますが、ディスクやメモリ、CPU 数などはパラメータで変更可能です。詳しくはこちらも GitHub のページの記載を見てください。 実行すると以下のような流れで仮想マシンが作成されます (それなりに時間がかかります)。

Running pre-create checks...
Creating machine...
(default) Copying C:\Users\<YourName>\.docker\machine\cache\boot2docker.iso to C:\Users\<YourName>\.docker\machine\machines\default\boot2docker.iso...
(default) Creating SSH key...
(default) Creating VM...
(default) Creating disk 'C:\Users\<YourName>\.docker\machine\machines\default\default.vmdk'
(default) Virtual disk creation successful.
(default) Starting default...
(default) Waiting for VM to come online...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env default

作成が完了しているかどうかを念のため確認してみます。

docker-machine ls

以下のような結果が帰ってくるはずです。

NAME      ACTIVE   DRIVER              STATE     URL                         SWARM   DOCKER        ERRORS
default   -        vmwareworkstation   Running   tcp://192.168.32.139:2376           v18.05.0-ce

次に、docker-machine create のレスポンスの最後にあるように、作成した仮想マシン上で docker コマンドが使えるように接続します。

docker-machine env default

以下のような結果が帰ってきます (実はこの記述は置き換えた start.sh の中に書いてあります)。

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.32.139:2376
SET DOCKER_CERT_PATH=C:\Users\<YourName>\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

"Run this command to configure your shell" と書かれているように、表示されたコマンドを次のように実行します。

@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

これで、Docker コマンドを実行する準備ができました。

docker コマンドを試す

実際に docker コマンドが使えるかどうかを hello-world というイメージを使用して確認します

docker run hello-world

すると、以下のような結果が返ってきます。

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

これで、無事に docker が使えることが確認できました!(ヤッタ!)

ホストとコンテナのフォルダを共有する

ホスト (Windows) のフォルダーをコンテナ上で扱えないと不便ですよね。

なぜか Docker Machine VMWare Workstation Drive の README.md には記載がないのですが、docker-machine コマンドで仮想マシンを作成したときに、VMWare の機能を使用して C:\Users フォルダーが /Users として共有されています。これまでに説明したように、"Windows <-> Linux (boot2docker) 仮想マシン <-> Container" という流れなので、docker コマンドの --volume で /Users をマッピングすればいいことになります。

たとえば、以下は ubuntu コンテナ上で Windows 上の C:\Users を /share としてマッピングする時のコマンドです。

docker run --name mycontainer -v /Users:/share -it ubuntu /bin/bash

なお、Windows の世界の人は忘れがちですが、大文字・小文字を区別するので、"/Users" とするのがポイントです。

"C:\Users" 配下ではないフォルダーをマウントしたい

上記を見て、「え? C:\Users 配下しか使えないの?」と思った方々、私たちには mklink コマンドがあります。

これは、シンボリックリンクを作成するコマンドです。シンボリックリンクというのを知らない人に簡単に説明すると、特定のフォルダーに実態があるものを、あたかもそのフォルダーにあるかのようにリンクを作成するものと思ってください。たとえば、"D:\Works" を使いたい場合には、まず C:\Users 配下にシンボリックリンクを作成すればよいことになります。

以下は、自分のユーザープロファイル配下に Share フォルダーがあるように D:\Works フォルダーをリンクした例です。

mklink/d C:\Users\<YourName>\share D:\Works

あとは docker コマンド実行時に -v を使ってマッピングすればよいだけです。

docker run --name mycontainer -v /Users/<YourName>/share:/share -it ubuntu /bin/bash

これで、楽しく Docker が使えますね。

それでは、楽しい Docker ライフを。Enjoy!

*1:どうせ start.sh ファイルの内容を置き換えしているし、いいかなという感覚で置いています。ちなみに、変更していなければ既定の場所は "C:\Program Files\Docker Toolbox" です。

Windows 10 Version 1803 に "vagrant ssh" するための base box 設定方法

OpenSSH Server のインストール

以下の手順を実施する。

  1. "Settings" アプリを開く
  2. [Apps] を開く
  3. [Manage optional features] をクリックする
  4. [Add a feature] をクリックする
  5. 表示される一覧から "OpenSSH Server" を探し、クリックする
  6. [Install] をクリックする
  7. インストールが完了するまで待つ

OpenSSH Server を自動的に開始する

以下の手順を実施する。

  1. "services.msc" を起動する
  2. "OpenSSH SSH Server" を探し、プロパティを開く
  3. [Startup type] を "Manual" から "Automatic" に変更する
  4. (必要に応じて) [Start] をクリックし、サービスを起動する

Base Box 用の公開キーを設定する

Vagrant の "Creating a Base Box" (https://www.vagrantup.com/docs/boxes/base.html) にある記載のとおり、GitHub の insecure keypair (https://github.com/hashicorp/vagrant/tree/master/keys) にある公開鍵 (vagrant.pub) を以下の手順で配置する。

  1. https://github.com/hashicorp/vagrant/tree/master/keys にアクセスする
  2. "vagrant.pub" をダウンロードする
  3. PowerShell を起動する
  4. 以下のコマンドを実行する
  5. ダウンロードした vagrant.pub を "authorized_keys" に名前を変更して保存する
cd C:\Users\vagrant
mkdir .ssh
cd .ssh

おまけ

VMWare desktop における guest-os_type のリストは存在しないが、GitHub 上にある open-vm-tools のコード内にそれらしき定義が存在していることをたまたま発見した。 たとえば、Windows 10 の場合、"開発中のコード名は Windows 9 だったので"...と記載されており、実際に VMWare Workstation 14 Pro で Windows 10 の VM を作ると guest-os-type が "Windows9" になっている。

Git Virtual File System(GVFS) の使い方

GVFS (Git Virtua File System) の使い方を日本語で載せておく。 また、GVFS 利用時の注意点もまとめておく (注意点や制限事項などは 2018/5/28 時点でのもの)。

利用条件

  • 使用 OS が Windows 10 Version 1703 以降であること

GVFS は OS の仕組みを利用しているため、現時点で Windows 10 (Version 1703) 以降でなければ使用できない。

  • Visual Studio Team Services を使用すること

GVFS に対応するためには、使用する Git サービスが GVFS プロトコルに対応している必要がある。現時点では、Microsoft が提供している Visual Studio Team Services (VSTS) のみが対応しており、GitHub などでは利用することができない *1

インストール方法

GVFS を利用するには、マイクロソフトが作成している GVFS対応版の Git for Windows を使用する必要がある。Git 公式 (http://www.git-scm.org) で公開されているものでは使用できないので注意が必要。

GVFS 対応版の Git for Windows は以下の GitHub 上のリポジトリから入手できる。このリポジトリは基本的に Git-for-Windows/Git の fork であり、GVFS 以外についての機能は同じである。

Git for Windows インストール後、GVFS をインストールする。GVFS は以下の GitHub 上のリポジトリからダウンロードできる。

制限事項

現在の GVFS には利用上の制限が 2 つ存在する (正確には 3 つ存在する)

  1. リポジトリで clean/smudge フィルターが有効でないこと
  2. リポジトリの直下 (ルート) に "* text" の行を含む .gitattributes ファイルが存在すること
    • 改行コードの変換が無効であること (* text=false)

特に最後の改行コードについては、Visual Studio によって自動的に作成される .gitattributes ファイルでは "* text=auto" となっており注意が必要である。*2

改行コードの設定が問題で失敗した場合は、以下のエラー コードが表示される。

Error: Could not complete checkout of branch: master, fatal: CRLF conversions not supported when running under GVFS

使い方

Git クローンする時に git clone の代わりに gvfs clone を使えばよい。

実行結果の例を以下に示す。

PS C:\Works\GVFSTest> gvfs clone <Repository Url>
Clone parameters:
  Repo URL: <Repository Url>
  Branch:       Default
  Cache Server: Default
  Local Cache:  C:\.gvfsCache
  Destination:  C:\Works\GVFSTest\MonoBuildTest
Authenticating...Succeeded
Querying remote for config...Succeeded
Using cache server: None (<Repository Url>)
Cloning...Succeeded
Fetching commits and trees from origin (no cache server)...Succeeded
Attaching PrjFlt to volume...Succeeded
Validating repo...Succeeded
Mounting...Succeeded
Registering for automount...Succeeded

取得後は、通常の Git コマンドが使用できる。 なお、git clone した場合は直下にコードリポジトリのソースコードが表示されるが、GVFS の場合は "<root>\src" 配下に作成されるのでコマンド実行時は注意が必要 ("cd <root>\src" すること)。

なお、ローカルからリポジトリを削除したい場合、フォルダーを削除する前にリポジトリ配下で次のコマンドを実行してアンマウントしなければならない。*3

gvfs unmount

macOS と Linux 対応について

macOS と Linux への対応については、Microsoft と GitHub が共同で作業を進めている状況だが、現時点では対応していない。

状況としては、macOS 対応のほうが進んでいる様子。

*1:GitHub、GitBucket ともに対応は計画されているが 2018/5/28 時点では利用できない

*2:text=auto の場合、Git に改行するかどうかをゆだねる形になっており、git 設定で as-is (autoCRLF=false) であれば良いように思うかもしれないが false でなければエラーとなる

*3:消そうとすると Windows にファイルが使用中といわれる