您可以在运行 Container-Optimized OS 的计算机上运行 Docker 容器,其方式与在其他大多数其他节点映像发行版上的运行方式非常相似:使用 docker run
命令。例如:
docker run --rm busybox echo "hello world"
将出现以下输出:
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
在管理元数据中的 SSH 密钥时,默认情况下,Google Compute Engine 在 cos
映像上管理的所有用户帐号都会添加到 docker
组。这使得任何已登录用户都可以在没有 root 权限的情况下运行 docker
命令。使用 OS Login 管理 SSH 密钥时,需要手动将用户帐号添加到 docker
群组。否则,用户必须为每个 docker
命令添加 sudo
。
访问 Container Registry 或 Artifact Registry 中的公共映像
cos
节点映像内置 Container Registry 支持。要从 Container Registry 启动容器,请运行如下命令:
docker run --rm gcr.io/google-containers/busybox echo "hello world"
将出现以下输出:
Unable to find image 'gcr.io/google-containers/busybox:latest' locally
Pulling repository gcr.io/google-containers/busybox
. . .
Status: Downloaded newer image for gcr.io/google-containers/busybox:latest
hello world
访问 Artifact Registry 或 Container Registry 中的私有映像
从里程碑 60 版本开始,Container-Optimized OS 映像预先安装 docker-credential-gcr
。推荐使用此方法来访问 Artifact Registry 或 Container Registry 中的私有映像。
要使用 docker-credential-gcr
,请运行以下命令:
Artifact Registry
docker-credential-gcr configure-docker --registries LOCATION-docker.pkg.dev
将 LOCATION 替换为您的代码库的位置。
Container Registry
docker-credential-gcr configure-docker
将出现以下输出:
/home/username/.docker/config.json configured to use this credential helper
要从镜像仓库中运行映像,请使用以下命令:
Artifact Registry
docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image
将 LOCATION 替换为您的代码库的位置。
Container Registry
docker run --rm gcr.io/your-project/your-image
受支持的 Container Registry 主机名为:
- us.gcr.io
- eu.gcr.io
- asia.gcr.io
此外,您还可以从 Compute Engine 元数据中获取适当的 OAuth 访问令牌,并通过 docker login
命令手动使用这些令牌,如以下示例所示:
METADATA=http://metadata.google.internal/computeMetadata/v1
SVC_ACCT=$METADATA/instance/service-accounts/default
ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token | cut -d'"' -f 4)
docker login -u oauth2accesstoken -p $ACCESS_TOKEN https://gcr.io
docker run … gcr.io/your-project/your-image
将 cloud-init 与 Container Registry 配合使用
此 cloud-init 示例使用 Cloud Config 格式从存储在 Docker 容器注册表 DockerHub 中的映像启动 Docker 容器。以下示例使用 Cloud Config 格式从存储在 Container Registry 中的映像启动 Docker 容器:
#cloud-config
write_files:
- path: /etc/systemd/system/cloudservice.service
permissions: 0644
owner: root
content: |
[Unit]
Description=Start a simple docker container
Wants=gcr-online.target
After=gcr-online.target
[Service]
Environment="HOME=/home/cloudservice"
ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
ExecStart=/usr/bin/docker run --rm --name=mycloudservice gcr.io/google-containers/busybox:latest /bin/sleep 3600
ExecStop=/usr/bin/docker stop mycloudservice
ExecStopPost=/usr/bin/docker rm mycloudservice
runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service
配置 Docker 守护程序以从注册表缓存中拉取映像
您可以配置 Docker 守护程序,以使用注册表镜像从注册表缓存中拉取映像。
通过以下方式之一将守护程序配置为使用
registry-mirror
选项:- 在
/etc/default/docker
文件中,添加注册表的registry-mirror
选项(例如https://mirror.gcr.io
):
echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- 在
/etc/default/docker
文件中,将"--registry-mirror=https://mirror.gcr.io"
附加到现有DOCKER_OPTS
:
sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
- 在
添加注册表镜像后,重启 Docker 守护程序以使更改生效:
sudo systemctl daemon-reload sudo systemctl restart docker
将配置添加到 /etc/default/docker
在重新启动后不再存在。要确保重新启动后 Docker 配置仍然存在,请考虑在采用 cloud-config
格式 的实例元数据的 cloud-init
脚本中或在 startup script
中添加命令。
以下示例使用 cloud-config
格式配置 registry-mirror
:
#cloud-config
runcmd:
- echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- systemctl daemon-reload
- systemctl restart docker
运行 Kubernetes 集群
在 Google Cloud 上运行 Kubernetes 集群的推荐方法是使用 Google Kubernetes Engine (GKE)。但是,如果要运行自行管理版本的开放源代码 Kubernetes,请按照如下说明操作。
- 确保在防火墙中打开端口 443,以保证可以访问您的 Kubernetes 主实例。
下载 Kubernetes 版本的二进制文件,将其解压缩并启动集群,如下所示:
# Download and extract the latest kubernetes release. cd <empty-dir> KUBERNETES_VERSION="v1.4.6" curl -sSL -o kubernetes.tar.gz https://github.com/kubernetes/kubernetes/releases/download/${KUBERNETES_VERSION}/kubernetes.tar.gz tar xzf kubernetes.tar.gz cd kubernetes # Configure environment to use Container-Optimized OS export KUBE_OS_DISTRIBUTION=cos # Start up a cluster and verify that it is running: cluster/kube-up.sh cluster/kubectl.sh get nodes cluster/kubectl.sh get pods --namespace=kube-system
现在,您可以在集群上运行应用。例如,您可以使用以下示例启动 Redis 集群:
cluster/kubectl.sh create -f \ examples/guestbook/all-in-one/guestbook-all-in-one.yaml cluster/kubectl.sh get pods cluster/kubectl.sh describe pods redis-master-pod-name
对于作为 GKE 集群的一部分运行的实例,Docker 和 Kubelet 日志也会自动导出到 Google Cloud 的运维套件日志记录。使用 Google Cloud Console 时,在 Google Cloud 的运维套件的 Compute Engine 虚拟机实例下可以找到 Docker、Kubelet 和 kube-proxy
日志。
不再需要您的集群时,您可以将其删除:
cluster/kube-down.sh