使用 boot2docker 创建各种编程语言的执行环境

最近有很多開發工作分別使用go、python和node等不同的程式語言,因此決定在虛擬機上建立執行環境。

在VirtualBox中搭建boot2docker(core Linux),并配置以下运行环境:
– go语言
– node.js(python)

【准备好的环境】
– VirtualBox
– Vagrant v1.7.1

我也有VMware Fusion,所以想在那边确认一下,但是需要许可证,所以这次跳过。
参考:https://www.vagrantup.com/vmware
$79(约合9384日元),有点贵…

安装流浪者

从官方网站下载并安装DMG。

VirtualBox的安装

从官方网站上下载并安装OS X版本的dmg文件。

准备boot2docker

$ mkdir -p /Users/<USER NAME>/Documents/Vagrant/boot2docker
$ cd /Users/<USER NAME>/Documents/Vagrant/boot2docker

# boot2dockerの起動
$ vagrant init mitchellh/boot2docker

如果要创建boot2docker的ISO映像

如果您不需要ISO,请直接启动。

从这里开始安装Packer。

在安装后通过终端执行以下命令


$ cd /Users/<USER NAME>/Documents/Vagrant
$ git clone https://github.com/mitchellh/boot2docker-vagrant-box.git
$ cd boot2docker-vagrant-box.git
$ vagrant up
$ vagrant ssh -c 'cd /vagrant && sudo ./build-iso.sh'
$ vagrant destroy --force
$ packer build -only=virtualbox-iso template.json

执行上述命令将会生成以下文件:
– b2d.iso
– boot2docker_virtualbox.box
– boot2docker_virtualbox.iso


启动boot2docker

设置端口转发


$vi Vagrantfile

 : 省略
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080

# Add port forwarding
config.vm.network "forwarded_port", guest: 80, host: 8080

# 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"
 : 省略

启动Boot2Docker

$ vagrant up
$ vagrant ssh
スクリーンショット 2014-12-13 22.11.15.png

将boot2docker的数据永久保存下来

然后对使用boot2docker创建的数据进行持久化处理。

在 boot2docker 上执行以下命令

$ sudo su -
# cat > /var/lib/boot2docker/bootlocal.sh <<EOF
> echo "tar cf /var/lib/boot2docker/userdata.tar . -C /home/docker/" >> /opt/shutdown.sh
> EOF
# chmod +x /var/lib/boot2docker/bootlocal.sh
# sudo reboot

通过这个方法,在重新启动或关机时,/home/docker/会被备份到/var/lib/boot2docker/userdata.tar。

【确认】
通过Mac连接至ssh

$ vagrant ssh
# pssword : tcuser
# boot2dockerでの作業
$ touch test
$ ls -l 
  -rw-r--r--    1 docker   staff            0 Dec 13 13:22 test
$ sudo reboot

再次使用Mac进行ssh连接

$ vagrant ssh
# pssword : tcuser

boot2docker 是一个以 Docker 为基础的轻量级虚拟机环境。

$ ls -l 
   -rw-r--r--    1 docker   staff            0 Dec 13 13:22 test
# 存在していることを確認

使用Golang创建Docker镜像。

既经这么麻烦了,就从Dockerfile创建镜像吧
※也可以使用docker pull dockerfile/go

Go语言

$ mkdir golang
$ cd golang
$ vi Dockerfile

#
# Go Dockerfile
#
# https://github.com/dockerfile/go
#

# Pull base image.
FROM dockerfile/ubuntu

# Install Go
RUN \
  mkdir -p /goroot && \
  curl https://storage.googleapis.com/golang/go1.3.1.linux-amd64.tar.gz | tar xvzf - -C /goroot --strip-components=1

# Set environment variables.
ENV GOROOT /goroot
ENV GOPATH /gopath
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH

# Define working directory.
WORKDIR /gopath

# Define default command.
CMD ["bash"]

创建Docker镜像 : Docker

$ docker build -t ubuntu/golang .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu/golang       latest              ff635337559a        3 minutes ago       614 MB
dockerfile/ubuntu   latest              c8f87bf54eb2        8 days ago          414.6 MB

在Docker中使用Go语言尝试编写HelloWorld。


$ docker run -i -p 80:80 -t ubuntu/golang /bin/bash

$ go version
go version go1.3.1 linux/amd64

$ vi testserver.go

package main

import (
  "fmt"
  "net/http"
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello Go lang")
}

func main() {
  http.HandleFunc("/", indexHandler)
  http.ListenAndServe(":80", nil)
}


# テストなのでコンパイルなしで実施
$ go run testserver.go

通过Mac上的浏览器进行访问并确认执行

スクリーンショット 2014-12-14 0.10.18.png

创建Docker镜像(Node.js,Python)。

由于Python环境是基于Nodejs的,因此只需创建Nodejs环境。

$ mkdir ~/nodejs
$ cd ~/nodejs
$ vi Dockerfile


#
# Node.js Dockerfile
#
# https://github.com/dockerfile/nodejs
#

# Pull base image.
FROM dockerfile/python

# Install Node.js
RUN \
  cd /tmp && \
  wget http://nodejs.org/dist/node-latest.tar.gz && \
  tar xvzf node-latest.tar.gz && \
  rm -f node-latest.tar.gz && \
  cd node-v* && \
  ./configure && \
  CXX="g++ -Wno-unused-local-typedefs" make && \
  CXX="g++ -Wno-unused-local-typedefs" make install && \
  cd /tmp && \
  rm -rf /tmp/node-v* && \
  npm install -g npm && \
  echo -e '\n# Node.js\nexport PATH="node_modules/.bin:$PATH"' >> /root/.bashrc

# Define working directory.
WORKDIR /data

# Define default command.
CMD ["bash"]

创建Docker镜像


$ docker build -t ubuntu/nodejs .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu/nodejs       latest              60d7f5969d7a        30 seconds ago      496.6 MB
ubuntu/golang       latest              42a919d3c0ea        23 minutes ago      614 MB
dockerfile/python   latest              f08c82e36872        8 days ago          471 MB
dockerfile/ubuntu   latest              c8f87bf54eb2        8 days ago          414.6 MB

$ docker run -i -p 80:80 -t ubuntu/nodejs /bin/bash

$ npm version
{ http_parser: '1.0',
  node: '0.10.33',
  v8: '3.14.5.9',
  ares: '1.9.0-DEV',
  uv: '0.10.29',
  zlib: '1.2.3',
  modules: '11',
  openssl: '1.0.1j',
  npm: '2.1.12' }

# serverの作成
$ vi app.js
var http = require('http');

var server = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World node.js');
});
server.listen(80);

スクリーンショット 2014-12-14 0.27.25.png

在相同的环境中,测试一下Python。

# ubuntu/nodejsで実行

$ python --version
Python 2.7.6

$ vi index.html
<html>
<body>
    Hello Python
</body>
</html>

$ python -m SimpleHTTPServer 80

スクリーンショット 2014-12-14 0.25.21.png

请不要删除 Docker 容器的命令。

由于Docker保留了启动后的差异文件,因此在不需要时可以将其删除。

$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                      PORTS               NAMES
8675a8897319        ubuntu/nodejs:latest   "/bin/bash"         8 seconds ago       Exited (0) 7 seconds ago                        hungry_carson       
f71e1d22b5e6        ubuntu/golang:latest   "/bin/bash"         56 seconds ago      Exited (0) 54 seconds ago                       prickly_shockley    

#不要コンテナのIDを指定
$ docker rm 8675a8897319 f71e1d22b5e6


# イメージを削除する場合
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu/nodejs       latest              60d7f5969d7a        About an hour ago   496.6 MB
ubuntu/golang       latest              42a919d3c0ea        About an hour ago   614 MB
dockerfile/python   latest              f08c82e36872        8 days ago          471 MB
dockerfile/ubuntu   latest              c8f87bf54eb2        8 days ago          414.6 MB

$ docker rmi < IMAGE ID >

如果要批量删除容器或镜像

# remove container
$ docker rm `docker ps -a -q`

# remove images
$ docker rmi $(docker images | awk '/^<none>/ { print $3 }')

在进行多地点开发或敏捷开发时,可以使用GitHub进行源代码管理,并使用Dockerfile进行环境管理,以便进行适合移动性的开发。

我准备了,由于Mac已达到了限制,我想要在裸金属上构建boot2docker。

广告
将在 10 秒后关闭
bannerAds