docker搭建静态网站和web应用程序 网络连通

docker搭建一个静态网站
1 基础目录与文件准备
mkdir sample
cd sample
touch Dockerfile
mkdir nginx && cd nginx
touch global.conf
写入如下内容:
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;
}

touch nginx.conf
写入如下内容:
user www-data;
worker_process 4;
pid /run/nginx.pid;
daemon off;
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/default_access.log;
    error_log /var/log/nginx/default_error.log;
    gzip on;
    gzip_disbale "msie6";
    include /etc/nginx/conf.d/*.conf;
}
nginx.conf中的daemon off选项,阻止nginx进入后台,强制在前台运行。这是为了保持docker容器的活跃状态。默认nginx以守护进程方式启动,容器只是短暂运行。

2 Dockerfile书写
vi Dokcerfile,内容如下:
FROM ubuntu:14.04
MAINTAINER mazhen "mz@example.com"
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install nginx
RUN mkdir -p /var/www/html/website
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
说明,操作主要为:
1)nginx安装
2)容器中创建目录/var/www/html/website
3)本地文件的nginx配置文件添加到镜像中
4)公开镜像的80端口

3 构建镜像
docker build -t mazhen/nginx .
说明 docker history mazhen/nginx 可以查看构建镜像的步骤和层级

4 构建容器
在sample目录下:
mkdir website && cd website
touche index.html
vi index.html
内容如下:
this  is  a test website

docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website mazhen/nginx nginx
说明:
从mazhen/nginx这个镜像创建了名为website的容器
-v $PWD/website:/var/html/website 将$PWD/website挂在到容器的/var/html/website目录,在nginx的global.conf中制定了该目录为ngixn服务器的工作目录。

-v 将宿主机的目录作为卷 挂在到容器中。
卷的概念:卷是在一个或多个容器中被选定的目录,可以绕过分层的联合文件系统,为docker提供持久数据或者共享数据。所以对卷的修改立刻生效,且不会被提交到镜像中。即使容器停止,卷里面的内容依旧存在。
满则不想把应用或代码构建到镜像中的要求。

说明:此时如果修改$PWD/website中的文件,则可以立刻生效。


使用docker构建web应用程序
mkdir -p sinatra
cd sinatra
vi Dockerfile
内容如下:
FROM ubuntu:14.04
MAINTAINER mazhen "mz@example.com"
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install ruby rudy-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"]
说明:安装了ruby rubyGem,并使用Gem安装了sinatra\json\redis gem

构建镜像
docker build -t mazhen/sinatra .

创建容器
cd sinatra
wget --cut-dirs=3 -nH -r --reject Dokcerfile,index.html --no-parent http://dockerbook.com/code/5/sinatra/webapp/
ls -l webapp
chmod +x webapp/bin/webapp

docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp mazhen/sinatra

获取docker容器中的日志
docker logs webapp
docker logs -f webapp
docker top webapp
docker port webapp 


扩展sinatra应用程序-引入redis
1)下载新版本的sinatra程序
2)创建redis数据库的镜像和容器
并利用Docker的特性关联两个容器

1 升级sinatra程序
wget --cut-dirs=3 -nH -r --reject Dokcerfile,index.html --no-parent http://dockerbook.com/code/5/sinatra/webapp_redis/
ls --l webapp_redis
cat lib/app.rb
说明:代码增加了对redis的支持

chmod +x webapp_redis/bin/webapp

2构建redis数据库镜像
mkdir -p sinatra/redis
cd sinatra/redis
vi Dockerfile
内容如下:
FROM ubuntu:14.04
MAINTAINER mazhen "mz@example.com"
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install redis-server redis-tools
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]
CMD []

构建redis镜像
docker build -t mazhen/redis .

基于该镜像启动容器
docker run -d -p 6379 --name redis mazhen/redis

获取容器的6379端口映射到宿主机的哪个端口了
docker port redis 6379

本地安装redis客户端做测试
apt-get -y install redis-tools 或 yum install -y -q redis
启动redis客户端:
redis-cli -h 127.0.0.1 -p 端口

现在sinatra和redis分别在一个应用程序中,那如何将sinatra应用程序连接到redis容器?
共有三种方式
1)docker内部网络 -不推荐
2)docker1.9版本始可使用docker networking -- 推荐方案
3)docker链接:将具体容器连接到一起通信的抽象层

docker内部连网
目前docker容器暴露端口都是通过将公开端口绑定到本地网络接口,实现把容器里的服务公开到外部网络。除此外,还有内部网络的方式。

在安装docker时,会自动创建名字为docker0的网络接口,每个docker容器都会在这个接口上分配一个IP地址。
docker每创建一个容器就会建立一组互联的网络接口。从容器里的eth0连接到宿主机的docker0网桥上。


docker networking
容器之间网络的连接方式。
以上面的web应用容器连接redis容器为实例。
1 创建一个网络
docker network create app
docker network inspect app
docker network ls #获取当前系统中的所有网络。
docker network rm  network名称#删除一个docker网络

2 在app网络下创建名为db的redis新容器
docker run -d --net=app --name db mazhen/redis
--net=app:新容器在app网络中运行

docker network inspect app 
可以看到结果中多了一个容器

3 在app网路下创建一个启动了sinatra应用程序的容器
cd sinatra/webapp
docker run -p 4567 --net=app --name webapp -t -i -v $pwd/webapp:/opt/webapp mazhen/sinatra /bin/bash
由于该容器在app网络下启动,因此docker会感知所有该网络下运行的容器,并通过/etc/hosts将这些容器的地址保存到本地DNS。
cat /etc/hosts
结果中包含 localhost  db db.app等内容。

现在redis和webapp两个容器间就是通的,即:
redis -- app -- webapp
此时webapp即可以正常使用redis服务了。

将已有容器添加到docker网络,如:
docker network connect app db2 
即:将db2这个容器加入到了app网络中,此时docker network inspect app则可以看到三个容器。

将容器从网络中移除
docker network disconnect app db2

docker用于持续集成
构建Jenkins和docker服务器
mkdir jenkins
cd jenkins
书写dockerile
FROM ubuntu:14.04
MAINTAINER mazhen "mz@example.com"
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install curl apt-transport-https
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58...

基于dockerfile 构建镜像
docker build -t mazhen/dockerjenkins .

创建容器
docker run -p 8080:8080 --name jenkins --privileged -d mazhen/dockerjenkins 
--priviledged:启动docker的特权模式,允许我们以宿主机所有能力来运行容器,包括一些内核特性和设备访问

查看jenkins日志
docker logs jenkins

创建jenkins作业
....

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值