Docker在云环境中的使用指南
1. 在Azure上使用Docker Machine启动Docker主机
1.1 问题描述
已知如何使用Azure CLI在Azure上启动Docker主机,但希望使用Docker Machine统一在云端启动Docker主机的方式。
1.2 解决方案
使用Docker Machine的Azure驱动,具体步骤如下:
1. 确保拥有有效的Azure订阅。
2. 下载docker - machine二进制文件,以OSX为例:
$ wget https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_darwin-amd64
$ mv docker-machine_darwin-amd64 docker-machine
$ chmod +x docker-machine
$ ./docker-machine --version
docker-machine version 0.1.0
- 创建X.509证书并通过Azure门户上传:
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
$ openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "My Certificate"
$ openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer
- 上传mycert.cer并定义环境变量:
$ export AZURE_SUBSCRIPTION_ID=<UID of your subscription>
$ export AZURE_SUBSCRIPTION_CERT=mycert.pem
- 使用docker - machine创建并设置本地Docker客户端使用远程Docker守护进程:
$ ./docker-machine create -d azure goasguen-foobar
INFO[0002] Creating Azure machine...
INFO[0061] Waiting for SSH...
INFO[0360] "goasguen-foobar" has been created and is now the active machine.
INFO[0360] To point your Docker client at it, run this in your shell: $(docker-machine env goasguen-foobar)
- 查看机器列表并设置环境变量:
$ ./docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
toto1111 * azure Running tcp://goasguen-foobar.cloudapp.net:2376
$ $(docker-machine env goasguen-foobar)
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1.3 注意事项
- goasguen - foobar是Docker机器的名称,需要是全局唯一的。
-
若要在Azure中暴露远程主机的端口80,需要在Azure门户中为创建的VM添加端点。添加后,可通过
http://<unique_name>.cloudapp.net访问nginx。
2. 在Docker容器中运行云提供商CLI
2.1 问题描述
希望利用容器在容器内运行所选的云提供商CLI,以获得更多的可移植性选项并避免从头安装CLI。
2.2 解决方案
2.2.1 Google GCE CLI
使用Google维护的公共镜像,以下是在OSX机器上使用boot2docker的示例:
$ boot2docker up
$ $(boot2docker shellinit)
$ docker pull google/cloud-sdk
$ docker images | grep google
google/cloud-sdk latest a7e7bcdfdc16 10 days ago 1.263 GB
登录并执行命令:
$ docker run -t -i --name gcloud-config google/cloud-sdk gcloud auth login
Go to the following link in your browser:
...
$ docker run --rm \
-ti \
--volumes-from gcloud-config google/cloud-sdk \
gcloud compute zones list
NAME REGION STATUS NEXT_MAINTENANCE TURNDOWN_DATE
asia-east1-c asia-east1 UP
asia-east1-a asia-east1 UP
asia-east1-b asia-east1 UP
europe-west1-b europe-west1 UP
europe-west1-c europe-west1 UP
us-central1-f us-central1 UP
us-central1-b us-central1 UP
us-central1-a us-central1 UP
使用别名简化操作:
$ alias magic='docker run --rm \
-ti \
--volumes-from gcloud-config \
google/cloud-sdk gcloud'
$ magic compute zones list
NAME REGION STATUS NEXT_MAINTENANCE TURNDOWN_DATE
asia-east1-c asia-east1 UP
asia-east1-a asia-east1 UP
asia-east1-b asia-east1 UP
europe-west1-b europe-west1 UP
europe-west1-c europe-west1 UP
us-central1-f us-central1 UP
us-central1-b us-central1 UP
us-central1-a us-central1 UP
2.2.2 AWS CLI
搜索Docker hub上的awscli镜像,以nathanleclaire/awscli为例:
$ docker pull nathanleclaire/awscli
$ docker run --rm \
-ti \
-e AWS_ACCESS_KEY_ID="AKIAIUCASDLGFIGDFGS" \
-e AWS_SECRET_ACCESS_KEY="HwQdNnAIqo/XSVASGayqerwy9797arghqQERfrgot" \
nathanleclaire/awscli \
--region eu-west-1 \
--output=table \
ec2 describe-key-pairs
-------------------------------------------------------------------------------
| DescribeKeyPairs |
+-----------------------------------------------------------------------------+
|| KeyPairs ||
|+---------------------------------------------------------------+-----------+|
|| KeyFingerprint | KeyName ||
|+---------------------------------------------------------------+-----------+|
|| 69:aa:64:4b:72:50:ee:15:9a:da:71:4e:44:cd:db:c0:a1:72:38:36 | cookbook ||
|+---------------------------------------------------------------+-----------+|
2.2.3 表格总结
| 云提供商 | 镜像 | 操作步骤 |
|---|---|---|
| Google GCE | google/cloud-sdk | 拉取镜像、登录、执行命令、可使用别名 |
| AWS | nathanleclaire/awscli | 拉取镜像、设置环境变量、执行命令 |
3. 使用Google Container Registry存储Docker镜像
3.1 问题描述
之前使用自建基础设施上的Docker私有注册表,现在希望利用托管服务,特别是新发布的处于Beta版本的Google Container Registry。
3.2 解决方案
- 注册Google Cloud Platform并下载Google Cloud CLI,创建项目。
- 更新gcloud CLI以加载预览组件:
$ gcloud components update preview
$ gcloud preview docker help
Usage: docker [OPTIONS] COMMAND [arg...]
A self-sufficient runtime for linux containers.
...
- 以上传busybox镜像为例:
$ docker images | grep busybox
busybox latest a9eb17255234 8 months ago 2.433 MB
$ docker tag busybox gcr.io/sylvan_plane_862/busybox
$ gcloud preview docker push gcr.io/sylvan_plane_862/busybox
The push refers to a repository [gcr.io/sylvan_plane_862/busybox] (len: 1)
Sending image list
Pushing repository gcr.io/sylvan_plane_862/busybox (1 tags)
511136ea3c5a: Image successfully pushed
42eed7f1bf2a: Image successfully pushed
120e218dd395: Image successfully pushed
a9eb17255234: Image successfully pushed
Pushing tag for rev [a9eb17255234] on \
{https://gcr.io/v1/repositories/sylvan_plane_862/busybox/tags/latest}
3.3 注意事项
- GCR命名空间的命名约定:如果项目ID中有破折号,需要用下划线替换。
-
同一项目中启动的Google计算实例将自动具有拉取该镜像的权限,若要让其他人拉取,需将其添加为项目成员。可使用
gcloud config set project <project_id>设置默认项目。
4. 在GCE Google - Container实例中使用Docker
4.1 问题描述
知道如何在Google GCE中启动实例并在启动时配置Docker,但希望使用已配置好Docker的镜像。
4.2 解决方案
- 确保设置项目ID:
$ gcloud config set project <project_id>
- 列出容器优化镜像:
$ gcloud compute images list
NAME PROJECT ALIAS DEPRECATED STATUS
...
container-vm-v20141208 google-containers container-vm READY
container-vm-v20150112 google-containers container-vm READY
container-vm-v20150129 google-containers container-vm READY
...
-
创建Pod清单文件
nginx.yml:
version: v1beta2
containers:
- name: nginx
image: nginx
ports:
- name: nginx
hostPort: 80
containerPort: 80
- 启动实例:
$ gcloud compute instances create cookbook-gce \
--image container-vm \
--metadata-from-file google-container-manifest=nginx.yml \
--zone europe-west1-c \
--machine-type f1-micro
4.3 结果验证
在Google GCE控制台中浏览启动的实例,允许HTTP流量。容器启动后,通过实例IP的端口80访问nginx欢迎页面。通过ssh连接到实例可查看运行的容器:
$ gcloud compute ssh cookbook-gce
...
sebastiengoasguen@cookbook-gce:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND ...
1f83bb1197c9 nginx:latest "nginx -g 'daemon of ...
b1e6fed3ee20 google/cadvisor:0.8.0 "/usr/bin/cadvisor" ...
79e879c48e9e kubernetes/pause:go "/pause" ...
0c1a51ab2f94 kubernetes/pause:go "/pause" ...
5. 使用Docker Machine在AWS上启动Docker主机
5.1 问题描述
了解如何使用AWS CLI在云端启动实例并安装Docker,但希望使用与Docker用户体验集成的简化流程。
5.2 解决方案
- 下载Docker Machine的候选版本二进制文件:
$ wget https://github.com/docker/machine/releases/download/\
v0.1.0-rc2/docker-machine_linux-amd64
$ chmod +x docker-machine
- 设置环境变量:
$ export AWS_ACCESS_KEY_ID=<your AWS access key>
$ export AWS_SECRET_ACCESS_KEY_ID=<your AWS secret key>
$ export AWS_VPC_ID=<the VPC ID you want to start the instance in>
- 创建实例:
$ ./docker-machine create -d amazonec2 cookbook
INFO[0000] Launching instance...
INFO[0023] Waiting for SSH ...
...
INFO[0129] "cookbook" has been created and is now the active machine
INFO[0129] To connect: docker $(docker-machine config cookbook) ps
- 使用本地Docker客户端与远程主机通信:
$ docker $(./docker-machine config cookbook) ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ ./docker-machine ls
NAME ACTIVE DRIVER STATE URL
cookbook * amazonec2 Running tcp://<IP_of_your_Docker_machine_in_AWS>:2376
- 完成后关闭机器:
$ ./docker-machine kill cookbook
5.3 Docker Machine CLI命令列表
| 命令 | 描述 |
|---|---|
| active | 获取或设置活动机器 |
| create | 创建机器 |
| config | 打印机器的连接配置 |
| inspect | 检查机器信息 |
| ip | 获取机器的IP地址 |
| kill | 关闭机器 |
| ls | 列出机器 |
| restart | 重启机器 |
| rm | 删除机器 |
| env | 显示设置Docker客户端环境的命令 |
| ssh | 通过SSH登录或在机器上运行命令 |
| start | 启动机器 |
| stop | 停止机器 |
| upgrade | 将机器升级到最新版本的Docker |
| url | 获取机器的URL |
| help, h | 显示命令列表或某个命令的帮助信息 |
5.4 AWS驱动选项
OPTIONS:
--amazonec2-access-key AWS Access Key [$AWS_ACCESS_KEY_ID]
--amazonec2-ami AWS machine image [$AWS_AMI]
--amazonec2-instance-type 't2.micro' AWS instance type [$AWS_INSTANCE_TYPE]
--amazonec2-region 'us-east-1' AWS region [$AWS_DEFAULT_REGION]
--amazonec2-root-size '16' AWS root disk size (in GB) [$AWS_ROOT_SIZE]
--amazonec2-secret-key AWS Secret Key [$AWS_SECRET_ACCESS_KEY]
--amazonec2-security-group 'docker-machine' AWS VPC security group [$AWS_SECURITY_GROUP]
--amazonec2-session-token AWS Session Token [$AWS_SESSION_TOKEN]
--amazonec2-subnet-id AWS VPC subnet id [$AWS_SUBNET_ID]
--amazonec2-vpc-id AWS VPC id [$AWS_VPC_ID]
--amazonec2-zone 'a' AWS zone for instance (i.e. a,b,c,d,e) [$AWS_ZONE]
6. 通过Google Container Engine在云端使用Kubernetes
6.1 问题描述
希望使用一组Docker主机并管理其上的容器,喜欢Kubernetes容器编排引擎,但希望将其作为托管云服务使用。
6.2 解决方案
- 更新gcloud SDK以使用容器引擎预览版:
$ gcloud components update preview
- 启动Kubernetes集群:
$ gcloud preview container clusters create cook --num-nodes 1 --machine-type g1-small
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS
k8s-cook-master us-central1-a g1-small 10.240.40.103 104.154.39.165 RUNNING
k8s-cook-node-1 us-central1-a g1-small 10.240.82.238 130.211.137.25 RUNNING
- 提交容器到集群:
$ gcloud preview container pods create --name wordpress \
--image=tutum/wordpress \
--port=80 wordpress
$ gcloud preview container pods describe wordpress
6.3 注意事项
Google container engine目前处于Alpha预览版,Kubernetes正在大力开发中,API可能会频繁更改,在生产环境中使用需自行承担风险。
7. 流程总结与对比
7.1 各云平台操作流程对比表格
| 云平台 | 关键操作步骤 | 注意事项 |
|---|---|---|
| Azure |
1. 下载docker - machine二进制文件
2. 创建X.509证书并上传 3. 定义环境变量 4. 使用docker - machine创建并设置本地Docker客户端使用远程Docker守护进程 | Docker机器名称需全局唯一;暴露端口需在Azure门户添加端点 |
| Google GCE |
1. 拉取Google维护的公共镜像
2. 登录并执行命令,可使用别名简化操作 | |
| AWS |
1. 下载Docker Machine候选版本二进制文件
2. 设置环境变量 3. 创建实例 4. 使用本地Docker客户端与远程主机通信 5. 完成后关闭机器 | |
| Google Container Registry |
1. 注册Google Cloud Platform并下载CLI,创建项目
2. 更新gcloud CLI加载预览组件 3. 标记并上传镜像 | 项目ID中有破折号需用下划线替换;设置默认项目可简化操作 |
| Google Container Engine |
1. 更新gcloud SDK使用容器引擎预览版
2. 启动Kubernetes集群 3. 提交容器到集群 | 处于Alpha预览版,API可能频繁更改,生产环境使用需谨慎 |
7.2 操作流程mermaid流程图
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 -->|Azure| C(下载docker - machine二进制文件):::process
B -->|Google GCE| D(拉取Google维护的公共镜像):::process
B -->|AWS| E(下载Docker Machine候选版本二进制文件):::process
B -->|Google Container Registry| F(注册Google Cloud Platform并下载CLI,创建项目):::process
B -->|Google Container Engine| G(更新gcloud SDK使用容器引擎预览版):::process
C --> C1(创建X.509证书并上传):::process
C1 --> C2(定义环境变量):::process
C2 --> C3(使用docker - machine创建并设置本地Docker客户端使用远程Docker守护进程):::process
D --> D1(登录并执行命令,可使用别名简化操作):::process
E --> E1(设置环境变量):::process
E1 --> E2(创建实例):::process
E2 --> E3(使用本地Docker客户端与远程主机通信):::process
E3 --> E4(完成后关闭机器):::process
F --> F1(更新gcloud CLI加载预览组件):::process
F1 --> F2(标记并上传镜像):::process
G --> G1(启动Kubernetes集群):::process
G1 --> G2(提交容器到集群):::process
C3 --> H([结束]):::startend
D1 --> H
E4 --> H
F2 --> H
G2 --> H
8. 综合应用场景分析
8.1 多云环境下的应用部署
在实际的企业级应用中,可能会同时使用多个云平台来满足不同的需求。例如,将核心业务部署在Google Container Engine上利用Kubernetes的强大编排能力,将一些数据处理任务部署在AWS上利用其强大的计算资源。以下是一个简单的多云部署步骤列表:
1. 在Google Container Engine上启动Kubernetes集群:
$ gcloud components update preview
$ gcloud preview container clusters create cook --num-nodes 1 --machine-type g1-small
- 在AWS上使用Docker Machine启动Docker主机:
$ wget https://github.com/docker/machine/releases
v0.1.0-rc2/docker-machine_linux-amd64
$ chmod +x docker-machine
$ export AWS_ACCESS_KEY_ID=<your AWS access key>
$ export AWS_SECRET_ACCESS_KEY_ID=<your AWS secret key>
$ export AWS_VPC_ID=<the VPC ID you want to start the instance in>
$ ./docker-machine create -d amazonec2 cookbook
-
分别在两个云平台上部署不同的应用:
在Google Container Engine上提交容器到集群:
$ gcloud preview container pods create --name wordpress \
--image=tutum/wordpress \
--port=80 wordpress
在AWS上使用本地Docker客户端与远程主机通信并部署应用:
$ docker $(./docker-machine config cookbook) ps
$ docker run -d -p 80:80 nginx
8.2 镜像存储与共享
可以利用Google Container Registry来存储和共享Docker镜像。步骤如下:
1. 注册Google Cloud Platform并下载CLI,创建项目:
$ gcloud components update preview
$ gcloud projects create <project_id>
- 标记并上传镜像:
$ docker images | grep busybox
busybox latest a9eb17255234 8 months ago 2.433 MB
$ docker tag busybox gcr.io/sylvan_plane_862/busybox
$ gcloud preview docker push gcr.io/sylvan_plane_862/busybox
- 其他用户或实例拉取镜像:
$ sudo gcloud preview docker pull gcr.io/sylvan_plane_862/busybox
9. 总结
通过上述内容,我们详细介绍了在不同云平台上使用Docker的多种方法,包括在Azure、Google GCE、AWS上启动Docker主机,在Docker容器中运行云提供商CLI,使用Google Container Registry存储镜像,在GCE Google - Container实例中使用Docker,使用Docker Machine在AWS上启动Docker主机以及通过Google Container Engine在云端使用Kubernetes等。每个云平台都有其独特的优势和适用场景,用户可以根据自己的需求选择合适的云平台和操作方法。在实际应用中,需要注意各平台的注意事项,如命名规则、端口暴露、API稳定性等。同时,合理利用多云环境和镜像存储共享功能,可以更好地满足企业级应用的需求。
总之,Docker与云平台的结合为开发者和企业提供了更高效、灵活的应用部署和管理方式,希望本文的内容能帮助读者更好地掌握相关技术,提升在云环境中使用Docker的能力。
超级会员免费看
937

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



