Vagrant+Dockerでプログラミング環境を構築メモ
Dockerは便利...Vagrantも便利...もう組み合わせるしかないですね( ゚Д゚)
Vagrantで構築したVM上にDockerをインストール
VagrantやVirtualBox、Dockerのインストールについては以前、ブログに書きましたので割愛します。
構築するにあたってのVagrantfileの設定と、docker-compose.ymlの設定、Dockerfileの設定について自分用のやり方を書いていきたいと思います(*´ω`)
Vagrantfile
実験環境用と定期処理用で2つVMを用意するために以下のようにしました(‘ω‘ )
# -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/xenial64" config.vm.define :node1 do |node| node.vm.box = config.vm.box node.vm.network :private_network, ip:"192.168.56.10" node.vm.synced_folder "./wkspace", "/home/vagrant/shared" node.vm.provider "virtualbox" do |vb| vb.gui = false vb.memory = "4096" vb.cpus = 4 end node.vm.provision "shell", privileged: false, path: "provision/provision_node1.sh" end config.vm.define :node2 do |node| node.vm.box = config.vm.box node.vm.network :private_network, ip:"192.168.56.20" node.vm.synced_folder "./wkspace", "/home/vagrant/shared" node.vm.provider "virtualbox" do |vb| vb.gui = false vb.memory = "4096" vb.cpus = 4 end node.vm.provision "shell", privileged: false, path: "provision/provision_node2.sh" end end
Vagrantのプロビジョン
Vagrantでは、前処理として事前にパッケージのインストールなどのコマンドをシェルスクリプトに書いておくことができます。 私はdockerを利用するために以下のような記述をしております(*´ω`)
# provision_node1.sh #!/bin/sh sudo apt-get update sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose.yml
docker-composeで複数のコンテナを管理するために利用します。使いそうなプログラミング言語用に設定してみました。
version: '2' services: anaconda3: build: ./build/app/anaconda3 container_name: 'anaconda3' tty: true ports: - "8888:8888" volumes: - /home/vagrant/shared/program/python/jupyter-notebook/notebooks:/opt/notebooks go: build: ./build/app/go container_name: 'golang' tty: true ports: - "8887:8887" volumes: - /home/vagrant/shared/program/go:/opt/src/go julia: build: ./build/app/julia container_name: 'julia' tty: true ports: - "8886:8886" volumes: - /home/vagrant/shared/program/julia:/opt/src/julia
Dokerfile
細かい設定をanacondaのコンテナで行うので、anaconda用のDokerfileを取り上げます。 jupyter-notebookをDocker on VirtualBoxで動作させているので、ホストで利用するために設定が必要になります。
FROM continuumio/anaconda3 SHELL ["/bin/bash", "-c"] RUN apt update \ && apt install -y --no-install-recommends \ git \ curl \ wget \ gnupg \ unzip \ fonts-ipaexfont \ && rm -rf /var/lib/apt/list/* /var/cache/apt/archives/* RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list RUN apt update \ && apt install -y google-chrome-stable RUN mkdir -p /opt/notebooks RUN conda install -c conda-forge phantomjs #RUn conda install -c conda-forge selenium #RUN conda install -c clinicalgraphics chromedriver #RUN conda install -c clinicalgraphics selenium-chromedriver RUN pip install --upgrade pip RUN pip install --upgrade chromedriver-binary RUN pip install --upgrade selenium RUN pip install --upgrade google-api-python-client RUN pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2 RUN pip install pytube RUN conda install jupyter -y --quiet CMD bash -c "jupyter notebook --notebook-dir=/opt/notebooks --ip='0.0.0.0' --no-browser --allow-root"
以上が自分用の設定になりますね(*´ω`) 詳しい説明については割愛しますが、ポートの設定を調整すればDocker on VirtualBoxでもホストから以下のようにjupyter-notebookにアクセスできます(/・ω・)/