Puoi eseguire un container Docker su una macchina che esegue Container-Optimized OS in modo molto simile a come faresti sulla maggior parte delle altre distribuzioni di immagini del nodo utilizzando il comando docker run
. Ad esempio:
docker run --rm busybox echo "hello world"
Viene visualizzato il seguente output:
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
cos
vengono aggiunti al gruppo docker
per impostazione predefinita. In questo modo, qualsiasi
utente che ha eseguito l'accesso può eseguire comandi docker
senza privilegi di root. Quando gestisci le chiavi SSH tramite Accesso al sistema operativo, l'account utente deve essere aggiunto manualmente al gruppo docker
. In caso contrario, l'utente deve aggiungere sudo
per ogni comando docker
.
Accedere alle immagini pubbliche in Container Registry o Artifact Registry
Il supporto di Container Registry è integrato nell'immagine del nodo cos
. Per avviare un container da Container Registry, esegui:
docker run --rm gcr.io/google-containers/busybox echo "hello world"
Viene visualizzato il seguente output:
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
Accesso alle immagini private in Artifact Registry o Container Registry
A partire dalle release del traguardo 60,
docker-credential-gcr
è preinstallato nelle immagini Container-Optimized OS. È il modo consigliato per accedere alle immagini private in Artifact Registry o Container Registry.
Per utilizzare docker-credential-gcr
, esegui il seguente comando:
Artifact Registry
docker-credential-gcr configure-docker --registries LOCATION-docker.pkg.dev
Sostituisci LOCATION con la posizione del repository.
Container Registry
docker-credential-gcr configure-docker
Viene visualizzato il seguente output:
/home/username/.docker/config.json configured to use this credential helper
Per eseguire un'immagine dal registry, utilizza il seguente comando:
Artifact Registry
docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image
Sostituisci LOCATION con la posizione del repository.
Container Registry
docker run --rm gcr.io/your-project/your-image
Puoi utilizzare i seguenti nomi host di Container Registry:
- us.gcr.io
- eu.gcr.io
- asia.gcr.io
Per utilizzare docker con sudo
, esegui il seguente comando. Il flag -E
della riga di comando consente a Docker di utilizzare il file .docker/config.json
dalla home directory di un utente anziché dalla home directory principale.
Artifact Registry
sudo -E docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image
Sostituisci LOCATION con la posizione del repository.
Container Registry
sudo -E docker run --rm gcr.io/your-project/your-image
I nomi host di Container Registry supportati sono:
- us.gcr.io
- eu.gcr.io
- asia.gcr.io
In alternativa, puoi recuperare i token di accesso OAuth appropriati dai metadati di Compute Engine e utilizzarli manualmente con il comando docker login
, come mostrato nell'esempio seguente:
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
Utilizzo di cloud-init con Container Registry
Questo esempio di cloud-init utilizza il formato Cloud Config per avviare un container Docker da un'immagine memorizzata nel registry dei container di Docker chiamato Docker Hub. L'esempio seguente utilizza il formato Cloud Config per avviare un contenitore Docker da un'immagine archiviata in 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
Configurazione del daemon Docker per estrarre le immagini dalla cache del registry
Puoi configurare il daemon Docker in modo che estragga le immagini da una cache del registry utilizzando gli specchi del registry.
Configura il daemon in modo che utilizzi l'opzione
registry-mirror
in uno dei modi seguenti:- Nel file
/etc/default/docker
, aggiungi l'opzioneregistry-mirror
per il registry (ad esempiohttps://mirror.gcr.io
):
echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- Nel file
/etc/default/docker
, aggiungi"--registry-mirror=https://mirror.gcr.io"
aDOCKER_OPTS
esistente:
sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
- Nel file
Dopo aver aggiunto il mirror del registry, riavvia il daemon Docker affinché le modifiche vengano applicate:
sudo systemctl daemon-reload sudo systemctl restart docker
L'aggiunta di una configurazione a /etc/default/docker
non è persistente dopo il riavvio.
Per assicurarti che la configurazione di Docker rimanga persistente dopo i riavvii,
valuta la possibilità di aggiungere i comandi nello script cloud-init
dei metadati dell'istanza nel
formato cloud-config
o in startup script
.
L'esempio seguente utilizza il formato cloud-config
per configurare un
registry-mirror
:
#cloud-config
runcmd:
- echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- systemctl daemon-reload
- systemctl restart docker
Per scoprire di più sulla configurazione di un'istanza con cloud-init
, consulta
Utilizzare cloud-init con il formato di configurazione Cloud.
Risoluzione dei problemi
Risolvere i conflitti di opzioni tra Docker daemon.json
e i flag
Quando configuri il daemon Docker, se la stessa opzione è impostata con un file daemon.json
e con i flag, Docker non riuscirà ad avviarsi con un errore simile a:
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:
La soluzione consigliata per risolvere questo conflitto è modificare il valore predefinito
daemon.json
, che si trova in /etc/docker/daemon.json
. La modifica di questo
file consente di modificare solo le opzioni interessate, mantenendo invariate le altre opzioni predefinite. Questo può essere fatto utilizzando cloud-init
, ad esempio utilizzando un
cloud-config
simile a:
#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