使用 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
将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上的浏览器进行访问并确认执行
创建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);
在相同的环境中,测试一下Python。
# ubuntu/nodejsで実行
$ python --version
Python 2.7.6
$ vi index.html
<html>
<body>
Hello Python
</body>
</html>
$ python -m SimpleHTTPServer 80
请不要删除 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。