自由街头篮球手游的数据用手机可以查看么

> 博客详情
摘要: 记录在开发和测试流程中使用Docker,主要有建立一个静态的web服务、一个动态的web服务和建立Jenkins测试环境。
5.1 使用Docker测试静态网站(Nginx)
将项目命名为Sample
首先建立构建环境
mkdir sample
touch Dockerfile
在构建环境中下载作者配置好的两个nginx配置文件:
mkdir nginx && cd nginx
wget /jamtur01/dockerbook-code/master/code/5/sample/nginx/global.conf
wget /jamtur01/dockerbook-code/master/code/5/sample/nginx/nginx.conf
写Dockerfile
FROM ubuntu:14.04
MAINTAINER Ivan Jiangzhi ""
ENV REFRESHED_AT
RUN apt-get update
RUN 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
在nginx.conf配置文件中选项阻止Nginx进入后台,强制其在前台运行。这是因为想要保持Docker容器的活跃状态,需要其中运行的进程不能中断。默认情况下,Nginx会以守护进程的方式启动,这会导致容器只是短暂运行,在守护进程被fork启动后,发起守护进程的原始进程就会退出,这时容器就停止了。
构建Sample
docker build -t ivan/nginx .
构建完成后可使用docker history查看构建步骤:
docker history ivan/nginx
下载作者写好的html(或者自己写一个也可以)
mkdir website && cd website
wget /jamtur01/dockerbook-code/master/code/5/sample/website/index.html
创建容器并运行
docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website ivan/nginx nginx
-v 选项将宿主机的目录作为卷挂载到容器里。
卷是在一个或者多个容器内被选定的目录,可以绕过分层的联合文件系统,为Docker提供持久数据或者共享数据。这意味着对卷的修改会直接生效并绕过镜像。当提交或者创建镜像时,卷不被包含在镜像里。
在下面的时候可以考虑使用卷:
希望同时对代码作开发和测试;
代码改动很频繁,不想在开发过程中重构镜像;
希望在多个容器间共享代码。
-v 指定了卷的源目录(宿主机目录)和容器里的目录,这两个目录用:分割。如果目的目录不存在,Docker会自动创建一个。
也可以通过在目的目录后面加上rw或者ro来指定目的目录的读写状态:
docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website:ro ivan/nginx nginx
上例使目的目录变成只读状态。
docker run成功后在浏览器中访问 宿主机IP:映射端口即可看到页面,修改$PWD/website/index.html保存后刷新浏览器即时生效。
5.2 构建并测试Web应用程序(Sinatra + Redis)
1、构建Sinatra应用程序
创建sinatra构建环境:
mkdir sinatra
cd sinatra
touch Dockerfile
编写Dockerfile,书上的例子:
FROM ubuntu:14.04
MAINTAINER James Turnbull
ENV REFRESHED_AT
RUN apt-get update
RUN apt-get -y 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 ivan/sinatra .
2、创建Sinatra容器
下载作者编写的Sinatra Web应用程序的源码:
wget --cut-dirs=3 -nH --no-parent --no-check-certificate /code/5/sinatra/webapp/
使用书中的命令下载时会报错,按报错的提示加入--no-check-certificate参数后成功下载。
为webapp/bin/webapp添加执行权限:
chmod +x $PWD/webapp/bin/webapp
启动容器并把$PWD/webapp按卷挂在到容器中:
docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp ivan/sinatra
我在操作时遇到的问题和解决方法
构建时会报错,说安装的ruby是1.9版本,而gem install json需要2.0以上的版本。
我直接从ruby镜像构建,去掉apt-get ruby的安装,容器可以正常构建。但是启动时会包找不到/opt/webapp/bin/webapp的错误,执行的权限已经添加,/bin/bash命令启动容器发现webapp用/usr/bin/ruby启动,但是容器里的ruby在/usr/local/bin/ruby,所以在构建时添加cp命令。我的Dockerfile如下:
MAINTAINER James Turnbull
ENV REFRESHED_AT
RUN apt-get update
RUN apt-get -y install ruby-dev build-essential redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis
RUN mkdir -p /opt/webapp
RUN cp /usr/local/bin/ruby /usr/bin/ruby
EXPOSE 4567
CMD ["/opt/webapp/bin/webapp"]
启动成功后查看执行命令的输出:
docker logs webapp
查看容器运行的进程:
docker top webapp
查看容器的4567端口映射到宿主机的端口:
docker port webapp 4567
测试Sinatra应用的运行情况,假设映射到宿主机的端口为49160(它接收输入参数,并将其转化为Json返回):
curl -l -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:49160/json
3、构建Redis镜像和容器
创建redis构建环境:
mkdir redis
touch Dockerfile
redis Dockerfile的内容:
FROM ubuntu:14.04
MAINTAINER James Turnbull
ENV REFRESHED_AT
RUN apt-get update
RUN apt-get -y install redis-server redis-tools
EXPOSE 6379
ENTRYPOINT ["/user/bin/redis-server"]
构建redis镜像:
docker build -t ivan/redis .
创建并启动redis容器:
docker run -d -p 6379 --name redis ivan/redis
查看容器 6379端口映射到宿主机上的哪个端口:
docker port redis 6379
然后在宿主机上使用redis-cli测试redis-server在容器中的运行情况:
sudo apt-get -y install redis-tools
redis-cli -h 127.0.0.1 -p 49161
(假设容器的6379端口映射到了宿主机的49161端口上)。
我在宿主机的ubuntu上使用apt-get -y install redis-tools报无法定位redis-tools packages的错误,直接apt-get -y install&redis-server 后可以使用redis-cli。
4、连接到Redis容器
一般有两种方法实现容器间的网络连接:
第一,Docker容器公开端口并绑定到本地网络接口,这样可以把容器里的服务在本地Docker宿主机所在的外部网络上公开(比如,把容器里的80端口绑到本地宿主机的高端口上)。
第二,内部网路。在安装Docker时,会创建一个新的网络接口,名字是docker0。docker0接口有符合RFC1918的私有IP地址,范围是172.16~172.30。docker0接口本身的地址是这个Docker网络的网关地址,也是所有Docker容器的网关地址。Docker默认会使用172.17.x.x作为子网地址,如果这个子网被占用,会在172.16~172.30这个范围内尝试创建子网。接口docker0是一个虚拟的以太网桥,用于连接容器和本地宿主网络。Docker宿主机的会有一系列名字以veth开头的接口,Docker每创建一个容器就会创建一组互联的网络接口。这组接口就像管道的两端,其中一端作为容器里的eth0接口,而另一端统一命名为以veth开头的名字,作为宿主机的一个端口。通过把每个veth*接口绑定到docker0网桥,Docker创建了一个虚拟子网,这个子网由宿主机和所有的Docker容器共享。
在运行的容器内部查看一下对望通信的路由信息,发现容器地址后的下一跳就是宿主网络上docker0的地址:
apt-get -yqq update && apt-get install -yqq traceroute
(3)Docker网络还有另外一个部分的配置才能允许建立连接:防火墙规则和NAT配置。这些配置允许Docker在宿主网络和容器间路由。在宿主机上查看IPTables NAT配置:
sudo iptables -t nat -L -n
容器默认是无法访问的。从宿主网络与容器通信时,必须明确指定打开的端口。
5、连接Redis
用docker inspect查看Redis容器的网络配置:
docker inspect redis
该命令展示了Docker容器的细节,包括配置信息和网络状况。可以使用-f标志只获取IP地址:
docker inspect -f '{{.NetworkSettings.IPAddress}}' redis
如果Docker宿主机运行在本地,可以直接使用Redis服务器的IP地址与Redis服务器通信。
这个方法有两个问题:第一,要在应用程序里对Redis容器的IP地址做硬编码;第二,如果重启容器,Docker可能会改变容器的IP地址。
6、让Docker容器互连
删除之前运行的redis容器和webapp容器:
docker rm -f webapp
docker rm -f redis
新建一个redis容器,与之前不同的是并不公开任何端口:
docker run -d --name redis ivan/redis
启动Web应用程序容器,并把它连接到新的Redis容器上去:
docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp ivan/sinatra /bin/bash
--link编制创建了两个容器间的父子连接。这个标志需要两个参数:一个是要连接的容器名字,另一个是连接后容器的别名。这个例子中,把新容器连接到redis容器,并使用db作为别名。连接让父容器有能力访问子容器,并把子容器的一些连接细节分享给父容器,这些细节有助于配置应用程序并使用这个连接。(新创建的容器时父容器,连接到的容器时子容器)
连接也能得到一些安全上的好处。容器的端口不需要对本地宿主机公开。
出于安全原因,可以强制Docker只允许有连接的容器之间相互通信,需要在启动Docker守护进程时加上--icc=false标志,关闭所有没有连接的容器间的通信。
也可以把多个容器连接在一起。比如,如果想让这个Redis实例服务于多个Web应用程序,可以把每个Web应用程序的容器和同一个redis容器连接在一起。
被连接的容器必须运行在同一个Docker宿主机上。不同Docker宿主机上运行的容器无法连接。
Docker在父容器里的以下两个地方写入了连接信息:
/etc/hosts文件中;
包含连接信息的环境变量中。
/etc/hosts文件中有连接指令创建的项,是redis容器的IP地址和该连接的对应的子容器别名。
如果重启了容器,容器的IP地址可能会发生变化。从Docker1.3开始,如果被连接的容器重启了,/etc/host文件中的IP地址会被新的IP地址更新。
在bash环境中运行env查看环境变量,可以看到一些以DB开头的环境变量。Docker在连接webapp和redis容器时,自动创建了以DB开头的环境变量。DB是创建连接时的子容器别名。这些环境变量主要包含以下信息:
子容器的名字;
子容器里运行服务使用的协议、IP和端口号;
子容器里由Docker设置的环境变量的值。
这些环境变量会随容器不同而变化,取决于子容器是如何配置的。
7、测试容器连接情况
需要下载作者代码/code/5/sinatra/webapp_redis中的内容替换原sinatra/webapp的内容,然后后台启动webapp容器的/opt/webapp/bin/webapp。向web服务提交数据(假设映射到宿主机的端口是49160):
curl -l -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:49160/json
用get方法测试提交情况:
cuil -i http://localhost:49160/json
5.3 Docker用于持续集成(Jenkins)
1、构建Jenkins和Docker容器
书中代码的Dockerfile无法构建成功,可能是由于版本升级造成的。去Github上下载更新过的代码把 5/jenkins/Dockerfile和dockerjenkins.sh放入构建环境的文件夹中。
Dockerfile中使用了VOLUME指令。从容器运行的宿主机上挂载一个卷。
构建成功后启动容器:
docker run -p
--name jenkins --privileged -d ivan/dockerjenkins
这里使用了一个新标志--privileged,它可以启动Docker的特权模式,允许我们以其宿主机具有的所有能力来运行容器,包括一些内核特性和设备访问。这是可以在Docker中运行Docker的必要能力。
让Docker在特权模式运行会有一些安全隐患。在这种模式下运行容器对Docker宿主机有root访问权限。
接下来是一些Jenkins的细节,笔记中略。
人打赏支持
码字总数 87140
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥966,690 四月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
Docker在生产环境的挑战和应对
Docker在生产环境的挑战和应对
道AI风控、Serverless架构、EB级存储引擎,尽在!
在当前Docker火热的背后,实际真正应用到生产环境的案例却并不多。但从实际使用过程中,以及对目前已经在生产环境运行Docker的用户调研的结果看,Docker本身的稳定性表现尚可。本次演讲分析了是什么原因阻挡了Docker在生产环境的采纳,并指出了采纳Docker对企业内部IT流程的影响,本次分享亦可以看作是企业在生产环境采纳Docker的快速指南。
王利俊,现在是云栈科技联合创始人兼CEO,曾经是新浪SAE PaaS创始人,拥有超过十年的PaaS以及运维经验。现专注于Docker容器在企业生产环境的实践工作,而云栈科技也是国内第一家基于Docker的创业公司。
相关厂商内容
相关赞助商
ArchSummit深圳-8日,深圳&华侨城洲际酒店,
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
不再错过InfoQ编辑特稿
“当你不知道某件事情的时候,你很难意识到。”想要改变?看看InfoQ编辑们的推荐内容吧。
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。}

我要回帖

更多关于 街头篮球手游 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信