LoginSignup
19
22

More than 5 years have passed since last update.

Mac上でDocker起動だけVagrant内で行い開発作業はすべてホスト側でするための手順

Last updated at Posted at 2018-11-17

背景

Docker for Mac を使っていると、これを書いている2018年11月時点の最新版(18.06.1-ce-mac73)を使っていても、不意に

sh: 0: getcwd() failed: No such file or directory

とかなんとかでまともに動作しなくなり、急に運ゲーに持ち込まれることがある(関連issue)。
それに、ホスト・ゲスト間のファイル共有の遅さの問題などもある(cachedオプションで改善されていそうだけど。該当の release note)。

そもそも Docker は道具として使えればええやという意識の低さの持ち主としては、OS X 上で Docker 使うことによって生じる面倒に向き合いたくないので、いまさらながら Vagrant + Docker という構成を試したところ、個人的には結局はこれが正解だったので、その手順をメモしておく。 

手順

ホスト側で、Docker 用の VM を管理する Vagrant 設定を作る。今回は ~/vagrant に。
VM の OS には、個人的に馴染みがあるので CentOS を使う。

% mkdir -p  ~/vagrant/for-docker
% cd ~/vagrant/for-docker
% vagrant init centos/7

Vagrantfile を編集する。

% emacsclient -n Vagrantfile

以下のように編集。理由はコメントを参照。

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  # メモリを増やしておく
  config.vm.provider "virtualbox" do |v|
    v.memory = 4096
    v.cpus = 2
  end

  # VM 上で初めから Docker を使えるようにしておく
  config.vm.provision "docker"

  # ホスト側にポートフォワーディングして Web の画面を見れたりデータベースアクセスできたりするようにしておく
  config.vm.network "private_network", ip: "172.12.8.150"
  config.vm.network "forwarded_port", host: 4000, guest: 3000 # Web 用
  config.vm.network "forwarded_port", host: 4306, guest: 3306 # DB(MySQL) 用

  # ホスト側の docker-compose.yml などのファイルを VM 内で参照するため共有しておく
  config.vm.synced_folder "/Users/kato-kei/work", "/home/vagrant/work", type: "nfs"
end

VM を起動し、ログインする。

% vagrant up
% vagrant ssh
[vagrant@localhost ~]$

VM 環境には docker-compose がインストールされていないので https://github.com/docker/compose/releases にある手順でインストールする。
Vagrant Box centos/7 だと sudo が必要。

[vagrant@localhost ~]$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[vagrant@localhost ~]$ sudo chmod +x /usr/local/bin/docker-compose

Docker コンテナを起動する。

[vagrant@localhost ~]$ cd work/my-project
[vagrant@localhost my-project]$ docker-compose up -d

Docker コンテナ内で Web サーバが :3000 で開くようになっているという前提で、Vagrantfile 内で VM の :3000 をホストの :4000 にポートフォワーディングしているので、ホスト側で localhost:4000 を開くと画面が出る。同様に MySQL もホスト側で :4306 でアクセスできる。

これで開発時は vagrant up; vagrant ssh して VM 内で docker-compose up -d さえしておけば、あとはすべてホスト側で、 Rails アプリのソースコードなり webpack -w した状態でフロントエンドのソースコードなりを変更し、その結果をブラウザやデータベースクライアントで確認する、という実装作業ができる。

[おまけ] Vagrant Box centos/7 で Python 環境作る

ECR で Dockerfile を管理している場合などに aws-cli が必要だけど、CentOS 7 の system にプリインストールされている Python には pip すら付属していない状態なので、せっかくだから pyenv で Python 環境を作っておく。

Vagrant Box centos/7 が最小構成なので、pyenv をインストールするために必要な Git がそもそも system にないのでインストール。

[vagrant@localhost ~]$ sudo yum install git

pyenv は https://github.com/pyenv/pyenv の README にある手順でインストールする。

# 手順が変わるかもしれないのと、上記の README が十分にわかりやすいのでそちらを見てくだされ。

Python 本体をインストールする前に、ビルドに必要なパッケージを https://github.com/pyenv/pyenv/wiki#suggested-build-environment を眺めて事前にインストールする。

[vagrant@localhost ~]$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel

ようやく Python 本体をインストールする。

[vagrant@localhost ~]$ pyenv install 3.7.1
[vagrant@localhost ~]$ pyenv global 3.7.1
[vagrant@localhost ~]$ python --version
Python 3.7.1

あとは普通に pip が使えるのでよしなに。

[vagrant@localhost ~]$ pip install --upgrade pip
[vagrant@localhost ~]$ pip install awscli
[vagrant@localhost ~]$ AWS_ACCESS_KEY_ID=XXXXXX AWS_SECRET_ACCESS_KEY=XXXXXX aws ecr get-login --region ap-northeast-1 --no-include-email
19
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22