Docker构建并测试Web应用程序

来源:互联网 发布:淘宝服务中心首页 编辑:程序博客网 时间:2024/06/05 06:13

Dockerfile

FROM ubuntu:14.04MAINTAINER juedaiyuer "juedaiyuer@gmail.com"ENV REFRESHED_AT 2016-07-10RUN apt-get updateRUN apt-get install -y ruby ruby-dev build-essential redis-toolsRUN gem install --no-rdoc --no-ri sinatra json redisRUN mkdir -p /opt/webappEXPOSE 4567CMD [ "/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/jsonHTTP/1.1 200 OK Content-Type: text/html;charset=utf-8Content-Length: 29X-Xss-Protection: 1; mode=blockX-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINServer: WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)Date: Mon, 11 Jul 2016 02:29:19 GMTConnection: Keep-Alive{"name":"Foo","status":"Bar"}

构建Redis镜像和容器

FROM ubuntu:14.04MAINTAINER juedaiyuer "juedaiyuer@gmail.com"ENV REFRESHED_AT 2016-07-10RUN apt-get updateRUN apt-get -y install redis-server redis-toolsEXPOSE 6379ENTRYPOINT ["/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 32768127.0.0.1:32768> 

两容器的连接

更新Sinatra应用程序,让其连接到Redis并存储传入的参数,需要与Redis服务器对话

Docker网络栈-内部网络

安装docker时,会创建一个新的网络接口,叫docker0;每个容器都会在这个接口上分配一个IP地址

$ ip a show docker04: 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/bash
    root@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 }}' redis172.17.0.2$ redis-cli -h 172.17.0.2172.17.0.2:6379> 
  1. 要在应用程序里对Redis容器的IP地址做硬编码
  2. 重启容器,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/hosts127.0.0.1   localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.2  db f1c6804d67e9 redis172.17.0.3  08d78050e896#显示用于连接的环境变量root@08d78050e896:/# envHOSTNAME=08d78050e896DB_NAME=/webapp/dbDB_PORT_6379_TCP_PORT=6379TERM=xtermDB_PORT=tcp://172.17.0.2:6379DB_PORT_6379_TCP=tcp://172.17.0.2:6379...PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binREFRESHED_AT=2016-07-10PWD=/DB_PORT_6379_TCP_ADDR=172.17.0.2DB_PORT_6379_TCP_PROTO=tcpSHLVL=1HOME=/rootLESSOPEN=| /usr/bin/lesspipe %sLESSCLOSE=/usr/bin/lesspipe %s %s_=/usr/bin/env#通过环境变量建立到Redis的连接#web应用程序的lib/app.rbrequire "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  endend#使用本地DNS#启动支持Redis的Sinatra应用程序root@08d78050e896:~# nohup /opt/webapp/bin/webapp &[1] 30root@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/jsonHTTP/1.1 200 OK Content-Type: text/html;charset=utf-8Content-Length: 29X-Xss-Protection: 1; mode=blockX-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINServer: WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)Date: Mon, 11 Jul 2016 06:58:15 GMTConnection: Keep-Alive{"name":"Foo","status":"Bar"}#确认Redis存储了相关数据
0 0
原创粉丝点击