前言
最近有一段时间没有爬虫相关任务,不能让这个系统太荒废下去
所以趁着近期任务处理差不多,重新抽出时间来整理下Spidr这个服务。
初步设想是,将已有的线上环境封装到docker中,这样以后不管谁去使用,谁去做分布式部署。
就不用再重新搭建这个复杂的运行环境。
Docker for Mac 不能运行解决办法
通常报错信息
WARNING: The 'boot2docker' command line interface (not to be confused with
'boot2docker' the operating system) is officially deprecated.
Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.
Docker Toolbox (https://docker.com/toolbox) is the recommended install method.
error in run: Failed to initialize machine "boot2docker-vm": exit status 1
检查boot2docker 版本
如果过低,尝试
$ brew uninstall boot2docker
卸载原有boot2docker
然后重新安装
$ brew install boot2docker
| 此间有可能会重新下载最新的docker进行安装
安装完成后,需要在mac中安装docker toolbox工具
由于当前docker不支持mac系统需要依靠
boot2docker_vm 工具虚拟环境
但是又出现的问题是 xxx_vm 工具已被废弃
转用为 dockermachine
toolbox就是为了解决这个问题。
下载安装完毕后
我们就需要尝试启动docker了。
$ boot2docker init
$ boot2docker up
$ boot2docker ssh
这样就可以进入到docker环境中了。
导入docker images
原有的image 存放在mac此路径中
/Users/wudi/Documents/Docker
docker import 命令是需要在 boot2docker ssh
后使用的。
当登陆到docker中后,需要找到我们需要导入的文件
$cd /Users/wudi/Documents/Docker/
在虚拟机中找到物理地址信息
执行
cat spider.tar | docker import - test_spider
$ docker images #查看导入镜像
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test_spider latest 07a9991a7c53 20 minutes ago 1.609 GB
centos latest f3b88ddaed16 2 weeks ago 192.5 MB
删除镜像
docker rmi 9b3
Deleted: 9b3694d90d675766c2cad3a5d39c85c0da33077465f7122b044d5be8d017da1a
进入容器环境
$ docker run -t -i test-spider /bin/bash
再次进入时
$ docker attach xxx[id号] 即可
Docker Spider 制作流程
Add ssh key (添加git key 到docker中方便clone任务)
部署docker时需要将代码拉入到容器中。
需要将ssk_key 添加到容器中。
- 找出本机中的id_rsa
- 在docker中新建 id_rsa
执行修改权限:
$ chmod 600 id_ras
添加key 到本机
$ eval $(ssh-agent -s) 创建ssh-agent
$ ssh-add id_ras
这样就能保证不需要提交新key clone 源码
git clone xxxxxxx
新建docker 中文乱码问题
这个问题是原生docker中并没有安装l10n-chinese包
locale 查看系统语言环境 以下为未配置状态
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
## 方法一
1. 首先安装
yum install kde-l10n-Chinese
2. 可尝试安装 glibc-common
yum reinstall glibc-common
3. 修改 locale.conf文件
$ vim /etc/locale.conf
$ LANG=zh_CN.UTF-8
$ localedef -c -f UTF-8 -i en_US en_US.utf8 && export LC_ALL=en_US.UTF-8
## 方法二
开始部署ror 环境
rvm安装 :
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
yum install which
安装stable rvm
curl -sSL https://get.rvm.io | bash -s stable --ruby
or
curl -L get.rvm.io | bash -s stable
$ source /etc/profile.d/rvm.sh #set up system environment for Ruby, 这步不可少
rvm reload
rvm requirements
#安装
rvm install 2.2.0 # wait sometime
yum install rubygem-bundler
保存docker修改
docker commit fdc1ce44b05e c_rails
id 容器名称
error 记录
[root@df0cb01a0231 data-analysis]# gem install rails
ERROR: Error installing rails:
rack requires Ruby version >= 2.2.2.
安装高版本 ruby
rvm install 2.3.0
rvm use 2.3.0 --default
gem install bundler
gem install rails
bundle install
# 有可能yum 没有nodejs源 执行以下代码
curl -sL https://rpm.nodesource.com/setup | bash -
yum install -y nodejs
# 安装casperjs
npm install -g casperjs
#安装 phantomjs
1. wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
bunzip2 phantomjs-2.1.1-linux-x86_64.tar.bz2
tar xf phantomjs-2.1.1-linux-x86_64.tar
mv phantomjs-2.1.1-linux-x86_64/ /opt/
ln -s /opt/phantomjs-2.1.1-linux-x86_64/ /opt/phantomjs
ln -s /opt/phantomjs/bin/phantomjs /usr/local/bin/
#check what you've just done
which phantomjs
phantomjs --version
###if phantom error
[root@df0cb01a0231 opt]# phantomjs --version
phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
yum install libXext libXrender fontconfig libfontconfig.so.1
####end
#start installing casperjs
# plant A
git clone https://github.com/n1k0/casperjs.git
mv casperjs/ /opt/casperjs
ln -s /opt/casperjs/bin/casperjs /usr/local/bin/
#check what you've just done
which casperjs
casperjs --version
测试casperjs是否可以允许
制作docker镜像 之 Dockerfile
Dockerfile说明
FROM centos # 通过image centos 镜像开始制作
MAINTAINER woody # 维护人 woody
# 解决中文乱码问题
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# 开始进行常用相关内容的安装
RUN yum makecache \
&& yum clean all && rm -rf /tmp/* \
&& yum install -y openssh-clients \
&& yum install -y git \
&& yum install -y openssh libssh2 \
&& cd /root \
&& gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D3
&& yum install -y which \
&& curl -L get.rvm.io | bash -s stable \
&& ls /etc/profile.d/rvm.sh \
&& source /etc/profile.d/rvm.sh \
&& yum install -y rubygem-bundler \
&& echo "ruby_url=https://cache.ruby-china.org/pub/ruby" > /usr/local/rvm/config/db \
&& /usr/local/rvm/bin/rvm reload \
&& /usr/local/rvm/bin/rvm requirements \
# && /usr/local/rvm/bin/rvm install 2.3.0 \
# && /usr/bin/gem sources --remove https://rubygems.org
# && /usr/bin/gem sources --add https://gems.ruby-china.org
&& echo "wil gem install" \
# && /usr/bin/gem install bundler --no-ri --no-rdoc && gem install rails \
&& curl -sL https://rpm.nodesource.com/setup | bash - \
&& yum install -y nodejs \
&& npm config set registry https://registry.npm.taobao.org \
&& npm install -g casperjs \
&& yum install -y wget \
# && /bin/bash -l -c "wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.
# && bunzip2 phantomjs-2.1.1-linux-x86_64.tar.bz2 \
# && ls ./ \
# && mv phantomjs-2.1.1-linux-x86_64/ /opt/ \
# && ln -s /opt/phantomjs-2.1.1-linux-x86_64/ /opt/phantomjs \
# && ln -s /opt/phantomjs/bin/phantomjs /usr/local/bin/ \
&& yum clean all && rm -rf /tmp/* \
EXPOSE 80 # 开放80端口
编辑完成后在当前目录下执行 docker build -t s_spider .
生成一个名为 s_spider的镜像
完成后可以通过 docker images
查看镜像
并依照正常流程 docker run xxx
docker start [id]
docker attach [id]
启动docker执行进行即可。
如何解决容器中中文字符乱码
进入boot2docker 中后
vim Dockerfile # 创建一个file 文档
# 查看已有镜像
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
spider_create latest 59a5df01f636 4 minutes ago 3.093 GB
centos latest f33cfd6cccd0 9 minutes ago 192.5 MB
c_rails latest 6c5648db4aa2 2 days ago 572.7 MB
test_spider latest 07a9991a7c53 3 days ago 1.609 GB
## 我们队spider_create 镜像进行操作 将docker乱码问题解决
在Dockerfile 文件中添加如下内容
FROM spider_create
MAINTAINER woody
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# 进行docker build 制作镜像
docker build -t spider_create .
## 脚本执行过程显示:
docker@boot2docker:~/file$ docker build -t spider_create .
Sending build context to Docker daemon 2.048 kB
Step 0 : FROM spider_create
---> 23fbf21e67eb
Step 1 : MAINTAINER woody
---> Running in f166ee5b5d66
---> 95db25e8dc8a
Removing intermediate container f166ee5b5d66
Step 2 : ENV LANG en_US.UTF-8
---> Running in 9893f4a16fc7
---> 7afd1728dee8
Removing intermediate container 9893f4a16fc7
Step 3 : ENV LANGUAGE en_US:en
---> Running in a4e5d7a44a01
---> 8432afc20b31
Removing intermediate container a4e5d7a44a01
Step 4 : ENV LC_ALL en_US.UTF-8
---> Running in aecb346ecec9
---> 59a5df01f636
Removing intermediate container aecb346ecec9
Successfully built 59a5df01f636
# 完成以上动作后
我们进入spider create 容器查看是否生效
docker run -it -v /Users/wudi/share-docker/:/mnt spider_create /bin/bash
`这条命令的作用为 运行spider_create容器,同时将 share-docker 这个目录挂载到 容器中的 mnt 目录下`
## 进入容器后
cd /mnt
随便找一个文件看下,内容中文乱码问题是否解决。。
解决了。。。
我表示很完美。
但是在查看images 时,发现这个容器居然占据了3G之多。
这么庞大的体积不能容忍。下一步尝试进行容器瘦身。
Docker 容器导入/导出
image 导出
我们需要将 s_spider 镜像导出
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
s_spider latest 81bceefdbfcb 15 hours ago 391.5 MB
spider_create latest 59a5df01f636 5 days ago 3.093 GB
centos latest f33cfd6cccd0 5 days ago 192.5 MB
c_rails latest 6c5648db4aa2 7 days ago 572.7 MB
test_spider latest 07a9991a7c53 8 days ago 1.609 GB
使用 save 命令
$ docker save 81bceefdbfcb > /Users/wudi/share-docker/spider_1.tar
docker save s_spider | gzip > s_spider-latest.tar.gz
save 后面需添加的是 IMAGE ID
容器导出
-
需要退出容器
也就是说ctrl+c 退出当前容器
使用 docker ps -a 查看已载入容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f13cd9b2711 4bc87880a753ee9b587faa3d209df95526b2d61aaceccb514399f5c64d5f75ff "/bin/sh -c 'yum make" 16 hours ago Exited (137) 16 hours ago tender_turing
d08737a75c29 centos "/bin/bash" 2 days ago Up 2 days stupefied_kilby
1c07174ee534 spider_create "/bin/bash" 5 days ago Exited (130) 2 days ago sleepy_torvalds
内容略微长了点,第一个容器只有id name 是在执行Dockerfile 时产生的临时容器。
下面我们将 NAME 为test_spider的容器导出,因为我们已经在其中进行了一些操作。
命令为:
docker export ed06fda92112 > /Users/wudi/share-docker/xxx.tar
export 后需要添加 ID 信息
容器导入
导入命令
load
方法:
1. docker load -i spider_1.tar
import
docker import
会吧打包的容器导入为一个镜像。
import
表示从标准输入读取容器内容,res
tag
分别代表生成的镜像和标记。
这里要注意第三种操作,res 的命名规范不能用驼峰式命名,docker 会识别错误。
方法1:
cat /Users/wudi/share-docker/spider_1.tar | docker import - aaaa
9d97d558397658035c449b5c6d67911cd095b65f079c14c496b542737d5d05a9
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
aaaa latest 9d97d5583976 13 seconds ago 408.8 MB
方法2:
docker import /Users/wudi/share-docker/spider_1.tar test:a
cdf8e9cd8e40fc34b7a8c4b6bc34e5ceb7fe275c7fabc12f60485240125ca30b
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test a cdf8e9cd8e40 9 seconds ago 408.8 MB
s_spider latest 81bceefdbfcb 17 hours ago 391.5 MB
镜像和容器 导出和导入的区别
镜像导入和容器导入的区别:
1)容器导入 是将当前容器 变成一个新的镜像
2)镜像导入 是复制的过程
save 和 export区别:
1)save 保存镜像所有的信息-包含历史
2)export 只导出当前的信息
docker save/load, export/import 测试对比
- 结论:
- save只能对image用,产生的文件需要用load来生成image;
- export的对象是container,产生的文件需要用import来生成image。
http://yongjj.farbox.com/post/thoughts/docker_save_load_export_import_compare
Spider线上部署流程
- git clone 源码
- yum install mariadb “安装mysql相关文件”
- yum install mariadb_server “安装mysql服务文件”
- $ systemctl mysql.server start 启动mysql 服务
- $ bundle install 安装rails相关依赖包
- 会出现以下错误
An error occurred while installing mysql2 (0.3.18), and
Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.18'` succeeds before
bundling.
出现以上报错 :
project 中执行
$gem install mysql2 -v '0.3.18' 会报错
尝试安装
yum install mysql-devel
执行bundle install
7 出现rmagick报错
An error occurred while installing rmagick (2.13.4), and
Bundler cannot continue.
Make sure that `gem install rmagick -v '2.13.4'` succeeds before
bundling.
$yum install ImageMagick
$yum install ImageMagick-c++-devel
libmagickcore-dev libmagickwand-dev
$bundle install 安装依赖包
8 执行测试启动rails c
I, [2017-04-12T10:53:02.851616 #24628] INFO -- : Can't load fetch_sample file.
生成 fetch_sample 文件:w
测试成功启动后:
访问 data.xxx.com:3000端口
执行:
bundle exec rake db:create db:migrate
创建数据库表单
- 启动uncrion
bundle exec unicorn_rails -E development -D -c /opt/work/spider/config/unicorn.rb
- yum install nodejs 安装nodejs
- sudo ln -s /usr/bin/node /usr/bin/nodejs 创建连接
解决 脚本执行时 not find nodejs 问题