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
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.
Configure o daemon para usar a opção
registry-mirror
de uma das seguintes formas:- No ficheiro
/etc/default/docker
, adicione a opçãoregistry-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"
aoDOCKER_OPTS
existente:
sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
- No ficheiro
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