Docker

Docker基础

  • 安装及参考资料
    • 安装
    • 检查 Device Mapper
    • 安装 docker
    • 开机自启
    • 镜像加速
    • 开启关闭docker
    • Docker守护进程绑定到非默认套接字
  • 典型的生命周期
    • docker典型生命周期: 创建 管理 停止 删除
  • 镜像和仓库
  • DockerFile中的指令
  • 构建静态站点环境
    • 大体流程
    • Sample网站的初始Dockerfile
    • 获取Nginx配置文件
    • Dockerfile的内容
    • global.conf的内容
    • nginx.conf的内容

安装及参考资料

安装

查看系统版本, cup位数等

$ uname -a

检查 Device Mapper

$ ls -l /sys/class/misc/device-mapper
$ sudo grep device-mapper /proc/devices

如果没有检测到 Device Mapper 我们也可以安装

$ sudo yum install -y device-mapper

之后还需要加载 dm_mod 内核模块

$ sudo modprobe dm_mod

安装 docker

$ sudo yum -y install docker-io
$ sudo yum list installed | grep docker
$ sudo systemctl start docker.service

开机自启

$ sudo vim /etc/profile.d/rds_start.sh

#!/bin/sh
#chkconfig: 2345 80 90
#description:rds_start.sh

$ sudo chmod +x /etc/profile.d/rds_start.sh
$ sudo cp /etc/profile.d/rds_start.sh /etc/init.d/
$ sudo chkconfig --add rds_start.sh
$ sudo chkconfig rds_start.sh on
$ sudo shutdown -r now

镜像加速

在/etc/docker/daemon.json文件中添加如下内容.

{
  "registry-mirrors": ["https://wghlmi3i.mirror.aliyuncs.com"]
}

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

开启关闭docker

$ service docker stop
$ service docker start

Docker守护进程绑定到非默认套接字

$ /usr/bin/docker -d -H unix://home/docker/docker.sock
官方主页
http://www.docker.com
Hub
http://hub.docker.com
官方博客
http://blog.docker.com
官方文档
http://docs.docker.com
快速入门指南
http://www.docker.com/tryit/
GitHub源码
https://github.com/docker/docker
Forge:收集各种Docker工具, 组件和服务
https://github.com/dockerforge
邮件列表
https://groups.google.com/forum/#!forum/docker-user
IRC频道
irc.freenode.net
Twitter主页
http://twitter.com/docker
StackOverflow问答主页
http://stackoverflow.com/search?q=docker

典型的生命周期

docker典型生命周期: 创建 管理 停止 删除

:查看基本信息

$ docker info

:创建第一个容器

$ docker run -i -t ubuntu /bin/bash

出现报错

报错:

/usr/bin/docker-current: Error response from daemon: error creating
overlay mount to

原因:

这个是因为用的overlay2文件系统,而系统默认只能识别overlay文件系统

解决:
先停掉服务

# service docker stop

修改文件

# vim /etc/sysconfig/docker-storage

DOCKER_STORAGE_OPTIONS="–storage-driver overlay "
启动服务

# service docker start

:进入容器
问题解决后执行成功, 命令提示符如下
root@2d260a5cad26:/#
此时已经以root用户登入了容器
root@2d260a5cad26:/# hostname
2d260a5cad26

# cat /etc/hosts
# ps -aux
# apt-get update && apt-get install vim

:退出容器
退出时容器停止工作

# exit

:宿主机中查看容器

# docker ps -a #查看所有容器
# docker ps #查看正在运行的容器

:容器命名

# docker run --容器名称 -i -t ubuntu /bin/bash
# docker run --db -i -t ubuntu /bin/bash

:删除容器

# docker rm 容器名称
# docker rm db

:启动已存在的容器

# docker start 容器名称

:停止容器

# docker stop 容器名称

:登入容器
在宿主机中安装nsenter

# wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
# tar -xzvf util-linux-2.24.tar.gz  
# cd util-linux-2.24/  
# ./configure --without-ncurses  
# make nsenter  
# sudo cp nsenter /usr/local/bin  
# nsenter --help

但该命令不是登入容器的常用命令, @_@

# docker exec -it zcw /bin/bash

创建守护型容器

# docker run --name 容器名 -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 1;done"

打印最近的日志

# docker logs 容器名

打印动态日志

# docker logs -f 容器名

-t 打印时间戳

# docker logs -f -t 容器名

最近十条日志

# docker logs --tail 10 容器名

监控日志

# docker logs --tail 0 -f 容器名

查看进程

# docker top 容器名

容器后台任务(-d): 容器内创建文件

# docker exec -d 容器名 touch /etc/new_config_file

容器交互任务(-it): 登入容器

# docker exec -t -i daemon_dave /bin/bash

最近10个容器

# docker ps -n 10

自动重启的容器

# docker run --restart=always --name 容器名 -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

–restart=always
–restart=on-failure #容器退出代码为非0时, 自动重启
–restart=on-failure:5 #重启5次

更多容器信息

# docker inspect zcw

该命令的-f和-format参数可以使用go语言模板
#sudo docker inspect --format=’{{ .State.Running }}’ zcw false
$ docker inspect --format ‘{{ .NetworkSetings.IPAddress }}’\ zcw

删除所有容器

# docker rm 'docker ps -a -q'

镜像和仓库

镜像名称:
如 kevin/puppet
用户名: kevin
仓库名: puppet

本地镜像都保存在宿主机的 /var/lib/docker目录下

拉取仓库中所有fedora镜像

# docker pull -a fedora

拉取最新fedora镜像

# docker pull fedora

拉取指定版本镜像

# docker pull fedora:20

删除本地镜像

# docker rmi docker.io/fedora:heisenbug

查看本地仓库

# docker images
# docker images fedora

搜索可用镜像

# docker search redis

stars: 受欢迎程度 official: 上游开发者管理的镜像 automated: Docker Hub 自动构建

如果构建一个全新的镜像, 也可以参考:
https://docs.docker.com/articles/baseimages/

登入Docker Hub

# docker login

commit创建本地镜像

[root@ /]# docker run --name zcw -it ubuntu /bin/bash
root@360c2ed91c6d:/# apt-get -yqq update
root@360c2ed91c6d:/# apt-get -y install apache2
root@360c2ed91c6d:/# exit
# docker commit 360c2ed91c6d zcw/apache2
# docker images
# docker commit -m='A new custom image' --author="zcw" 360c2ed91c6d zcw/apache3
# docker inspect zcw/apache3

用Dockerfile构建镜像

[root@ vagrant]# mkdir static_web
[root@ vagrant]# cd static_web
[root@ static_web]# touch Dockerfile
[root@ static_web]# vim Dockerfile

Version: 0.01
FROM ubuntu
MAINTAINER James Turnbull “[email protected]
RUN apt-get update
RUN apt-get install -y nginx
RUN echo ‘Hi, I am in your container’ >/usr/share/nginx/html/index.html
EXPOSE 80
:wq
$ docker build -t="zcw/static_web:v1” .
末尾的’.’表示用当前目录中的Dockerfile构建
$ docker images
创建过程中的失败
-----------------------
最后一步创建的容器ID
Step 3 : Run …
—> Running in 上一个ID
—> 当前完成的ID
-----------------------
如果Step4失败了
docker run -it 当前完成的ID /bin/bash
在这里运行Step4, 并找到问题

禁用构建缓存
$ docker build --no-cache -t=“zcw/static_web:v2”

镜像构建历史
$ docker images
$ docker history 25a5f3c8a8c2

用新构建的镜像启动容器
$ docker run -d -p 80 --name static_web zcw/static_web:v1 nginx -g “daemon off;”
-p 80后台运行时公开80端口
nginx -g “daemon off;” -> 在容器中运行的命令
之后可以用docker ps命令看一下容器的端口分配情况:0.0.0.0:32768->80/tcp
$ docker port 720cac51b0f2 80
$ docker port CONTAINER ID 80
或者手动绑定端口
$ docker run -d -p 8080:80 …
$ docker run -d -p 宿主机:容器 …

DockerFile中的指令

docker run 末尾指令
CMD:
docker run 中命令末尾指定操作的默认值
CMD ["/bin/bash"]

# docker run --name zcw -it ubuntu /bin/bash

可简化为

# docker run --name zcw -it ubuntu

ENTRYPOINT:
ENTRYPOINT ["/usr/sbin/nginx", “-g”, “daemon off;”]

# docker run -d -p 80 --name static_web zcw/static_web:v1 nginx -g "daemon off;"

可简化为

# docker run -d -p 80 --name static_web zcw/static_web:v1

ENTRYPOINT ["/usr/sbin/nginx"]
可简化为

# docker run -d -p 80 --name static_web zcw/static_web:v1 -g "daemon off;"

小计:
1.CMD会被末尾指令覆盖掉,ENTRYPOINT会接收末尾指令并放在后面执行
2.如果需要, 可以用 --entrypoint标志覆盖ENTRYPOINT指令.

工作目录
切换工作目录:
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp/db
ENTRYPOINT [“rackup”]

# docker run -it -w /var/log ubuntu pwd

设置环境变量:
ENV TARGENT_DIR /home/rvm
WORKDIR $TARGENT_DIR

# docker run -it -e "WEB_PORT=8080" ubuntu env

-e传递的环境变量将只能在运行时有效

指定用户身份
USER user:group

-u
默认root

卷: 指定挂载点
VOLUME ["/opt/project", “/data”]
添加文件到镜像
ADD software.lic /opt/application/software.lic
ADD http://wordpress.org/latest.zip /root/wordpress.zip
ADD lastest.tar.gz /var/www/wordpress/
COPY conf.d/ /etc/apache2/
本地文件都放到和Dockerfile同一个目录下.
不能复制该目录之外的任何文件.

DockerFIle模板化构建
----------------
FROM ubuntu
MAINTAINER zcw Turnbull “[email protected]
RUN apt-get update
RUN apt-get install -y apache2
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ONBUILDONBUILD并不会渗透到其子镜像中.
及 ADD . /var/www/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/apache2"]
CMD ["-D", “FOREGROUND”]
----------------

# docker build -t="zcw/apache2:v4" .

镜像中包含一条ONBUILD指令, 该指令会将所在环境下的所有文件添加到 /var/www/目录下.
我们可以将这个Dockerfile作为一个通用的Web应用程序的模板, 可以基于这个模板来构建Web应用程序.

基于A镜像去构建B镜像.
B镜像中的ONBUILD并不会渗透到其子镜像中.
即:基于B镜像构建C镜像, B镜像中的ONBUILD不会被调用.

如下指令不能用在ONBUILD指令中:

FROM, MAINTAINER, ONBUILD

推送

# docker login
# docker build -t="masterzcw/static_web:v1" .
# docker images
# docker push masterzcw/static_web

https://cloud.docker.com/repository/list
https://cloud.docker.com/repository/docker/masterzcw/static_web

删除线上镜像
https://cloud.docker.com/repository/docker/masterzcw/static_web/settings

运行自己的Doker Registry

$ docker run -p 5000:5000 registry
$ docker images
$ docker tag fff7f7723df2 docker.example.com:5000/masterzcw/static_web
$ docker push docker.example.com:5000/masterzcw/static_web
$ docker run -it docker.example.com:5000/masterzcw/static_web /bin/bash

构建静态站点环境

大体流程

创建文件夹
创建Dockerfile
准备要添加的文件(例如配置文件)
准备卷文件夹
创建镜像
创建容器
完成后查看结果

Sample网站的初始Dockerfile

# mkdir sample
# cd sample
# touch Dockerfile

获取Nginx配置文件

# cd sample
# mkdir nginx && cd nginx
# wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/global.conf
# wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/nginx.conf
# cd ..

Dockerfile的内容

# cd sample
# vim Dockerfile

FROM ubuntu:14.04
MAINTAINER James Turnbul "[email protected]"
ENV REFERSHED_AT 2014-06-01
RUN apt-get update && apt-get -y -q install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

global.conf的内容

server {
        listen          0.0.0.0:80;
        server_name     _;
        root            /var/www/html/website;
        index           index.html index.htm;
        access_log      /var/log/nginx/default_access.log;
        error_log       /var/log/nginx/default_error.log;
}

nginx.conf的内容

user www-data;
worker_processes 4;
pid /run/nginx.pid;
daemon off; #为保持Docker容器的活跃状态,阻止Nginx进入后台, 强制其在前台运行.
events {  }
http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
}

代码网站和Git仓库

http://www.dockerbook.com/code/index.html
http://github.com/jamtur01/dokerbook-code

构建Nginx镜像

构建镜像

# docker build -t masterzcw/sample .

查看构建的步骤和层级

# docker history masterzcw/sample

构建网站 & 容器

创建网站

# cd sample
# mkdir website && cd website
# wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/website/index.html
# cd ..

创建容器

# docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website masterzcw/sample nginx

*1.
-v 这个选项允许我们将宿主机的目录作为卷, 挂载到容器里.

*2.
可以看到, 在执行docker run时传入了nginx作为容器的启动命令.
一般情况下, 这个命令无法让nginx以交互的方式运行.
我们已经在提供给docker的配置里加入了指令"daemon off",
这个指令让Nginx启动后以交互的方式在前台运行.

*3.
在nginx配置里(golocal.conf), 已经指定了这个目录为服务器的工作目录.

展示运行结果

# docker ps -a

查看映射的端口, 在浏览器中 http://192.168.11.125:32768/ 即可看到站点中的静态页内容了

构建动态站点环境

DockerFile

FROM ubuntu
MAINTAINER James Turnbull "[email protected]"
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install ruby ruby-dev build-essential redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis
RUN mkdir -p /opt/webapp
EXPOSE 4567
CMD [ "/opt/webapp/bin/webapp" ]

# docker build -t masterzcw/sinatra .

构建文件夹内容

# mkdir webapp
# git clone https://github.com/turnbullpress/dockerbook-code

其中 dockerbook-code/code/5/sinatra/webapp 对应 /crr/centos7/sinatra/webapp
即:
sinatra
– DOckerfile
– webapp
– bin
– lib

# chmod +x $PWD/webapp/bin/webapp
# chmod +x /crr/centos7/sinatra/webapp/bin/webapp

创建镜像

# docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp masterzcw/sinatra
# docker exec -it webapp /bin/bash
# docker logs webapp
# docker logs -f webapp
# docker top webapp
# docker port webapp 4567
# crul -i -H 'Accept: application/json' \

-d ‘name=Foo&status=Bar’ http://localhost:49160/json
HTTP/1.1 200 OK
X-Content-Typ-Options: nosniff
Content-length:29
X-Frame-Options: SAMEORIGIN
Connection: Keep-Alive
Date: Mon, 05 Aug 2013 02:22:21 GMT
Content-Type: text/html;charset=utf-8
Server: WEBrick/1.3.1 (Ruby/1.8.7/2011-06-30)
X-Xss-Protection: 1; mode=block
{“name”:“Foo”,“status”:“Bar”}
之后看到输出: {“name”:“Foo”,“status”:“Bar”}就成功了

构建 Redis 镜像和容器

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull [email protected]
ENV REFRESHED_AT 2014-06-01
RUN apt-get update && apt-get install -y redis-server redis-tools
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server" ]
CMD []

命令

# docker build -t masterzcw/redis .
# docker run -d -p 6379 --name redis masterzcw/redis
# docker port redis 6379

网络配置

创建一个守护型容器

# docker run -id --name=ubuntu docker.io/ubuntu
# docker run -id -p 80 --name=ubuntu docker.io/ubuntu

登入容器

# docker exec -it ubuntu /bin/bash

Docker的iptables和NAT配置

# iptables -t nat -L -n

https://docs.docker.com/articles/networking/
查看容器的IP

# docker inspect redis
# docker inspect -f '{{ .NetworkSettings }}' redis
# docker inspect -f '{{ .NetworkSettings.IPAddress }}' redis

让Docker容器互联

# docker run -d --name redis masterzcw/redis

该容器并没有对外开放端口

# docker run -p 4567 \

–name webapp --link redis:db -it
-v $PWD/webapp:/opt/webapp masterzcw/sinatra
/bin/bash
开放4567端口,
-v卷挂载,
-link 容器:别名
创建了两个容器间的父子连接. 这个标志需要两个参数:
一个是要连接的容器名字, 另一个是连接后容器的别名.
这个例子中, 我们把新容器连接到redis容器, 并使用db作为别名.
别名让我们可以访问公开的信息, 而无须关注地城容器的名字.
连接让父容器有呢你访问子容器, 并把子容器的一些链接细节分享给父容器,
这些细节有助于配置用用程序并使用这个连接.
更妙的是, 只有使用–link标志连接到这个容器才能链接到这个端口.
容器的端口不需要对本地宿主机公开, 现在我们已经拥有一个非常安全的模型.
可以强制Docker只允许有连接的容器之间相互通信.
需要在启动Docker守护进程时加上–icc=false标志,
关闭所有没有连接的容器间的通信.
/bin/bash 可以查看容器是如何连接在一起的:

# cat /etc/hosts
# ping db #可以在执行docker run命令时使用-h或者--hostname标志来为容器设定主机名
# env
# docker ps -a

使用容器连接来通信, 如何使用这个链接呢?
参见: https//docs.docker.com/articles/networking/
. 使用环境变量里的一些连接信息
/opt/webapp/lib/app.rb

require ‘uri’

uri=URI.parse(ENV[‘DB_PORT’])
redis = Redis.new(:host => uri.host, :port => uri.port)

. 使用DNS和/etc/hosts信息
redis = Redis.new(:host => db, :port => ‘6379’)
测试连接

# crul -i -H 'Accept: application/json' -d 'name=Foo&status=Bar' http://localhost:49161/json

HTTP/1.1 200 OK
X-Content-Type-Options: nosniff
Content-Length: 29
X-Frame-Options: SAMEORIGIN
Connection: Keep-Alive
Date: Mon, 01 Jun 2014 02:22:21 GMT
Content-Type: text/html; charset=utf-8
Server: WEBrick/1.3.1 (Ruby/1.8.7/2011-06-30)
X-Xss-protection: 1; mode=block
{“name”:“Foo”, “status”:“Bar”}

# curl -i http://localhost:49161/json "[{\"name\":\"Foo\",\"status\":\"Bar\"}]"

持续集成1

  1. Jekyll基础镜像
# mkdir jekyll
# cd jekyll
# vim Dockerfile

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install ruby ruby-dev make nodejs
RUN gem install --no-rdoc --no-ri jekyll
VOLUME /data
VOLUME /var/www/html
WORKDIR /data/
ENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ]
    # docker build -t masterzcw/jekyll .
    # docker images

002. Apache镜像

# mkdir apache
# cd apache
# vim Dockerfile

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install apache2
VOLUME [ "/var/www/html" ]
WORKDIR /var/www/html
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www_data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/RUN/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/apache2" ]
CMD ["-D", "FOREGROUND"]
# docker build -t masterzcw/apache .
# docker images
# cd $HOME
# git clone https://github.com/jamtur01/james_blog.git
# docker run -v /home/james/james_blog:/data/ --name james_blog jamtur01/jekyll
# docker run -d -P --volumes-from james_blog jamtur01/apache
# docker port 09a570cc2267 80
# vim james_blog/_config.yml #可以更改这个文件的内容 修改更新到网站只需要从起容器
# docker start james_blog
# docker logs james_blog

创建容器用来备份卷: --rm只用一次的容器, tar cvf这个命令会创建一个名为jams_blog_backup.tar的卷备份.

# docker run --rm --volumes-from james_blog -v $(pwd):/backup ubuntu \

tar cvf /backup/james_blog_backup.tar /var/www/html

# ls james_blog_backup.tar

持续集成2

WAR文件的获取器

# mkdir fetcher
# cd fetcher
# touch Dockerfile

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqqupdate
RUN apt-get -yqq install wget
VOLUME ["/var/lib/tomact7/webapps"]
WORKDIR /var/lib/tomcat7/webapps/
ENTRYPOINT ["wget"]
CMD ["-?"]

该镜像只做了一件事:
容器执行时, 使用wget从指定的URL获取文件并把保存在/var/lib/tomcat7/webapps/目录.
这个目录也是一个卷, 并且是所有容器的工作目录. 然后我们会把这个卷共享给Tomcat服务器并且运行里面的内容.
最后, 如果没有指定RUL, ENTRYPOIN和CMD指令会让容器运行, 在容器不带URL运行的时候, 这两条指定通过返回wget帮助来做到这一点.
# docker build -t masterzcw/fetcher .
# docker run -it --name sample masterzcw/fetcher \

https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample/war
–2014-06-21 06:05:19-- https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample/war

Tomecat7应用服务器

# mkdir tomcat
# cd tomcat7

Dokerfile

FORM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install tomcat7 default-jdk
ENV CATALINA_HOME /usr/share/tomact7
ENV CATALINA_BASE /var/lib/tomcat7
ENV CATALINAPID /var/run/tomcat7.pid
ENV CATALINA_SH /usr/share/tomcat7/bin/catalina.sh
ENV CATALINA_TMPDIR /tmp/tomcat7-tomcat7-tmp
RUN mkdir -p $CATALINA_TMPDIR
VOLUME [ "/var/lib/tomcat7/webapps/" ]
EXPOSE 8080
ENTRYPOINT [ "/usr/share/tomcat7/bin/catalina.sh", "run" ]
# docker build -t masterzcw/tomcat7 .
# docker run --name sample_app --volumes-from sample -d -P masterzcw/tomcat7
# docker port sample_app 8080
# apt-get -yqq install ruby make ruby-dev
# gem install --no-rdoc --no-ri tprov

多容器应用栈

Node.js镜像

# mkdir nodejs
# cd nodejs
# mkdir -p nodeapp
# cd nodeapp
# wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/6/node/nodejs/nodeapp/package.json
# wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/6/node/nodejs/nodeapp/server.js
# cd ..

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install nodejs npm
RUN ln -s /usr/bin/nodejs /usr/bin/node
RUN mkdir -p /var/log/nodeapp
ADD nodeapp /opt/nodeapp/
WORKDIR /opt/nodeapp
RUN npm install
VOLUME [ "/var/log/nodeapp" ]
EXPOST 3000
ENTRYPOINT [ "nodejs", "server.js" ]
    # docker build -t masterzcw/nodejs .

Redis基础镜像

# mkdir redis_base
# cd redis_base

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update
RUN apt-get install -yqq software-properties-common python-software-properties
RUN add-apt-repository ppa:chris-lea/redis-server
RUN apt-get -yqq update && apt-get -yqq install redis-server redis-tools
VOLUME [ "/var/lib/redis", "/var/log/redis/" ]
EXPOSE 6379
    # sudo docker build -t masterzcw/redis .

Redis主镜像

# mkdir redis_primary
# cd redis_primary

Dockerfile

FROM masterzcw/redis
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
ENTRYPOINT [ "redis-server", "--logfile /var/log/redis/redis-server.log" ]
    # docker duild -t masterzcw/redis_primary

Redis从镜像

# mkdir redis_replica
# cd redis_replica

Dockerfile

FROM masterzcw/redis
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
ENTRYPOIN [ "redis-server", "--logfile /var/log/redis/redis-replica.log", "--slaveof redis_primary 6379" ]
# docker duild -t masterzcw/redis_replica .\

创建Redis后端集群

# docker run -d -h redis_primary --name redis_primary masterzcw/redis_primary
# docker logs redis_primary
# docker run -it --rm --volumes-from redis_primary ubuntu cat /var/log/redis/redis-server.log
# docker run -d -h redis_replical --name redis_replical --link redis_primary:redis_primary masterzcw/redis_replica
# docker run -it --rm --volumes-from redis_replical ubuntu cat /var/log/redis/redis-replica.log
# docker run -d -h redis_replica2 --name redis_replica2 --link redis_primary:redis_primary masterzcw/redis_replica
# docker run -it --rm --volumes-from redis_replica2 ubuntu cat /var/log/redis/redis-replica.log

现在可以确保Redis服务万无一失

创建Node容器

# docker run -d  --name nodeapp -p 3000:3000  --link redis_primary:redis_primary  masterzcw/nodejs
# docker logs nodeapp

浏览器->http://docker.example.com:3000

# mkdir logstash
# cd logstash

Dockerfile

FROM ubuntu
MAINTAINER James Turnbull 
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update
RUN apt-get -yqq install wget
RUN wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add - 
RUN echo 'deb http://packages.elasticearch.org/logstash/1.4/debian stable main' > /etc/apt/sources.list.d/logstash.list
RUN apt-get -yqq update && apt-get -yqq install logstash
ADD logstash.conf /etc/
WORKDIR /opt/logstash
ENTRYPOINT [ "bin/logstash" ]
CMD [ "--config=/etc/logstash.conf" ]

命令行

# docker build -t masterzcw/logstash .
# docker run -d --name logstash --volumes-form redis-primary --volumes-form nodeapp masterzcw/logstash
# docker logs -f logstash
# docker kill -s  
# docker run -v /usr/local/bin:/target jpetazzo/nsenter
# nsenter --target $PID --mount --uts --ipc --net --pid

你可能感兴趣的:(Docker)