diff --git a/cases/README.md b/cases/README.md index 4f03d4b..e373e2d 100644 --- a/cases/README.md +++ b/cases/README.md @@ -1,2 +1,2 @@ -#实战案例 -介绍一些典型的应用场景和案例。 +#實戰案例 +介紹一些典型的應用場景和案例。 diff --git a/cases/container_connect.md b/cases/container_connect.md index fc72123..fc02f0a 100644 --- a/cases/container_connect.md +++ b/cases/container_connect.md @@ -1,5 +1,5 @@ -## 多台物理主机之间的容器互联(暴露容器到真实网络中) -Docker 默认的桥接网卡是 docker0。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 veth*** 而 Docker 只是把所有这些网卡桥接在一起,如下: +## 多臺物理主機之間的容器互聯(暴露容器到真實網絡中) +Docker 默認的橋接網卡是 docker0。它只會在本機橋接所有的容器網卡,舉例來說容器的虛擬網卡在主機上看一般叫做 veth*** 而 Docker 只是把所有這些網卡橋接在一起,如下: ``` [root@opnvz ~]# brctl show bridge name bridge id STP enabled interfaces @@ -7,7 +7,7 @@ docker0 8000.56847afe9799 no veth0889 veth3c7b veth4061 ``` -在容器中看到的地址一般是像下面这样的地址: +在容器中看到的地址一般是像下面這樣的地址: ``` root@ac6474aeb31d:~# ip a 1: lo: mtu 1500 qdisc noqueue state UNKNOWN group default @@ -23,17 +23,17 @@ root@ac6474aeb31d:~# ip a inet6 fe80::487d:68ff:feda:9cf/64 scope link valid_lft forever preferred_lft forever ``` -这样就可以把这个网络看成是一个私有的网络,通过 nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数。 +這樣就可以把這個網絡看成是一個私有的網絡,通過 nat 連接外網,如果要讓外網連接到容器中,就需要做端口映射,即 -p 參數。 -如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。 +如果在企業內部應用,或者做多個物理主機的集群,可能需要將多個物理主機的容器組到一個物理網絡中來,那麽就需要將這個網橋橋接到我們指定的網卡上。 -### 拓扑图 -主机 A 和主机 B 的网卡一都连着物理交换机的同一个 vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理机器互联。 -![物理拓扑图](../_images/container_connect_topology.png) +### 拓撲圖 +主機 A 和主機 B 的網卡一都連著物理交換機的同一個 vlan 101,這樣網橋一和網橋三就相當於在同一個物理網絡中了,而容器一、容器三、容器四也在同一物理網絡中了,他們之間可以相互通信,而且可以跟同一 vlan 中的其他物理機器互聯。 +![物理拓撲圖](../_images/container_connect_topology.png) ### ubuntu 示例 -下面以 ubuntu 为例创建多个主机的容器联网: -创建自己的网桥,编辑 /etc/network/interface 文件 +下面以 ubuntu 為例創建多個主機的容器聯網: +創建自己的網橋,編輯 /etc/network/interface 文件 ``` auto br0 iface br0 inet static @@ -44,9 +44,9 @@ bridge_ports em1 bridge_stp off dns-nameservers 8.8.8.8 192.168.6.1 ``` -将 Docker 的默认网桥绑定到这个新建的 br0 上面,这样就将这台机器上容器绑定到 em1 这个网卡所对应的物理网络上了。 +將 Docker 的默認網橋綁定到這個新建的 br0 上面,這樣就將這臺機器上容器綁定到 em1 這個網卡所對應的物理網絡上了。 -ubuntu 修改 /etc/default/docker 文件,添加最后一行内容 +ubuntu 修改 /etc/default/docker 文件,添加最後一行內容 ``` # Docker Upstart and SysVinit configuration file @@ -64,7 +64,7 @@ ubuntu 修改 /etc/default/docker 文件,添加最后一行内容 DOCKER_OPTS="-b=br0" ``` -在启动 Docker 的时候 使用 -b 参数 将容器绑定到物理网络上。重启 Docker 服务后,再进入容器可以看到它已经绑定到你的物理网络上了。 +在啟動 Docker 的時候 使用 -b 參數 將容器綁定到物理網絡上。重啟 Docker 服務後,再進入容器可以看到它已經綁定到你的物理網絡上了。 ``` root@ubuntudocker:~# docker ps @@ -75,4 +75,4 @@ bridge name bridge id STP enabled interfaces br0 8000.7e6e617c8d53 no em1 vethe6e5 ``` -这样就直接把容器暴露到物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。 +這樣就直接把容器暴露到物理網絡上了,多臺物理主機的容器也可以相互聯網了。需要註意的是,這樣就需要自己來保證容器的網絡安全了。 diff --git a/cases/environment.md b/cases/environment.md index 30d1ad9..ab56376 100644 --- a/cases/environment.md +++ b/cases/environment.md @@ -1,14 +1,14 @@ -## 标准化开发测试和生产环境 -对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点。 +## 標準化開發測試和生產環境 +對於大部分企業來說,搭建 PaaS 既沒有那個精力,也沒那個必要,用 Docker 做個人的 sandbox 用處又小了點。 -可以用 Docker 来标准化开发、测试、生产环境。 +可以用 Docker 來標準化開發、測試、生產環境。 -![企业应用结构](../_images/enterprise_usage.png) +![企業應用結構](../_images/enterprise_usage.png) -Docker 占用资源小,在一台 E5 128 G 内存的服务器上部署 100 个容器都绰绰有余,可以单独抽一个容器或者直接在宿主物理主机上部署 samba,利用 samba 的 home 分享方案将每个用户的 home 目录映射到开发中心和测试部门的 Windows 机器上。 +Docker 占用資源小,在一臺 E5 128 G 內存的服務器上部署 100 個容器都綽綽有余,可以單獨抽一個容器或者直接在宿主物理主機上部署 samba,利用 samba 的 home 分享方案將每個用戶的 home 目錄映射到開發中心和測試部門的 Windows 機器上。 -针对某个项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过 `docker run -v` 将用户的 home 目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用 `-v` 加载测试部门的 home 目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发部门提交的代码,测试部门部署不了的问题。 +針對某個項目組,由架構師搭建好一個標準的容器環境供項目組和測試部門使用,每個開發工程師可以擁有自己單獨的容器,通過 `docker run -v` 將用戶的 home 目錄映射到容器中。需要提交測試時,只需要將代碼移交給測試部門,然後分配一個容器使用 `-v` 加載測試部門的 home 目錄啟動即可。這樣,在公司內部的開發、測試基本就統一了,不會出現開發部門提交的代碼,測試部門部署不了的問題。 -测试部门发布测试通过的报告后,架构师再一次检测容器环境,就可以直接交由部署工程师将代码和容器分别部署到生产环境中了。这种方式的部署横向性能的扩展性也极好。 +測試部門發布測試通過的報告後,架構師再一次檢測容器環境,就可以直接交由部署工程師將代碼和容器分別部署到生產環境中了。這種方式的部署橫向性能的擴展性也極好。 diff --git a/cases/supervisor.md b/cases/supervisor.md index c197be4..a2dcddb 100644 --- a/cases/supervisor.md +++ b/cases/supervisor.md @@ -1,10 +1,10 @@ -## 使用 Supervisor 来管理进程 -Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 +## 使用 Supervisor 來管理進程 +Docker 容器在啟動的時候開啟單個進程,比如,一個 ssh 或者 apache 的 daemon 服務。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令方到一個啟動腳本裏面,啟動的時候直接啟動這個腳本,另外就是安裝進程管理工具。 -本小节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用 ssh 和 apache 服务。 +本小節將使用進程管理工具 supervisor 來管理容器中的多個進程。使用 Supervisor 可以更好的控制、管理、重啟我們希望運行的進程。在這裏我們演示一下如何同時使用 ssh 和 apache 服務。 ### 配置 -首先创建一个 Dockerfile,内容和各部分的解释如下。 +首先創建一個 Dockerfile,內容和各部分的解釋如下。 ``` FROM ubuntu:13.04 MAINTAINER examples@docker.com @@ -13,28 +13,28 @@ RUN apt-get update RUN apt-get upgrade -y ``` -### 安装 supervisor -安装 ssh、apache 和 supervisor。 +### 安裝 supervisor +安裝 ssh、apache 和 supervisor。 ``` RUN apt-get install -y openssh-server apache2 supervisor RUN mkdir -p /var/run/sshd RUN mkdir -p /var/log/supervisor ``` -这里安装 3 个软件,还创建了 2 个 ssh 和 supervisor 服务正常运行所需要的目录。 +這裏安裝 3 個軟件,還創建了 2 個 ssh 和 supervisor 服務正常運行所需要的目錄。 ``` COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf ``` -添加 supervisord 的配置文件,并复制配置文件到对应目录下面。 +添加 supervisord 的配置文件,並復制配置文件到對應目錄下面。 ``` EXPOSE 22 80 CMD ["/usr/bin/supervisord"] ``` -这里我们映射了 22 和 80 端口,使用 supervisord 的可执行路径启动服务。 +這裏我們映射了 22 和 80 端口,使用 supervisord 的可執行路徑啟動服務。 -### supervisor配置文件内容 +### supervisor配置文件內容 ``` [supervisord] nodaemon=true @@ -44,14 +44,14 @@ command=/usr/sbin/sshd -D [program:apache2] command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" ``` -配置文件包含目录和进程,第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。 +配置文件包含目錄和進程,第一段 supervsord 配置軟件本身,使用 nodaemon 參數來運行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。 ### 使用方法 -创建镜像。 +創建鏡像。 ``` $ sudo docker build -t test/supervisord . ``` -启动 supervisor 容器。 +啟動 supervisor 容器。 ``` $ sudo docker run -p 22 -p 80 -t -i test/supervisords 2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file) @@ -60,6 +60,6 @@ $ sudo docker run -p 22 -p 80 -t -i test/supervisords 2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6 2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7 ``` -使用 `docker run` 来启动我们创建的容器。使用多个 `-p` 来映射多个端口,这样我们就能同时访问 ssh 和 apache 服务了。 +使用 `docker run` 來啟動我們創建的容器。使用多個 `-p` 來映射多個端口,這樣我們就能同時訪問 ssh 和 apache 服務了。 -可以使用这个方法创建一个只有 ssh 服务的基础镜像,之后创建镜像可以使用这个镜像为基础来创建 +可以使用這個方法創建一個只有 ssh 服務的基礎鏡像,之後創建鏡像可以使用這個鏡像為基礎來創建 diff --git a/cases/tomcat.md b/cases/tomcat.md index 7832ab8..b6dc74c 100644 --- a/cases/tomcat.md +++ b/cases/tomcat.md @@ -1,11 +1,11 @@ -## 创建 tomcat/weblogic 集群 -### 安装 tomcat 镜像 -准备好需要的 jdk、tomcat 等软件放到 home 目录下面,启动一个容器 +## 創建 tomcat/weblogic 集群 +### 安裝 tomcat 鏡像 +準備好需要的 jdk、tomcat 等軟件放到 home 目錄下面,啟動一個容器 ``` docker run -t -i -v /home:/opt/data --name mk_tomcat ubuntu /bin/bash ``` -这条命令挂载本地 home 目录到容器的 /opt/data 目录,容器内目录若不存在,则会自动创建。接下来就是 tomcat 的基本配置,jdk 环境变量设置好之后,将 tomcat 程序放到 /opt/apache-tomcat 下面 -编辑 /etc/supervisor/conf.d/supervisor.conf 文件,添加 tomcat 项 +這條命令掛載本地 home 目錄到容器的 /opt/data 目錄,容器內目錄若不存在,則會自動創建。接下來就是 tomcat 的基本配置,jdk 環境變量設置好之後,將 tomcat 程序放到 /opt/apache-tomcat 下面 +編輯 /etc/supervisor/conf.d/supervisor.conf 文件,添加 tomcat 項 ``` [supervisord] nodaemon=true @@ -18,19 +18,19 @@ command=/usr/sbin/sshd -D docker commit ac6474aeb31d tomcat ``` -新建 tomcat 文件夹,新建 Dockerfile。 +新建 tomcat 文件夾,新建 Dockerfile。 ``` FROM mk_tomcat EXPOSE 22 8080 CMD ["/usr/bin/supervisord"] ``` -根据 Dockerfile 创建镜像。 +根據 Dockerfile 創建鏡像。 ``` docker build tomcat tomcat ``` -### 安装 weblogic 镜像 +### 安裝 weblogic 鏡像 -步骤和 tomcat 基本一致,这里贴一下配置文件 +步驟和 tomcat 基本一致,這裏貼一下配置文件 ``` supervisor.conf [supervisord] @@ -48,34 +48,34 @@ EXPOSE 22 7001 CMD ["/usr/bin/supervisord"] ``` -### tomcat/weblogic 镜像的使用 -#### 存储的使用 -在启动的时候,使用 `-v` 参数 +### tomcat/weblogic 鏡像的使用 +#### 存儲的使用 +在啟動的時候,使用 `-v` 參數 -v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container) -将本地磁盘映射到容器内部,它在主机和容器之间是实时变化的,所以我们更新程序、上传代码只需要更新物理主机的目录就可以了 +將本地磁盤映射到容器內部,它在主機和容器之間是實時變化的,所以我們更新程序、上傳代碼只需要更新物理主機的目錄就可以了 -#### tomcat 和 weblogic 集群的实现 -tomcat 只要开启多个容器即可 +#### tomcat 和 weblogic 集群的實現 +tomcat 只要開啟多個容器即可 ``` docker 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 ``` -这里说一下 weblogic 的配置,大家知道 weblogic 有一个域的概念。如果要使用常规的 administrator +node 的方式部署,就需要在 supervisord 中分别写出 administartor server 和 node server 的启动脚本,这样做的优点是: +這裏說一下 weblogic 的配置,大家知道 weblogic 有一個域的概念。如果要使用常規的 administrator +node 的方式部署,就需要在 supervisord 中分別寫出 administartor server 和 node server 的啟動腳本,這樣做的優點是: * 可以使用 weblogic 的集群,同步等概念 -* 部署一个集群应用程序,只需要安装一次应用到集群上即可 +* 部署一個集群應用程序,只需要安裝一次應用到集群上即可 -缺点是: -* Docker 配置复杂了 -* 没办法自动扩展集群的计算容量,如需添加节点,需要在 administrator 上先创建节点,然后再配置新的容器 supervisor 启动脚本,然后再启动容器 -另外种方法是将所有的程序都安装在 adminiserver 上面,需要扩展的时候,启动多个节点即可,它的优点和缺点和上一种方法恰恰相反。(建议使用这种方式来部署开发和测试环境) +缺點是: +* Docker 配置復雜了 +* 沒辦法自動擴展集群的計算容量,如需添加節點,需要在 administrator 上先創建節點,然後再配置新的容器 supervisor 啟動腳本,然後再啟動容器 +另外種方法是將所有的程序都安裝在 adminiserver 上面,需要擴展的時候,啟動多個節點即可,它的優點和缺點和上一種方法恰恰相反。(建議使用這種方式來部署開發和測試環境) ``` docker 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 ``` -这样在前端使用 nginx 来做负载均衡就可以完成配置了 +這樣在前端使用 nginx 來做負載均衡就可以完成配置了