18、Docker在云环境中的使用指南

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
  1. 创建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
  1. 上传mycert.cer并定义环境变量:
$ export AZURE_SUBSCRIPTION_ID=<UID of your subscription>
$ export AZURE_SUBSCRIPTION_CERT=mycert.pem
  1. 使用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)
  1. 查看机器列表并设置环境变量:
$ ./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 解决方案

  1. 注册Google Cloud Platform并下载Google Cloud CLI,创建项目。
  2. 更新gcloud CLI以加载预览组件:
$ gcloud components update preview
$ gcloud preview docker help
Usage: docker [OPTIONS] COMMAND [arg...]
A self-sufficient runtime for linux containers.
...
  1. 以上传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 解决方案

  1. 确保设置项目ID:
$ gcloud config set project <project_id>
  1. 列出容器优化镜像:
$ 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
...
  1. 创建Pod清单文件 nginx.yml
version: v1beta2
containers:
  - name: nginx
    image: nginx
    ports:
      - name: nginx
        hostPort: 80
        containerPort: 80
  1. 启动实例:
$ 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 解决方案

  1. 下载Docker Machine的候选版本二进制文件:
$ wget https://github.com/docker/machine/releases/download/\
       v0.1.0-rc2/docker-machine_linux-amd64
$ chmod +x docker-machine
  1. 设置环境变量:
$ 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>
  1. 创建实例:
$ ./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
  1. 使用本地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
  1. 完成后关闭机器:
$ ./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 解决方案

  1. 更新gcloud SDK以使用容器引擎预览版:
$ gcloud components update preview
  1. 启动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
  1. 提交容器到集群:
$ 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
  1. 在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
  1. 分别在两个云平台上部署不同的应用:
    在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>
  1. 标记并上传镜像:
$ 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
  1. 其他用户或实例拉取镜像:
$ 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的能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值