Puoi eseguire un container Docker su una macchina che esegue Container-Optimized OS
quasi allo stesso modo in cui faresti con la maggior parte delle altre distribuzioni di immagini dei nodi, 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 i comandi docker senza privilegi di root. Quando gestisci le chiavi SSH
utilizzando OS Login, l'account utente deve essere aggiunto manualmente al gruppo docker. In caso contrario, l'utente deve aggiungere sudo per ogni comando docker.
Accesso 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 a immagini private in Artifact Registry o Container Registry
A partire dalle release milestone 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.devSostituisci LOCATION con la posizione del tuo repository.
Container Registry
docker-credential-gcr configure-dockerViene visualizzato il seguente output:
/home/username/.docker/config.json configured to use this credential helper
Per eseguire un'immagine dal registro, utilizza il comando seguente:
Artifact Registry
docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-imageSostituisci LOCATION con la posizione del tuo repository.
Container Registry
docker run --rm gcr.io/your-project/your-imagePuoi 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 della riga di comando -E fa in modo che Docker utilizzi 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-imageSostituisci LOCATION con la posizione del tuo repository.
Container Registry
sudo -E docker run --rm gcr.io/your-project/your-imageI nomi host 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/v1SVC_ACCT=$METADATA/instance/service-accounts/defaultACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token | cut -d'"' -f 4)docker login -u oauth2accesstoken -p $ACCESS_TOKEN https://gcr.iodocker 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 registro dei container di Docker chiamato DockerHub. L'esempio seguente utilizza il formato Cloud Config per avviare un container 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 immagini dalla cache del registro
Puoi configurare il daemon Docker per estrarre le immagini da una cache del registro utilizzando i mirror del registro.
Configura il daemon in modo che utilizzi l'opzione
registry-mirrorin uno dei seguenti modi:- Nel file
/etc/default/docker, aggiungi l'opzioneregistry-mirrorper il registro (ad esempio,https://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"alDOCKER_OPTSesistente:
sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker- Nel file
Dopo aver aggiunto il mirror del registro, 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 invariata dopo i riavvii,
valuta la possibilità di aggiungere i comandi nello script cloud-init dei metadati dell'istanza nel cloud-config formato
o 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 saperne di più sulla configurazione di un'istanza con cloud-init, consulta
Utilizzo di cloud-init con il formato di configurazione cloud.
Risoluzione dei problemi
Risoluzione dei conflitti tra le opzioni di Docker daemon.json e i flag
Quando configuri il daemon Docker, se la stessa opzione è impostata con un file daemon.json e con flag, Docker non verrà avviato e verrà visualizzato 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 di
daemon.json, che si trova in /etc/docker/daemon.json. La modifica di questo
file consente di cambiare solo le opzioni interessate, mantenendo le altre
opzioni predefinite. Puoi farlo 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