Merge branch 'master' of github.com:yeasy/docker_practice
commit
34dc895942
|
@ -1,5 +1,5 @@
|
||||||
## 配置 DNS
|
## 配置 DNS
|
||||||
Docker 没有每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?
|
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?
|
||||||
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
|
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
|
||||||
|
|
||||||
在容器中使用 mount 命令可以看到挂载信息:
|
在容器中使用 mount 命令可以看到挂载信息:
|
||||||
|
|
|
@ -13,7 +13,7 @@ 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
|
||||||
|
@ -62,4 +62,4 @@ $ sudo docker run -p 22 -p 80 -t -i test/supervisords
|
||||||
```
|
```
|
||||||
使用 `docker run` 来启动我们创建的容器。使用多个 `-p` 来映射多个端口,这样我们就能同时访问 ssh 和 apache 服务了。
|
使用 `docker run` 来启动我们创建的容器。使用多个 `-p` 来映射多个端口,这样我们就能同时访问 ssh 和 apache 服务了。
|
||||||
|
|
||||||
可以使用这个方法创建一个只有 ssh 服务的基础镜像,之后创建镜像可以以这个镜像为基础来创建
|
可以使用这个方法创建一个只有 ssh 服务的基础镜像,之后创建镜像可以使用这个镜像为基础来创建
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
## 创建 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]
|
||||||
|
@ -54,7 +54,7 @@ CMD ["/usr/bin/supervisord"]
|
||||||
|
|
||||||
-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 只要开启多个容器即可
|
||||||
|
|
|
@ -37,7 +37,7 @@ root@78e82f680994:/#
|
||||||
```
|
```
|
||||||
|
|
||||||
###利用 Dockerfile 来创建镜像
|
###利用 Dockerfile 来创建镜像
|
||||||
使用 `docker commit` 来扩展一个镜像比较简单,但它不容易在一个团队中分享它。我们可以使用 `docker build` 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。
|
使用 `docker commit` 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 `docker build` 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。
|
||||||
|
|
||||||
新建一个目录和一个 Dockerfile
|
新建一个目录和一个 Dockerfile
|
||||||
```
|
```
|
||||||
|
|
|
@ -35,7 +35,7 @@ $ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 本地安装
|
#### 本地安装
|
||||||
对于 Ubuntu 或 CentOS 等发型包,可以直接通过源安装。
|
对于 Ubuntu 或 CentOS 等发行版,可以直接通过源安装。
|
||||||
* Ubuntu
|
* Ubuntu
|
||||||
```
|
```
|
||||||
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev
|
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
## 控制组
|
## 控制组
|
||||||
控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。
|
控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。
|
||||||
|
|
||||||
它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等资源;当然,更重要的是,控制组确保了当发生在容器内的资源压力不会连累主机系统。
|
它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等资源;当然,更重要的是,控制组确保了当容器内的资源使用产生压力时不会连累主机系统。
|
||||||
|
|
||||||
尽管控制组不负责隔离容器之间相互访问、处理数据和进程,它在防止拒绝服务(DDOS)攻击方面是必不可少的。尤其是在多用户的平台(比如公有或私有的 PaaS)上,控制组十分重要。例如,当某些应用程序表现异常的时候,可以保证一致地正常运行和性能。
|
尽管控制组不负责隔离容器之间相互访问、处理数据和进程,它在防止拒绝服务(DDOS)攻击方面是必不可少的。尤其是在多用户的平台(比如公有或私有的 PaaS)上,控制组十分重要。例如,当某些应用程序表现异常的时候,可以保证一致地正常运行和性能。
|
||||||
|
|
||||||
|
|
|
@ -10,4 +10,4 @@ Docker 底层的核心技术包括 Linux 上的名字空间(Namespaces)、
|
||||||
要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。
|
要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。
|
||||||
前者相对容易实现一些,后者则需要宿主机系统的深入支持。
|
前者相对容易实现一些,后者则需要宿主机系统的深入支持。
|
||||||
|
|
||||||
随着 Linux 系统对于名字空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的名字空间中运行。大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器(Container),例如名字空间来做权限的隔离控制,利用 cgroups 来做资源分配。
|
随着 Linux 系统对于名字空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的名字空间中运行。大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器(Container),利用名字空间来做权限的隔离控制,利用 cgroups 来做资源分配。
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
|
|
||||||
控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。
|
控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。
|
||||||
|
|
||||||
控制组可以提供对容器内内存、CPU、磁盘 IO 等资源的限制和计费管理。
|
控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
## 容器格式
|
## 容器格式
|
||||||
最初,Docker 采用了 LXC 中的容器格式。自 1.20 版本开始,Docker 也开始支持新的 `libcontainer` 格式,并作为默认选项。
|
最初,Docker 采用了 LXC 中的容器格式。自 1.20 版本开始,Docker 也开始支持新的 [libcontainer](https://github.com/docker/libcontainer) 格式,并作为默认选项。
|
||||||
|
|
||||||
对更多容器格式的支持,还在进一步的发展中。
|
对更多容器格式的支持,还在进一步的发展中。
|
||||||
|
|
|
@ -6,15 +6,15 @@ Docker 的网络实现其实就是利用了 Linux 上的网络名字空间和虚
|
||||||
首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。
|
首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。
|
||||||
|
|
||||||
Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。
|
Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。
|
||||||
Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要很快。
|
Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。
|
||||||
|
|
||||||
Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 `veth pair`)。
|
Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 `veth pair`)。
|
||||||
|
|
||||||
### 创建网络参数
|
### 创建网络参数
|
||||||
Docker 创建一个容器的时候,会执行如下操作:
|
Docker 创建一个容器的时候,会执行如下操作:
|
||||||
* 创建一对虚拟接口,分别放到本地主机和新容器中;
|
* 创建一对虚拟接口,分别放到本地主机和新容器中;
|
||||||
* 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9;
|
* 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9;
|
||||||
* 容器一端放到新容器中,并修改名字作为 eth0。这个接口只在容器的名字空间可见;
|
* 容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的名字空间可见;
|
||||||
* 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth65f9。
|
* 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth65f9。
|
||||||
|
|
||||||
完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。
|
完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。
|
||||||
|
@ -64,6 +64,6 @@ $ sudo ip netns exec $pid ip route add default via 172.17.42.1
|
||||||
```
|
```
|
||||||
以上,就是 Docker 配置网络的具体过程。
|
以上,就是 Docker 配置网络的具体过程。
|
||||||
|
|
||||||
当容器结束后,Docker 会清空容器,容器内的 eth0 会随网络命名空间一起被摧毁,A 接口也被自动从 `docker0` 卸载。
|
当容器结束后,Docker 会清空容器,容器内的 eth0 会随网络命名空间一起被清除,A 接口也被自动从 `docker0` 卸载。
|
||||||
|
|
||||||
此外,用户可以使用 `ip netns exec` 命令来在指定网络名字空间中进行配置,从而配置容器内的网络。
|
此外,用户可以使用 `ip netns exec` 命令来在指定网络名字空间中进行配置,从而配置容器内的网络。
|
||||||
|
|
Loading…
Reference in New Issue