Docker 记录

前言

最近有一段时间没有爬虫相关任务,不能让这个系统太荒废下去
所以趁着近期任务处理差不多,重新抽出时间来整理下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 添加到容器中。

  1. 找出本机中的id_rsa
  2. 在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


容器导出

  1. 需要退出容器

    也就是说ctrl+c 退出当前容器

  2. 使用 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线上部署流程

  1. git clone 源码
  2. yum install mariadb “安装mysql相关文件”
  3. yum install mariadb_server “安装mysql服务文件”
  4. $ systemctl mysql.server start 启动mysql 服务
  5. $ bundle install 安装rails相关依赖包
  6. 会出现以下错误
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
创建数据库表单
  1. 启动uncrion
bundle exec unicorn_rails -E development -D -c /opt/work/spider/config/unicorn.rb

  1. yum install nodejs 安装nodejs
  2. sudo ln -s /usr/bin/node /usr/bin/nodejs 创建连接
    解决 脚本执行时 not find nodejs 问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,714评论 0 9
  • 1.Docke介绍 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。...
    MichaelChoo阅读 683评论 0 9
  • 一,小王对于容器的困惑 小王刚开始学习Docker的时候,找资料在网上看到最多的是Docker的好处。比如: 1、...
    架构师小秘圈阅读 8,436评论 0 24
  • 0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可...
    sessionboy阅读 3,854评论 2 49
  • 当今天与昨天一样 今天是明天的今天 今天是虚无的一天 今天也就要变为生命的废墟
    只有经历知道阅读 359评论 1 4