docker (10):实战案例
1.使⽤ 来管理进程
Docker 容器在启动的时候开启单个进程,⽐如,⼀个 或者 apache 的 daemon 服务。但我们经常需要在⼀个机器上开启多个服务,这可以有很多⽅法,最简单的就是把多个启动命令放到⼀个启动脚本⾥⾯,启动的时候直接启动这个脚本,另外就是安装进程管理⼯具。
本⼩节将使⽤进程管理⼯具 supervisor 来管理容器中的多个进程。使⽤ Supervisor 可以更好的控制、管理、重启我们希望运⾏的进程。在这⾥我们演⽰⼀下如何同时使⽤ ssh 和 服务。
1.1配置
⾸先创建⼀个 Dockerfile,内容和各部分的解释如下。
1.2 安装 ssh 、apache 和 supervisor
这⾥安装 3 个软件,还创建了 2 个 ssh 和 supervisor 服务正常运⾏所需要的⽬录。
添加 supervisord 的配置⽂件,并复制配置⽂件到对应⽬录下⾯。
这⾥我们映射了 22 和 80 端⼝,使⽤ supervisord 的可执⾏路径启动服务。
1.3 supervisor 配置⽂件内容
配置⽂件包含⽬录和进程,第⼀段 supervsord 配置软件本⾝,使⽤ nodaemon 参数来运⾏。第⼆段包含要控制的 2 个服务。每⼀段包含⼀个服务的⽬录和启动这个服务的命令。
1.4 使⽤⽅法
创建镜像。FROM ubuntu:13.04MAINTAINER examples@docker RUN echo  "deb archive.ubuntu/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get  update RUN apt-get  upgrade -y
12
3
4
5RUN apt-get  install  -y openssh-server apache2 supervisor RUN mkdir  -p /var/run/sshd RUN mkdir  -p /var/log/supervisor
1
2
f /etc/supervisor/conf.f
1EXPOSE 22 80CMD ["/usr/bin/supervisord"]
1
2[supervisord ]nodaemon =true [program:sshd ]command =/usr/sbin/sshd -D [program:apache2]command =/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
1
2
3
4
5
6
启动 supervisor 容器。
使⽤ docker run 来启动我们创建的容器。使⽤多个 -p 来映射多个端⼝,这样我们就能同时访问 ssh 和 apache 服务了。
可以使⽤这个⽅法创建⼀个只有 ssh 服务的基础镜像,之后创建镜像可以使⽤这个镜像为基础来创建
2.创建 Tomcat/Weblogic 集
2.1 安装 Tomcat 镜像
准备好需要的 jdk、tomcat 等软件放到 home ⽬录下⾯,启动⼀个容器
这条命令挂载本地 home ⽬录到容器的 /opt/data ⽬录,容器内⽬录若不存在,则会⾃动创建。接下来就是 tomcat 的基本配置,jdk 环境变量设置好之后,将 tomcat 程序放到 /opt/apache-tomcat 下⾯ 编辑 /etc/supervis
or/conf.f ⽂件,添加 tomcat 项
新建 tomcat ⽂件夹,新建 Dockerfile。
根据 Dockerfile 创建镜像。
2.2 安装 Weblogic 镜像
步骤和 tomcat 基本⼀致,这⾥贴⼀下配置⽂件$ sudo  docker build -t test/supervisord .
1$ sudo  docker run -p 22 -p 80 -t -i test/supervisord 2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in  config file )2013-11-25 18:53:22,312 WARN Included extra file  "/etc/supervisor/conf.f" during parsing 2013-11-25 18:53:22,342 INFO supervisord started with pid 12013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 62013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
1
2
3
4
5
6docker run -t -i -v /home:/opt/data --name mk_tomcat ubuntu /bin/bash 1[supervisord ]nodaemon =true [program:tomcat ]command =/opt/apache-tomcat/bin/startup.sh [program:sshd ]command =/usr/sbin/sshd -D docker commit ac6474aeb31d tomcat
1
2
3
4
5
6
7FROM mk_tomcat EXPOSE 22 8080CMD ["/usr/bin/supervisord"]
1
2
3docker build tomcat tomcat
1
2.3 Tomcat/Weblogic 镜像的使⽤
2.3.1 存储的使⽤
在启动的时候,使⽤ -v 参数
将本地磁盘映射到容器内部,它在主机和容器之间是实时变化的,所以我们更新程序、上传代码只需要更新物理主机的⽬录就可以了
2.3.2 Tomcat 和 Weblogic 集的实现
Tomcat 只要开启多个容器即可
这⾥说⼀下 weblogic 的配置,⼤家知道 weblogic 有⼀个域的概念。如果要使⽤常规的 administrator +node的⽅式部署,就需要在supervisord 中分别写出 administartor server 和 node server 的启动脚本,这样做的优点是:可以使⽤ weblogic 的集,同步等概念
部署⼀个集应⽤程序,只需要安装⼀次应⽤到集上即可缺点是:Docker 配置复杂了
没办法⾃动扩展集的计算容量,如需添加节点,需要在 administrator 上先创建节点,然后再配置新的容
器 supervisor 启动脚本,然后再启动容器
另外种⽅法是将所有的程序都安装在 adminiserver 上⾯,需要扩展的时候,启动多个节点即可,它的优点和缺
点和上⼀种⽅法恰恰相反。(建议使⽤这种⽅式来部署开发和测试环境)
这样在前端使⽤ nginx 来做负载均衡就可以完成配置了
3.多台物理主机之间的容器互联
Docker 默认的桥接⽹卡是 docker0。它只会在本机桥接所有的容器⽹卡,举例来说容器的虚拟⽹卡在主机上看
⼀般叫做 veth*** ⽽ Docker 只是把所有这些⽹卡桥接在⼀起,如下:f [supervisord ]nodaemon =true [program:weblogic ]command =/opt/Middleware/user_projects/domains/base_domain/bin/startWebLogic.sh [program:sshd ]command =/usr/sbin/sshd -D dockerfile FROM weblogic EXPOSE 22 7001CMD ["/usr/bin/supervisord"]
1
2
3
4
5
6
7
89
10
11
12-v, --volume =[] Bind mount  a volume (e.g. from the host: -v /host:/container, from docker: -v /container )
1docker run -d -v -p 204:22 -p 7003:8080 -v /home/data:/opt/data --name tm1 tomcat /usr/bin/supervisord docker run -d -v -p 205:22 -p 7004:8080 -v /home/data:/opt/data --name tm2 tomcat /usr/bin/supervisord docker run -d -v -p 206:22 -p 7005:8080 -v /home/data:/opt/data --name tm3 tomcat /usr/bin/supervisord
1
2
3docker run -d -v -p 204:22 -p 7001:7001 -v /home/data:/opt/data --name node1 weblogic /usr/bin/supervisord docker run -d -v -p 205:22 -p 7002:7001 -v /home/data:/opt/data --name node2 weblogic /usr/bin/supervisord docker run -d -v -p 206:22 -p 7003:7001 -v /home/data:/opt/data --name node3 weblogic /usr/bin/supervisord
1
2
3
在容器中看到的地址⼀般是像下⾯这样的地址:
这样就可以把这个⽹络看成是⼀个私有的⽹络,通过 nat 连接外⽹,如果要让外⽹连接到容器中,就需要做端⼝映射,即 -p 参数。
如果在企业内部应⽤,或者做多个物理主机的集,可能需要将多个物理主机的容器组到⼀个物理⽹络中来,那么就需要将这个⽹桥桥接到我们指定的⽹卡上。
3.1 拓扑图
主机 A 和主机 B 的⽹卡⼀都连着物理交换机的同⼀个 vlan 101,这样⽹桥⼀和⽹桥三就相当于在同⼀个物理⽹络
中了,⽽容器⼀、容器三、容器四也在同⼀物理⽹络中了,他们之间可以相互通信,⽽且可以跟同⼀ vlan 中的其
他物理机器互联
3.2 ubuntu ⽰例
下⾯以 ubuntu 为例创建多个主机的容器联⽹: 创建⾃⼰的⽹桥,编辑[root@opnvz ~]# brctl show bridge name bridge id  STP enabled interfaces docker0 8000.56847afe9799 no veth0889veth3c7b veth4061
1
2
3
4
docker重启容器命令5root@ac6474aeb31d:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP > mtu 1500 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 11: eth0: <BROADCAST,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 4a:7d:68:da:09:cf brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0valid_lft forever preferred_lft forever inet6 fe80::487d:68ff:feda:9cf/64 scope link valid_lft forever preferred_lft forever
1
2
3
4
5
6
7
8
9
10
11
12
13
将 Docker 的默认⽹桥绑定到这个新建的 br0 上⾯,这样就将这台机器上容器绑定到 em1 这个⽹卡所对应的物
理⽹络上了。
ubuntu 修改 /etc/default/docker ⽂件,添加最后⼀⾏内容
在启动 Docker 的时候 使⽤ -b 参数 将容器绑定到物理⽹络上。重启 Docker 服务后,再进⼊容器可以看到它已
经绑定到你的物理⽹络上了。
这样就直接把容器暴露到物理⽹络上了,多台物理主机的容器也可以相互联⽹了。需要注意的是,这样就需要⾃⼰来保证容器的⽹络安全了。
4.标准化开发测试和⽣产环境
对于⼤部分企业来说,搭建 PaaS 既没有那个精⼒,也没那个必要,⽤ Docker 做个⼈的 sandbox ⽤处⼜⼩了点。
可以⽤ Docker 来标准化开发、测试、⽣产环境。/etc/network/interface ⽂件auto br0iface br0 inet static address 192.168.7.31netmask 255.255.240.0gateway 192.168.7.254bridge_ports em1bridge_stp off dns-nameservers 8.8.8.8 192.168.6.1
1
2
3
4
5
6
7
8
9#Docker Upstart and SysVinit configuration file #Customize location of Docker binary (especially for development testing).#DOCKER="/usr/local/bin/docker"#Use DOCKER_OPTS to modify the daemon startup options.#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"#If you need Docker to use an HTTP proxy, it can also be specified here.#export http_proxy="127.0.0.1:3128/"#This is also a handy place to tweak where Docker's temporary files go.#export TMPDIR="/mnt/bigdrive/docker-tmp"DOCKER_OPTS ="-b=br0"
1
2
3
4
5
6
7
8
910root@ubuntudocker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58b043aa05eb desk_hz:v1 "/startup.sh" 5 days ago Up 2 seconds 5900/tcp, 6080/tcp, 22/tcp yanlx root@ubuntudocker:~# brctl show bridge name bridge id  STP enabled interfaces br0 8000.7e6e617c8d53 no em1vethe6e5
1
2
3
4
5
6
7

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。