Docker服务注册与云环境部署指南
1. etcd中服务键的命名规则
在etcd中存储的键的命名规则基于registrator创建并传递给注册表后端的Service对象。Service结构定义如下:
type Service struct {
ID string // <hostname>:<container-name>:<internal-port>
//[:udp if udp]
Name string // <basename(container-image)>
//[-<internal-port> if >1 published ports]
Port int // <host-port>
IP string // <host-ip> || <resolve(hostname)> if 0.0.0.0
Tags []string // empty, or includes 'udp' if udp
Attrs map[string]string // any remaining service metadata from environment
}
服务的键由以下规则定义:
<registry-uri-path>/<service-name>/<service-id>
例如:
cookbook/nginx-80/192.168.33.10:pensive_franklin:80
并设置为
<ip>:<port>
,在上述示例中为
192.168.33.10:80
。
2. 切换到Consul注册表后端
如果你不想使用etcd,而是使用Consul,可以切换注册表后端。可以在单主机上轻松尝试,使用Docker Hub上的
progrium/consul
镜像。操作步骤如下:
1. 拉取镜像并在一个终端会话中运行Consul代理(此示例中Consul容器未分离):
$ docker pull progrium/consul
$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h cookbook progrium/consul -server -bootstrap -ui-dir /ui
-
在另一个会话中启动registrator,但将注册表URI更改为
consul://192.168.33.10:8500/foobar:
$ docker run -d -v /var/run/docker.sock:/tmp/docker.sock -h 192.168.33.10 gliderlabs/registrator -ip 192.168.33.10 consul://192.168.33.10:8500/foobar
- 启动一个nginx容器:
$ docker run -d -p 80:80 nginx
-
检查Consul UI(
http://192.168.33.10:8500/ui),会看到创建了一个foobar目录,其中包含几个键,包括Consul容器本身的键和nginx容器的键。
3. 在公共云环境中运行Docker
随着公有云和私有云的出现,企业将越来越多的工作负载迁移到了云端。目前,大量的IT基础设施部署在像亚马逊网络服务(AWS)、谷歌计算引擎(GCE)和微软Azure这样的公共云上。同时,企业也部署了私有云以满足IT的自助服务需求。
3.1 访问公共云以运行Docker
如果你需要访问公共云以在云实例中运行Docker,可按以下步骤操作:
1. 如果你还没有访问权限,在你选择的公共云提供商处创建一个账户:
- 对于GCE,可以从免费试用开始,需要一个Google账户,然后可以登录控制台。
- 对于Azure,可以从免费试用开始。
- 对于AWS,可以使用免费套餐,创建账户后可以登录控制台。
2. 登录你要使用的提供商的Web控制台,通过启动实例向导,确保可以启动一个可以通过SSH连接的实例。
3.2 在AWS EC2上启动Docker主机
如果你想在AWS EC2云上启动一个VM实例并将其用作Docker主机,可按以下步骤操作:
1. 获取一组API密钥:在Web控制台中,选择页面右上角的账户名称,转到安全凭证页面,创建一个新的访问密钥,对应的秘密密钥只会显示一次,确保安全存储。
2. 安装并配置AWS CLI:
$ sudo apt-get -y install python-pip
$ sudo pip install awscli
$ aws configure
AWS Access Key ID [****************n-mg]: AKIAIEFDGHQRTW3MNQ
AWS Secret Access Key [****************UjEg]: b4pWYhMUosg976arg9869Qd+Yg1qo22wC
Default region name [eu-east-1]: eu-west-1
Default output format [table]:
$ aws --version
aws-cli/1.7.4 Python/2.7.6 Linux/3.13.0-32-generic
- 设置SSH密钥对:
$ aws ec2 create-key-pair --key-name cookbook
$ vi ~/.ssh/id_rsa_cookbook
$ chmod 600 ~/.ssh/id_rsa_cookbook
$ aws ec2 describe-key-pairs
- 启动EC2实例:
$ aws ec2 run-instances --image-id ami-7b3db00c --count 1 --instance-type t1.micro --key-name cookbook
$ aws ec2 describe-instances
$ ssh -i ~/.ssh/id_rsa_cookbook ec2-user@54.194.31.39
- 安装Docker包,启动Docker守护进程并验证Docker CLI是否正常工作:
[ec2-user@ip-172-31-8-174 ~]$ sudo yum install docker
[ec2-user@ip-172-31-8-174 ~]$ sudo service docker start
[ec2-user@ip-172-31-8-174 ~]$ sudo docker ps
- 不要忘记终止实例,否则可能会产生费用:
$ aws ec2 terminate-instances --instance-ids <instance id>
3.3 使用用户数据自动安装Docker
AWS的Amazon Linux AMI包含cloud-init,可在实例创建时传递用户数据。操作步骤如下:
1. 创建一个小的bash脚本:
#!/bin/bash
yum -y install docker
service docker start
- 对脚本进行Base64编码并传递给实例创建命令:
$ udata="$(cat docker.sh | base64 )"
$ aws ec2 run-instances --image-id ami-7b3db00c --count 1 --instance-type t1.micro --key-name cookbook --user-data $udata
$ ssh -i ~/.ssh/id_rsa_cookbook ec2-user@<public IP of the created instance>
$ sudo docker ps
如果要远程访问Docker守护进程,需要设置TLS访问并在安全组中打开端口2376。
4. 在Google GCE上启动Docker主机
如果你想在Google GCE云上启动一个VM实例并将其用作Docker主机,可按以下步骤操作:
1. 安装gcloud CLI并登录Google云:
$ curl https://sdk.cloud.google.com | bash
$ gcloud auth login
- 列出可用区域:
$ gcloud compute zones list
- 如果没有设置项目,在Web控制台中设置一个项目。
- 设置默认的区域和区域:
$ gcloud config set compute/region europe-west1
$ gcloud config set compute/zone europe-west1-c
$ gcloud config list --all
- 启动实例:
$ gcloud compute instances create cookbook \
--machine-type n1-standard-1 \
--image ubuntu-14-04 \
--metadata startup-script="sudo apt-get -y install docker.io"
$ gcloud compute ssh cookbook
- 验证Docker是否正常工作:
sebastiengoasguen@cookbook:~$ sudo docker ps
- 删除实例:
$ gcloud compute instances delete cookbook
4.1 GCE上的特殊镜像
GCE提供了一些对Docker特定任务非常有用的镜像,例如CoreOS镜像和容器VM。如果要启动CoreOS实例,可以使用镜像别名,无需指定任何元数据来安装Docker:
$ gcloud compute instances create cookbook --machine-type n1-standard-1 --image coreos
$ gcloud compute ssh cookbook
5. 在Microsoft Azure上启动Docker主机
如果你想在Microsoft Azure云上启动一个VM实例并将其用作Docker主机,可按以下步骤操作:
1. 如果你还没有Azure账户,创建一个账户。
2. 安装Azure CLI:
$ sudo apt-get update
$ sudo apt-get -y install nodejs-legacy
$ sudo apt-get -y install npm
$ sudo npm install -g azure-cli
$ azure -v
- 设置账户认证:
$ azure account download
$ azure account import ~/Downloads/Free\ Trial-2-5-2015-credentials.publishsettings
$ azure account list
- 选择位置和镜像:
$ azure vm image list | grep Ubuntu
$ azure vm location list
- 创建具有SSH访问权限的实例:
$ azure vm create cookbook --ssh=22 \
--password #@$#%#@$ \
--userName cookbook \
--location "West Europe" \
b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20150
$ azure vm list
- SSH到实例并设置Docker。
5.2 使用Azure CLI自动创建Docker主机
Azure CLI允许使用
azure vm docker create
命令自动创建Docker主机:
$ azure vm docker create goasguen -l "West Europe" \
b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-serve
$ azure vm list
启动的主机将自动运行Docker守护进程,可以使用Docker客户端通过TLS连接进行连接:
$ docker --tls -H tcp://goasguen.cloudapp.net:4243 ps
$ docker --tls -H tcp://goasguen.cloudapp.net:4243 images
总结
通过以上步骤,我们可以在不同的公共云环境中轻松启动Docker主机,并进行服务注册和管理。无论是使用etcd还是Consul进行服务注册,还是在AWS、GCE或Azure上启动Docker主机,都有相应的操作步骤和注意事项。在实际应用中,可以根据具体需求选择合适的云提供商和服务注册方式。
6. 各云平台启动Docker主机对比
为了更清晰地了解在不同云平台上启动Docker主机的差异,下面通过表格进行对比:
| 云平台 | 所需准备 | 启动步骤 | 特殊说明 |
| — | — | — | — |
| AWS EC2 | API密钥、SSH密钥对 | 1. 获取API密钥;2. 安装并配置AWS CLI;3. 设置SSH密钥对;4. 启动EC2实例;5. 安装Docker;6. 终止实例 | 可使用用户数据自动安装Docker,远程访问需设置TLS和开放端口2376 |
| Google GCE | gcloud CLI、Google账户 | 1. 安装gcloud CLI并登录;2. 列出可用区域;3. 设置项目;4. 设置默认区域和区域;5. 启动实例;6. 验证Docker;7. 删除实例 | 提供CoreOS和容器VM镜像,启动CoreOS实例无需指定安装Docker元数据 |
| Microsoft Azure | Azure账户、Azure CLI | 1. 创建Azure账户;2. 安装Azure CLI;3. 设置账户认证;4. 选择位置和镜像;5. 创建具有SSH访问权限的实例;6. SSH到实例设置Docker | 可使用
azure vm docker create
命令自动创建Docker主机并运行守护进程 |
6.1 操作流程对比图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{选择云平台}:::decision
B -->|AWS EC2| C(获取API密钥):::process
B -->|Google GCE| D(安装gcloud CLI):::process
B -->|Microsoft Azure| E(创建Azure账户):::process
C --> F(安装并配置AWS CLI):::process
D --> G(登录Google云):::process
E --> H(安装Azure CLI):::process
F --> I(设置SSH密钥对):::process
G --> J(列出可用区域):::process
H --> K(设置账户认证):::process
I --> L(启动EC2实例):::process
J --> M(设置项目):::process
K --> N(选择位置和镜像):::process
L --> O(安装Docker):::process
M --> P(设置默认区域和区域):::process
N --> Q(创建具有SSH访问权限的实例):::process
O --> R(验证并使用Docker):::process
P --> S(启动实例):::process
Q --> T(SSH到实例设置Docker):::process
S --> R
T --> R
R --> U([结束]):::startend
7. 服务注册与云部署的最佳实践
7.1 服务注册选择
- etcd :适用于对键值存储有较高要求,且需要与现有的基于etcd的系统集成的场景。其键的命名规则基于Service对象,结构清晰,方便管理。
- Consul :提供了可视化的UI界面,便于监控和管理服务。如果需要更直观地查看服务状态和进行服务发现,Consul是一个不错的选择。
7.2 云平台选择
- AWS EC2 :拥有丰富的计算资源和完善的生态系统,对于大规模的企业级应用部署较为合适。特别是其提供的Amazon Linux AMI,方便快速部署Docker环境。
- Google GCE :提供了多种适合Docker的镜像,如CoreOS和容器VM,对于需要特定操作系统和环境的应用部署有优势。
- Microsoft Azure :与Windows系统的集成度较高,如果企业内部有大量的Windows应用需要与Docker结合使用,Azure是一个不错的选择。
7.3 安全注意事项
- 网络安全 :在各个云平台上,都需要合理设置安全组和防火墙规则,确保Docker主机和容器的网络安全。例如,在AWS上需要配置安全组来控制流量,在GCE上需要设置实例防火墙。
- 认证和授权 :妥善管理API密钥、SSH密钥对和账户认证信息,避免信息泄露导致安全风险。
8. 常见问题及解决方案
8.1 服务注册问题
- 问题描述 :在使用registrator进行服务注册时,可能会出现服务未成功注册到etcd或Consul的情况。
- 解决方案 :检查registrator的配置是否正确,包括注册表URI、IP地址等。同时,检查etcd或Consul服务是否正常运行。
8.2 云平台实例启动问题
- 问题描述 :在AWS、GCE或Azure上启动实例时,可能会遇到实例无法启动或无法通过SSH连接的问题。
- 解决方案 :检查API密钥、SSH密钥对和账户认证信息是否正确。查看云平台的日志和监控信息,排查是否存在资源不足或配置错误的情况。
8.3 Docker安装问题
- 问题描述 :在实例上安装Docker时,可能会遇到安装失败或Docker服务无法启动的问题。
- 解决方案 :检查网络连接是否正常,确保可以访问Docker的软件源。查看安装日志,排查是否存在依赖问题或权限问题。
9. 总结与展望
通过对不同云平台上启动Docker主机和服务注册的详细介绍,我们了解了在现代云计算环境中如何高效地部署和管理Docker应用。在实际应用中,我们可以根据具体的业务需求和技术栈选择合适的云平台和服务注册方式。
未来,随着云计算和容器技术的不断发展,我们可以期待更便捷、高效的部署和管理工具的出现。同时,安全和性能方面的优化也将成为重要的研究方向,以满足企业对大规模、高可用应用的需求。
在实际操作中,我们可以不断积累经验,探索更多的优化和应用场景,将Docker和云计算技术更好地应用到实际业务中。
超级会员免费看
994

被折叠的 条评论
为什么被折叠?



