查看系统版本, cup位数等
$ uname -a
$ 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
$ 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"]
}
$ service docker stop
$ service docker start
$ /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 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 宿主机:容器 …
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
准备要添加的文件(例如配置文件)
准备卷文件夹
创建镜像
创建容器
完成后查看结果
# mkdir sample
# cd sample
# touch Dockerfile
# 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 ..
# 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
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;
}
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;
}
http://www.dockerbook.com/code/index.html
http://github.com/jamtur01/dokerbook-code
构建镜像
# 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”}就成功了
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\"}]"
# 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
# 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
# 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 .
# 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 .
# 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
# 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 .\
# 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服务万无一失
# 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