1. 如何从零开始搭建Docker Swarm集群
检查节点Docker配置 1. 打开Docker配置文件(示例是centos 7) vim /etc/sysconfig/docker 2. 添加-H tcp://0.0.0.0:2375到OPTIONS OPTIONS='-g /cutome-path/docker -H tcp://0.0.0.0:2375' 3. CentOS6.6 需要另外添加-H unix:///var/run/docker.sock OPTIONS='-g /mnt/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock' 分别给A、B节点安装swarm $ docker pull swarm 生成集群token(一次) $ docker run --rm swarm create 其中就是我们将要创建集群的token 添加节点A、B到集群 $ docker run -d swarm join --addr=192.168.20.1:2375 token:// $ docker run -d swarm join --addr=192.168.20.2:2375 token:// 列出集群A、B节点 $ docker run --rm swarm list token:// 192.168.20.1:2375 192.168.20.2:2375 集群管理: 在任何一台主机A、B或者C(C:192.168.20.3)上开启管理程序。例如在C主机开启: $ docker run -d -p 8888:2375 swarm manage token:// 现在你就可以在主机C上管理集群A、B: $ docker -H 192.168.20.3:8888 info $ docker -H 192.168.20.3:8888 ps $ docker -H 192.168.20.3:8888 logs ... 在集群上运行容器 $ docker -H 192.168.20.3:8888 run -d --name web1 nginx $ docker -H 192.168.20.3:8888 run -d --name web2 nginx $ docker -H 192.168.20.3:8888 run -d --name web3 nginx $ docker -H 192.168.20.3:8888 run -d --name web4 nginx $ docker -H 192.168.20.3:8888 run -d --name web5 nginx 查看集群A、B内的容器 $ docker -H 192.168.20.3:8888 ps -a 结果如下:
2. 集群外部怎么访问 docker容器
Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦。 我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器?有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。
使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。
nsenter 可以访问另一个进程的名字空间。
为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
PID=$(docker inspect –format “{{ .State.Pid }}” <container>) //将<container>换成你的容器id
通过这个 PID,就可以连接到这个容器:
3. 如何解决Docker容器与外部主机通信的问题
由于容器里可以访问该服务,所以服务是启动了的;在宿主机可以访问容器中的nginx欢迎界面,说明宿主机可以访问容器中80端口的服务
4. 请教docker有什么好方法,给容器映射一个外部可以独立访问的ip
绑定公网IP有多种方法:
1、把端口用 --publish forward 进容器里,或者说把端口发布出来。如 docker run -p 80:80 nginx
2、把某个虚拟或物理 interface bridge 进容器里,可以用一个叫 pipework 的工具:
3、直接不对容器网络做虚拟化/隔离,用 --net=host
浮动IP
浮动IP目前没有成熟的方案,在我看来,一个是自己写agent来通过iptables自动完成漂移,另一个是寄希望于官方的libnetwork
5. 如何配置一个 Docker Swarm 原生集群
如何配置一个 Docker Swarm 原生集群
嗨,大家好。今天我们来学一学Swarm相关的内容吧,我们将学习通过Swarm来创建Docker原生集群。Docker Swarm是用于Docker的原生集群项目,它可以将一个Docker主机池转换成单个的虚拟主机。Swarm工作于标准的Docker API,所以任何可以和Docker守护进程通信的工具都可以使用Swarm来透明地伸缩到多个主机上。就像其它Docker项目一样,Swarm遵循“内置电池,并可拆卸”的原则(LCTT 译注:batteries included,内置电池原来是 Python 圈里面对 Python 的一种赞誉,指自给自足,无需外求的丰富环境;but removable,并可拆卸应该指的是非强制耦合)。它附带有一个开箱即用的简单的后端调度程序,而且作为初始开发套件,也为其开发了一个可插拔不同后端的API。其目标在于为一些简单的使用情况提供一个平滑的、开箱即用的体验,并且它允许切换为更强大的后端,如Mesos,以用于大规模生产环境部署。Swarm配置和使用极其简单。
这里给大家提供Swarm 0.2开箱的即用一些特性。
Swarm 0.2.0大约85%与Docker引擎兼容。
它支持资源管理。
它具有一些带有限制和类同功能的高级调度特性。
它支持多个发现后端(hubs,consul,etcd,zookeeper)
它使用TLS加密方法进行安全通信和验证。
那么,我们来看一看Swarm的一些相当简单而简用的使用步骤吧。
1. 运行Swarm的先决条件
我们必须在所有节点安装Docker 1.4.0或更高版本。虽然各个节点的IP地址不需要要公共地址,但是Swarm管理器必须可以通过网络访问各个节点。
注意:Swarm当前还处于beta版本,因此功能特性等还有可能发生改变,我们不推荐你在生产环境中使用。
2. 创建Swarm集群
现在,我们将通过运行下面的命令来创建Swarm集群。各个节点都将运行一个swarm节点代理,该代理会注册、监控相关的Docker守护进程,并更新发现后端获取的节点状态。下面的命令会返回一个唯一的集群ID标记,在启动节点上的Swarm代理时会用到它。
在集群管理器上运行:
# docker run swarm create
Creating Swarm Cluster
3. 启动各个节点上的Docker守护进程
我们需要登录进我们将用来创建集群的每个节点,并在其上使用-H标记启动Docker守护进程。它会保证Swarm管理器能够通过TCP访问到各个节点上的Docker远程API。要启动Docker守护进程,我们需要在各个节点内部运行以下命令。
# docker -H tcp://0.0.0.0:2375 -d
Starting Docker Daemon
4. 添加节点
在启用Docker守护进程后,我们需要添加Swarm节点到发现服务,我们必须确保节点IP可从Swarm管理器访问到。要完成该操作,我们需要在各个节点上运行以下命令。
# docker run -d swarm join --addr=<node_ip>:2375 token://<cluster_id>
Adding Nodes to Cluster
注意:我们需要用步骤2中获取到的节点IP地址和集群ID替换这里的<node_ip>和<cluster_id>。
5. 开启Swarm管理器
现在,由于我们已经获得了连接到集群的节点,我们将启动swarm管理器。我们需要在集群管理器中运行以下命令。
# docker run -d -p <swarm_port>:2375 swarm manage token://<cluster_id>
Starting Swarm Manager
6. 检查配置
一旦管理运行起来后,我们可以通过运行以下命令来检查配置。
# docker -H tcp://<manager_ip:manager_port> info
Accessing Swarm Clusters
注意:我们需要替换<manager_ip:manager_port>为运行swarm管理器的主机的IP地址和端口。
7. 使用docker CLI来访问节点
在一切都像上面说得那样完美地完成后,这一部分是Docker Swarm最为重要的部分。我们可以使用Docker CLI来访问节点,并在节点上运行容器。
# docker -H tcp://<manager_ip:manager_port> info
# docker -H tcp://<manager_ip:manager_port> run ...
8. 监听集群中的节点
我们可以使用swarm list命令来获取所有运行中节点的列表。
# docker run --rm swarm list token://<cluster_id>
Listing Swarm Nodes
尾声
Swarm真的是一个有着相当不错的功能的docker,它可以用于创建和管理集群。它相当易于配置和使用,当我们在它上面使用限制器和类同器时它更为出色。高级调度程序是一个相当不错的特性,它可以应用过滤器来通过端口、标签、健康状况来排除节点,并且它使用策略来挑选最佳节点。那么,如果你有任何问题、评论、反馈,请在下面的评论框中写出来吧,好让我们知道哪些材料需要补充或改进。谢谢大家了!尽情享受吧 :-)
Ubuntu 15.04下安装Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
配置 Docker 镜像下载的本地 mirror 服务 http://www.linuxidc.com/Linux/2015-07/120061.htm
Docker安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
在 Docker 中使用 Mysql http://www.linuxidc.com/Linux/2014-01/95354.htm
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
Docker安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04安装Docker http://www.linuxidc.com/linux/2014-08/105656.htm
阿里云CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
6. 如何搭建原生态Docker集群
检查节点Docker配置
1. 打开Docker配置文件(示例是centos 7)
vim /etc/sysconfig/docker
2. 添加-H tcp://0.0.0.0:2375到OPTIONS
OPTIONS='-g /cutome-path/docker -H tcp://0.0.0.0:2375'
3. CentOS6.6 需要另外添加-H unix:///var/run/docker.sock
OPTIONS='-g /mnt/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'
分别给A、B节点安装swarm
$ docker pull swarm
生成集群token(一次)
$ docker run --rm swarm create
其中就是我们将要创建集群的token
添加节点A、B到集群
$ docker run -d swarm join --addr=192.168.20.1:2375 token://
$ docker run -d swarm join --addr=192.168.20.2:2375 token://
列出集群A、B节点
$ docker run --rm swarm list token://
192.168.20.1:2375
192.168.20.2:2375
集群管理:
在任何一台主机A、B或者C(C:192.168.20.3)上开启管理程序。例如在C主机开启:
$ docker run -d -p 8888:2375 swarm manage token://
现在你就可以在主机C上管理集群A、B:
$ docker -H 192.168.20.3:8888 info
$ docker -H 192.168.20.3:8888 ps
$ docker -H 192.168.20.3:8888 logs ...
在集群上运行容器
$ docker -H 192.168.20.3:8888 run -d --name web1 nginx
$ docker -H 192.168.20.3:8888 run -d --name web2 nginx
$ docker -H 192.168.20.3:8888 run -d --name web3 nginx
$ docker -H 192.168.20.3:8888 run -d --name web4 nginx
$ docker -H 192.168.20.3:8888 run -d --name web5 nginx
查看集群A、B内的容器
$ docker -H 192.168.20.3:8888 ps -a
7. Docker的mysql集群节点可以正常创建,但无法正常连接到宿主机的mysql应该如何解决
Ambari是Apache的开源项目,它帮助用户在GUI页面上简单的部署、管理、监控Hadoop集群环境。Ambari支持的Hadoop组件包括HDFS、Hive、HBase、Spark、Yarn等,HortonWorks官方也是采用Ambari来完成自家HDP套件的安装、管理及监控的。除了预置的组件之外,Ambari还支持自定义组件的安装,同时,支持RESTful的API,继而可以通过命令行等方式调用Ambari来完成一些自动化的任务。
本文共分为两部分,第一部分介绍如何在Docker虚拟化环境中部署Ambari;第二部分介绍如何基于Ambari来部署和管理Hadoop集群。
### 环境信息
* Docker发行版:Docker for Mac
* Docker版本:17.06.2-ce
* Docker容器OS:Ubuntu 14.04
* Ambari版本:2.5.2.0
Docker环境准备
拉取Docker镜像:在宿主机上执行命令docker pull ubuntu:14.04从远端仓库中获取Ubuntu的镜像,也可以获取其他OS的镜像,本文以Ubuntu为例
启动Docker容器:执行如下命令,以ubuntu:14.04镜像为基础启动容器:
docker run -itd --name ambari_new -p 8080:8080 -p 3306:3306 -v /Users/yuxiaolei/Workspace/dockerShared:/dockerShared ubuntu:14.04 /bin/bash配置Ubuntu的软件仓库源:
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
国内建议采用阿里云的软件源,在root账号下用vim打开/etc/apt/sources.list文件,删除文件所有内容,粘贴如下内容:
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse执行命令apt-get update完成软件列表更新
安装Ambari所依赖的软件
apt-get install software-properties-common
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default
完成安装之后,在 ~/.bashrc 文件末尾添加命令 `export JAVA_HOME=/usr/lib/jvm/java-8-oracle ` 以配置JAVA\_HOME 环境变量。
create database ambari;use ambari;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root_password' WITH GRANT OPTION;FLUSH PRIVILEGES;exit;
由于Ambari的数据存储在MySQL数据库中,这里为Ambari单独创建了database,并为其赋了完全控制权限;说明:假设MySQL数据库root用户的密码为:root\_password
修改 `/etc/mysql/my.conf`,将`skip-external-locking`注释掉,并确保 `bind-address = 0.0.0.0` 配置,以使MySQL可被远程主机访问。
执行命令`/etc/init.d/mysql restart`重启MySQL 服务。时间同步服务器ntp:执行命令apt-get install ntp安装ntp时间同步服务器,以便于集群环境中各节点的时钟一致;执行命令sudo service ntp restart重启ntp服务。
MySQL:执行命令apt-get install mysql-server安装MySQL服务器,安装完成后执行命令mysql -uroot -proot进入MySQL客户端,执行如下SQL代码:
Oracle JDK:逐条执行如下命令,以添加WebUpd8团队(https://launchpad.net/~webupd8team/+archive/ubuntu/java)提供的Oracle JDK仓库源,并从该仓库安装JDK:
下载Ambari仓库文件
进入cd /etc/apt/sources.list.d目录,执行命令wget http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.5.2.0/ambari.list从HortonWorks仓库中下载Ambari源文件,下载后切勿修改list文件名;
执行命令apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD以信任远端仓库的GPG签名
执行命令apt-get update更新Ambari软件源
执行命令apt-get install ambari安装Ambari套件,由于软件包较大(700多MB),这里情耐心等待,不过apt-get支持断点下载,网络终端后重新执行命令时不会从零开始下载
配置Ambari:
执行命令mysql -uroot -proot进入MySQL客户端,执行命令source ambari进入ambari的数据库,并执行命令source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql来完成Ambari的数据库表初始化操作;
执行命令ambari-server setup启动Ambari的引导式配置操作,根据指导做配置即可。需要注意的是,JDK不要选择由Ambari从网络下载,应该选择自定义路径,然后输入/usr/lib/jvm/java-8-oracle即可;
启动Ambari:执行命令ambari-server start,启动日志存储路径为/var/log/ambari-server/ambari-server.log
启动之后,由于我们之前做了Docker容器的端口映射,因此可以在宿主机上打开浏览器输入http://localhost:8080即可访问Ambari登陆页面
登陆用户名和密码均为admin,登陆之后就可以看到Ambari的首页了,如下图:
{% asset_img
由于Ambari启动Web程序的时候占用8080端口,因此要从Docker宿主机上访问Ambari页面,需要通过参数 -p 来制定端口映射;
作为新手,笔者在容器内部署好Ambari之后,才发现Web页面的8080端口和MySQL的3306端口(可选)没有暴露给Docker宿主机,也就没法从宿主机上通过浏览器来登陆Ambari,因此必须想办法在已有容器上开放端口。
有两个方法:
1)如果宿主机为Linux系统,则修改iptables防火墙来指定端口映射规则;
2)如果是非Linux系统,可以将已装Ambari的容器commit为新的镜像,再基于该镜像创建新的容器。此时,就可以在docker run命令中添加参数 -p 来指定端口映射了。
还有一个问题,Ambari将其数据存储在数据库中,支持MySQL、PostgreSQL等数据库;容器内安装MySQL之后,基于上一步创建的新容器里,会发现MySQL启动不起来,执行命令/etc/init.d/mysql restart启动失败,在/var/log/mysql/error.log日志文件中打印有170802 14:02:59 [ERROR] Fatal error: Can't open and lock privilege tables: Got error 140 from storage engine的错误,经过网上查资料,需要在创建容器的时候添加参数-v /var/lib/mysql将MySQL数据存储路径声明为数据卷,即可解决问题。
启动容器之后,执行命令docker exec -it ambari /bin/bash进入容器内部。
Ambari安装
8. docker相当于一个Linux上虚拟机吗可以在docker上放置网站,提供外部访问吗
当前,Docker内部使用的是Linux容器技术(LXC),这是运行在与它的宿主机器同样的操作系统上。这准许它可以和宿主机器共享许多系统资源。它也会使用AuFS作为文件系统,也为你管理网络。
AuFS是一个层状的文件系统,因此你可以有一个只读部分和一个只写部分,然后将二者组合起来。你可以使系统的共同的部分用作只读,那块是被所有容器共享,并且给每个容器自己的可写区域
Mitisky
翻译于 3年前
3人顶
顶 翻译得不错哦!
好吧,让我们假设你有一个容器镜像(image)容量是1GB,如果你想用一个完整的虚拟机来装载,你得需要容量的大小是1GB乘上你需要虚拟机的数量。但使用Linux容器虚拟化技术(LXC)和AuFS,你可以共享1GB容量,如果你需要1000个容器,假设他们都运行在同样的系统影像上,你仍然可以用稍微比1GB多一点的空间来给容器系统,
一个完整的虚拟化系统得到了分给它的自有全部资源,只有最小的共享。你获得了更多的隔离,但是这是很庞大的(需要更多的资源)
使用Linux容器虚拟化技术(LXC),隔离性方面有所缺失,但是他们更加轻量,而且需要更少资源。所以你可以轻松运行1000个容器在一个宿主机器上,甚至眼都不眨。试着用Xen来实现那个,我想除非你有一个超级强大的主机,不然我看是不可能的了
Mitisky
翻译于 3年前
2人顶
顶 翻译得不错哦!
一个完整的虚拟系统通常得用几分钟去启动,linux容器虚拟技术(LXC)只要数秒,甚至有时时间更短。
对于每种虚拟系统都有反对者和支持者。如果你希望一个完全隔离的和资源有保障的环境,那么完全的虚拟机是你的选择。如果你只希望进程之间相互隔离,并且希望大量运行他们在一个合理大小的宿主机器上。那么linux容器虚拟技术(LXC)是你的选择。
9. 怎么用虚拟机搭建docker集群
与安装Docker Compose相似,你可以从GitHub的release分支中获取Machine的二进制安装文件,也可以下载源代码自己编译安装或者安装Docker ToolBox,ToolBox打包了所有的Docker工具,提供UI界面的安装。
例如,在OS X 机器上,你可以在Github上获取安装文件,并存储在 /usr/local/bin/docker-machine路径下,然后赋予可执行权限,可以通过测试版本的方式测试是否安装正确。例如:
$ sudo curl -L https://github.com/docker/machine/releases/download/v0.6.0/
docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
$ sudo chmod +x /usr/local/bin/docker-machine
$ docker-machine version
10. docker 访问不了外部网络吗
宿主机启docker候 docker0 虚拟网卡容器都通外面通信