Docker构建并测试Web应用程序
2016-07-11 15:44
781 查看
Dockerfile
FROM ubuntu:14.04 MAINTAINER juedaiyuer "juedaiyuer@gmail.com" ENV REFRESHED_AT 2016-07-10 RUN apt-get update RUN apt-get install -y 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" ] #构建新的sinatra镜像 $ sudo docker build -t juedaiyuer/sinatra . gem install json ERROR: Error installing json: json requires Ruby version ~> 2.0.
创建Sinatra容器
#sinatra web应用程序的源代码---sinatra/webapp/bin lib #确保webapp/bin/webapp可以执行 #启动第一个sinatra容器 #没有在命令行中指定命令,而是在dockerfile中的CMD指定 $ sudo docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp juedaiyuer/sinatra #查看执行的命令都输出了什么 $ sudo docker logs webapp #类似于tail -f $ sudo docker logs -f webapp #列出sinatra进程 $ sudo docker top webapp #检查sinatra的端口映射 $ sudo docker port webapp 4567 #测试Sinatra应用程序 $ curl -i -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:32773/json HTTP/1.1 200 OK Content-Type: text/html;charset=utf-8 Content-Length: 29 X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Server: WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22) Date: Mon, 11 Jul 2016 02:29:19 GMT Connection: Keep-Alive {"name":"Foo","status":"Bar"}
构建Redis镜像和容器
FROM ubuntu:14.04 MAINTAINER juedaiyuer "juedaiyuer@gmail.com" ENV REFRESHED_AT 2016-07-10 RUN apt-get update RUN apt-get -y install redis-server redis-tools EXPOSE 6379 ENTRYPOINT ["/usr/bin/redis-server"] CMD [] $ sudo docker build -t juedaiyuer/reids . $ sudo docker run -d -p 6379 --name redis juedaiyuer/redis #查看端口 $ sudo docker port redis 6379 #本地安装Redis客户端测试,客户端程序一般在redis-tools $ sudo apt-get -y install redis-tools #测试连接到Redis服务器 $ sudo redis-cli -h 127.0.0.1 -p 32768 127.0.0.1:32768>
两容器的连接
更新Sinatra应用程序,让其连接到Redis并存储传入的参数,需要与Redis服务器对话Docker网络栈-内部网络
安装docker时,会创建一个新的网络接口,叫docker0;每个容器都会在这个接口上分配一个IP地址$ ip a show docker0 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:66:f4:4d:54 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:66ff:fef4:4d54/64 scope link valid_lft forever preferred_lft forever
docker0接口符合RFC1918的私有IP地址,范围是172.16~172.30
接口本身的地址127.17.42.1,即这个Docker网络的网关地址
默认172.17.x.x作为子网地址,如果被占用,会尝试其它范围
虚拟的以太网桥,用于连接容器和本地宿主网络
容器里内的eth0接口
$ sudo docker run -t -i ubuntu /bin/bashroot@d74391e80f73:/# ip a show eth0
11: eth0@if12:
配置建立连接
#Docker的iptables和NAT配置
连接Redis
#查看Redis容器的网络配置 $ sudo docker inspect redis "NetworkSettings": { "Bridge": "", "SandboxID": "41329028a8fffcc4f5c46f22e4f3c9453afcd37aa54dd7ae1a138b246e2ec447", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "6379/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "32768" } ] }, ... #查看Redis容器的IP地址 $ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' redis 172.17.0.2 $ redis-cli -h 172.17.0.2 172.17.0.2:6379>
要在应用程序里对Redis容器的IP地址做硬编码
重启容器,Docker会改变容器的IP地址
让Docker容器互连
#启动另一个Redis容器 #测试前,需要删除重名容器 $ sudo docker run -d --name juedaiyuer/redis #连接Redis容器 $ sudo docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp juedaiyuer/sinatra /bin/bash #查看连接信息 root@08d78050e896:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 db f1c6804d67e9 redis 172.17.0.3 08d78050e896 #显示用于连接的环境变量 root@08d78050e896:/# env HOSTNAME=08d78050e896 DB_NAME=/webapp/db DB_PORT_6379_TCP_PORT=6379 TERM=xterm DB_PORT=tcp://172.17.0.2:6379 DB_PORT_6379_TCP=tcp://172.17.0.2:6379 ... PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin REFRESHED_AT=2016-07-10 PWD=/ DB_PORT_6379_TCP_ADDR=172.17.0.2 DB_PORT_6379_TCP_PROTO=tcp SHLVL=1 HOME=/root LESSOPEN=| /usr/bin/lesspipe %s LESSCLOSE=/usr/bin/lesspipe %s %s _=/usr/bin/env #通过环境变量建立到Redis的连接 #web应用程序的lib/app.rb require "rubygems" require "sinatra" require "json" class App < Sinatra::Application set :bind, '0.0.0.0' get '/' do "<h1>DockerBook Test Sinatra app</h1>" end post '/json/?' do params.to_json end end #使用本地DNS #启动支持Redis的Sinatra应用程序 root@08d78050e896:~# nohup /opt/webapp/bin/webapp & [1] 30 root@08d78050e896:~# nohup: ignoring input and appending output to 'nohup.out' #测试支持Redis的Sinatra应用程序 $ curl -i -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:32777/json HTTP/1.1 200 OK Content-Type: text/html;charset=utf-8 Content-Length: 29 X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Server: WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22) Date: Mon, 11 Jul 2016 06:58:15 GMT Connection: Keep-Alive {"name":"Foo","status":"Bar"} #确认Redis存储了相关数据
相关文章推荐
- docker4dotnet #1 – 前世今生 & 世界你好
- docker常用命令详解
- docker 使用教程(2)常用命令
- docker4dotnet #1 – 前世今生 & 世界你好
- docker4dotnet #1 – 前世今生 & 世界你好
- docker4dotnet #1 – 前世今生 & 世界你好
- 基于Docker服务的java Web服务搭建
- Docker Registry——搭建专属的容器仓库
- docker在windows上为啥需要虚拟化。
- docker安装。
- docker镜像
- 不小心一个命令触及到了Docker的底限了,他爆发了
- docker : etcd +flannel 多机互联
- docker 镜像生成
- dockers
- Docker使用---静态网站测试
- 轻松搭建docker应用的mesos集群
- Docker distrubution in django
- docker的一些常用命令整理
- web项目docker化的两种方法