背景
因为需要使用一个在32bit debian系统中的一个c库作为webserver的一个子进程,但是现在32位操作系统的服务器太少了。所以这次选择使用docker封装应用栈来完成功能。
实验
Ubuntu安装Docker
Docker目前只能安装在64位CPU架构的计算机上,同时需要Linux内核为3.10及以上的版本
-
检查Linux系统内核
$ uname -r 4.8.0-22-generic
-
更新系统源
$ sudo apt-get update
-
更新Https和CA证书
$ sudo apt-get install apt-transport-https ca-certificates
-
添加新的GPG Key
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
-
添加Docker源
$ echo "deb https://apt.dockerproject.org/repo ### main" | sudo tee /etc/apt/sources.list.d/docker.list
这边可以根据Ubuntu版本修改Docker的源,在###处添加即可。该源文件在/etc/apt/sources.list.d/docker.list
- Ubuntu Xenial 16.04: ubuntu-xenial
- Ubuntu Wily 15.10: ubuntu-wily
- Ubuntu Trusty 14.04: ubuntu-trusty
- Ubuntu Precise 12.04: ubuntu-precise
-
更新系统源
$ sudo apt-get update
-
校验APT是否正在拉取争取的源。
$ apt-cache policy docker-engine docker-engine: Installed: 1.12.2-0~trusty Candidate: 1.12.2-0~trusty Version table: *** 1.12.2-0~trusty 0 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages 100 /var/lib/dpkg/status 1.12.1-0~trusty 0 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages 1.12.0-0~trusty 0 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages 1.11.2-0~trusty 0 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages 1.11.1-0~trusty 0 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages
-
安装linux-image-extra-*包
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
-
更新系统源
$ sudo apt-get update
-
安装Docker
$ sudo apt-get install docker-engine
-
启动Docker Daemon
$ sudo service docker start
-
校验Docker是否安装正确。
$ sudo docker run hello-world
修改国内源
目前因为墙的原因,使用国外的源速度还是很慢的,而且经常断线。所以最好换成国内的源,国内的有daoCloud、阿里等,我现在使用daoCloud
-
修改配置文件
$ vim /etc/default/docker DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"
-
重启docker服务
$ service docker restart
配置节点
-
首先我需要一个32bit debian系统
$ docker pull 32bit/debian
-
然后通过这个镜像创建容器并且配置容器
// 以交互模式通过镜像启动容器,并打开容器的/bin/bash $ docker run -it 32bit/debian /bin/bash
-
进去之后肯定先修改一下debian的源
$ vi /etc/apt/sources.list deb http://mirrors.163.com/debian jessie main non-free contrib deb http://mirrors.163.com/debian jessie-proposed-updates main contrib non-free deb http://mirrors.163.com/debian-security jessie/updates main contrib non-free deb http://security.debian.org jessie/updates main contrib non-free $ apt-get update
使用wget把我需要的c库先拉下来
-
然后发现镜像里是不自带make、g++环境以及一些编译环境flex、yacc的,先安装一下
$ apt-get install make g++ byacc flex
安装好了之后,编译是没有问题的,那么库的环境就配好了,再配一下webserver的环境就行了,这里不赘述。因为目前我没有更好的办法把webserver与c库解耦到两个容器当中,所以暂时把他们放在一个容器中,对外开发webserver的端口。
一切就绪以后,我就需要把现在这个容器再打包成一个镜像并将它发布,迁移至服务器上。
打包发布镜像
-
在该容器当中一切都配置好以后,先exit退出容器,然后将容器制作成新的镜像。
// 查看所有的容器 $ docker ps -a // 找到自己需要打包的容器的id $ docker commit <your-repertory-id> <your-image-name>
-
然后这边我是通过daocloud进行发布
// 先使用daocloud账户登录 $ docker login daocloud.io Username: Password: // 先对镜像打一个标记 $ docker tag <your-image> daocloud.io/<your-repertory>/<your-image>:<tag> // 再将镜像推送到远端的仓库 $ docker push daocloud.io/<your-repertory>/<your-image>:<tag>