Docker学习(2)构建并测试Web应用程序

来源:互联网 发布:网络小胖的电视 编辑:程序博客网 时间:2024/06/05 09:08

一、简介

上一篇,我们已经运用docker构建了nginx的web应用,根据书本上的步骤,继续构建Web应用程序。

二、构建Sinatra应用程序

1.mkdir -p sinatra && cd sinatra (mkdir -p 指递归创建目录,如:mkdir -p aa/bb/cc)

2.touch Dockerfile(备注:书本上的dockerfile内容执行完毕后是不对的,redis会报错),更正后的如下:

#书本上的Dockerfile内容,build后会报错,从网上找了资料,现将内容变更为:FROM rubyMAINTAINER James Turnbull james@example.comENV REFRESHED_AT 2014-6-1RUN apt-get updateRUN apt-get -y install ruby-dev build-essential redis-toolsRUN gem install --no-rdoc --no-ri sinatra json redisRUN mkdir -p /opt/webappRUN cp /usr/local/bin/ruby /usr/bin/rubyEXPOSE 4567CMD ["/opt/webapp/bin/webapp"]
3.构建命令:sudo docker build -t jamtur01/sinatra .


可以看到名为xxx/sinatra的镜像文件

4.下载Sinatra Web应用的源代码:

cd sinatra

wget --cut-dirs=3 -nH -r --reject Dockerfile,index.html –-noparent http://dockerbook.com/code/5/sinatra/webapp/

chmod +x webapp/bin/webapp

5.跑起来:sudo docker run -d -p 4567 --name webapp -v $PWD/webapp/:/opt/webapp jamtur01/sinatra

我的命令是:(docker run -d -p 54567:4567 --name webapp -v $PWD/webapp/:/opt/webapp xxx/sinatra)

【xxx/sinatra是镜像名,如果不规定port,如54567,系统会自动配置一个port】

6.docker logs webapp,查看被执行的命令都输出了什么?(docker top webapp等)


7.测试:curl -i -H 'Accept: application/json' -d 'name=Foo&status=Bar' http://localhost:54567/json



三、扩展Sinatra应用程序来使用Redis

不用按照书上的代码去wget内容了,我们在上一次wget的时候已经将文件都down下来了。

 <--如图~

1.cd sinatra/redis

vim Dockerfile,内容为:

#按照书上的内容:FROM ubuntu:14.04MAINTAINER James Turnbull "james@example.com"ENV REFRESHED_AT 2014-06-01RUN apt-get -yyq update && apt-get -yqq install redis-server redis-toolsEXPOSE 6379ENTRYPOINT [ "/usr/bin/redis-server" ]CMD []

命令:docker build -t xxx/redis .
执行完毕后:

2.跑起来试试:docker run -d -p 6379 --name redis jamtur01/redis

由于操作服务器上已经在运行redis服务了,为了区分,本地执行命令为:

docker run -d -p 56379:6379 --name redis xxx/redis

执行成功,如图:


我们可以利用reids的工具来测试docker构建的端口为56379的redis服务。

 连接OK~


四、将Sinatra应用程序连接到Redis容器

容器之间的连接用网络创建,这被称为Docker Networking,也是Docker1.9发布版本中的一个新特性。
Docker Networking允许用户创建自己的网络,容器可以通过这个网上互相通信。
实质上,Docker Networking以新的用户管理的网络补充了现有的docker0。
更重要的是,现在容器可以跨越不同的宿主机来通信,并且网络配置可以更灵活地定制。
Docker注意Networking也和Docker Compose以及Swarm进行了集成,第7章将对Docker Compose和Swarm进行介绍。

【悲剧了,本地是docker1.7.1的】


本地重新在虚拟机中安装centos7.X,docker版本也成了1.12.6.


额,继续~

相关命令,可以操作试试

1.ip a show docker0

2.docker run -it ubuntu /bin/bash

2.1. apt-get -yqq update && apt-get install -yqq traceroute

2.2. traceroute baidu.com

2.3. exit

3.iptables -t nat -L -n

4.docker inspect redis

五、Docker Networking

1.docker network create app

2.docker network inspect app


3.docker network ls 列出所有的network信息


4.docker network rm xxx 删除一个docker网络

5.先从启动redis容器开始,在之前创建的app网络中添加一些容器,

docker run -d --net=app --name db smart/redis


6.增加一个运行启用了Redis的Sinatra应用程序的容器,要做到这一点,需要先回到sinatra/webapp目录下

6.1.cd sinatra/webapp

6.2.docker run -p 54567:4567 --net=app --name webapp -t -i -v $PWD/webapp:/opt/webapp smart/sinatra /bin/bash

因为之前已经创建过一个叫webapp的容器,所以这里删除了重新生成。如图:


7.cat /etc/hosts,不知道为啥列表中没有db.app的信息,但是ping db.app可行?


8.另外开一个窗口执行

8.1.curl -i -H 'Accept: application/json' -d 'name=Foo&status=Bar' http://localhost:54567/json

8.2.curl -i http://localhost:54567/json

8.1可以成功,8.2与redis配置这块没有成功,待研究


9.将已有容器连接到Docker网络

docker network connect app app2,即将app和app2进行连接

10.通过Docker链接连接容器(先删除之前创建的容器)

10.1. docker stop 容器1 容器2 && docker rm 容器1 容器2

10.2. docker run -d --name redis smart/redis

10.3. docker run -p 54567:4567 --name webapp --link redis:db -it -v $PWD/webapp_redis:/opt/webapp smart/sinatra /bin/bash

10.4. nohup /opt/webapp/bin/webapp &(如果遇到权限问题,请检查本地webapp_redis下的目录级别)

10.5. 新开一个浏览器

curl -i -H 'Accept: application/json' -d 'name=Foo&status=Bar' http://localhost:54567/json

10.6. curl -i http://localhost:54567/json (这次算是成功了)

下一节是docker持续集成,构建docker和Jenkins服务器



新手一枚,欢迎拍砖~ ~ ~



































原创粉丝点击