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 问题

你可能感兴趣的:(Docker 记录)