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