Executar contentores em instâncias

Pode executar um contentor Docker numa máquina com o SO otimizado para contentores da mesma forma que o faria na maioria das outras distribuições de imagens de nós, usando o comando docker run. Por exemplo:

docker run --rm busybox echo "hello world"

É apresentado o seguinte resultado:

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
Quando faz a gestão de chaves SSH nos metadados, todas as contas de utilizador geridas pelo Compute Engine na imagem cos são adicionadas ao grupo docker por predefinição. Isto permite que qualquer utilizador com sessão iniciada execute comandos docker sem privilégios de acesso root. Quando gere chaves SSH através do Início de sessão no SO, a conta de utilizador tem de ser adicionada manualmente ao grupo docker. Caso contrário, o utilizador tem de adicionar sudo para cada comando docker.

Aceder a imagens públicas no Container Registry ou no Artifact Registry

O suporte do Container Registry está incorporado na imagem do nó cos. Para iniciar um contentor a partir do Container Registry, execute o seguinte comando:

docker run --rm gcr.io/google-containers/busybox echo "hello world"

É apresentado o seguinte resultado:

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

Aceder a imagens privadas no Artifact Registry ou no Container Registry

A partir dos lançamentos da etapa 60, o docker-credential-gcr está pré-instalado nas imagens do SO otimizado para contentores. É a forma recomendada de aceder a imagens privadas no Artifact Registry ou no Container Registry.

Para usar docker-credential-gcr, execute o seguinte comando:

Artifact Registry

docker-credential-gcr configure-docker --registries LOCATION-docker.pkg.dev

Substitua LOCATION pela localização do seu repositório.

Container Registry

docker-credential-gcr configure-docker

É apresentado o seguinte resultado:

/home/username/.docker/config.json configured to use this credential helper

Para executar uma imagem a partir do registo, use o seguinte comando:

Artifact Registry

docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image

Substitua LOCATION pela localização do seu repositório.

Container Registry

docker run --rm gcr.io/your-project/your-image

Pode usar os seguintes nomes de anfitrião do Container Registry:

  • us.gcr.io
  • eu.gcr.io
  • asia.gcr.io

Para usar o Docker com o sudo, execute o seguinte comando. O sinalizador -E de linha de comandos faz com que o Docker use o ficheiro .docker/config.json do diretório principal de um utilizador em vez do diretório principal raiz.

Artifact Registry

sudo -E docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image

Substitua LOCATION pela localização do seu repositório.

Container Registry

sudo -E docker run --rm gcr.io/your-project/your-image

Os nomes de anfitriões do Container Registry suportados são:

  • us.gcr.io
  • eu.gcr.io
  • asia.gcr.io

Em alternativa, pode obter os tokens de acesso OAuth adequados dos metadados do Compute Engine e usá-los manualmente com o comando docker login, conforme mostrado no exemplo seguinte:

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

Usar o cloud-init com o Container Registry

Este exemplo de cloud-init usa o formato de configuração na nuvem para iniciar um contentor Docker a partir de uma imagem armazenada no registo de contentores do Docker denominado DockerHub. O exemplo abaixo usa o formato de configuração da nuvem para iniciar um contentor Docker a partir de uma imagem armazenada no Container Registry:

#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

Configurar o daemon do Docker para extrair imagens da cache do registo

Pode configurar o daemon do Docker para extrair imagens de uma cache de registo através de espelhos de registo.

  1. Configure o daemon para usar a opção registry-mirror de uma das seguintes formas:

    • No ficheiro /etc/default/docker, adicione a opção registry-mirror para o registo (por exemplo, https://mirror.gcr.io):
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    • No ficheiro /etc/default/docker, anexe "--registry-mirror=https://mirror.gcr.io" ao DOCKER_OPTS existente:
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
  2. Depois de adicionar o espelho de registo, reinicie o daemon do Docker para que as alterações entrem em vigor:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

A adição de uma configuração a /etc/default/docker não é persistente após o reinício. Para garantir que a configuração do Docker permanece persistente nos reinícios, considere adicionar os comandos no script cloud-init dos metadados da instância no formato cloud-config ou startup script.

O exemplo seguinte usa o formato cloud-config para configurar um registry-mirror:

#cloud-config

runcmd:
- echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- systemctl daemon-reload
- systemctl restart docker

Para mais informações sobre a configuração de uma instância com cloud-init, consulte o artigo Usar o cloud-init com o formato de configuração na nuvem.

Resolução de problemas

Resolução de conflitos de opções entre o Docker daemon.json e as flags

Quando configurar o daemon do Docker, se a mesma opção for definida com um ficheiro daemon.json e com flags, o Docker não é iniciado e é apresentado um erro semelhante ao seguinte:

unable to configure the Docker daemon with file /etc/docker/daemon.json:
the following directives are specified both as a flag and in the configuration file:

A solução recomendada para resolver este conflito é modificar o ficheiro default daemon.json, que se encontra em /etc/docker/daemon.json. A modificação deste ficheiro permite alterar apenas as opções afetadas, mantendo as outras opções predefinidas. Isto pode ser feito através de cloud-init, por exemplo, usando um cloud-config semelhante ao seguinte:

#cloud-config

write_files:
- path: /tmp/modify_docker_daemon_opts.py
  permissions: 0744
  owner: root
  content: |
    import json, sys, os, logging

    DAEMON_OPTS_FILE = '/etc/docker/daemon.json'

    opts = {}
    if os.path.exists(DAEMON_OPTS_FILE):
      with open(DAEMON_OPTS_FILE) as f:
          try:
            opts = json.load(f)
          except:
            logging.info("json parsing failed, starting with empty config.")
            pass
    # Add your daemon option modifications here
    # For example,
    # opts['log-opts']['max-size'] = '100m'
    with open(DAEMON_OPTS_FILE, 'w') as f:
        json.dump(opts, f)

runcmd:
- python /tmp/modify_docker_daemon_opts.py
- rm -f /tmp/modify_docker_daemon_opts.py
- systemctl restart docker.service