Vous pouvez exécuter un conteneur Docker sur une machine exécutant unContainer-Optimized OS de la même manière que vous le feriez sur la plupart des autres distributions d'images de noeud, en utilisant la commande docker run
. Exemple :
docker run --rm busybox echo "hello world"
Le résultat suivant s'affiche :
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
cos
sont ajoutés par défaut au groupe docker
. Ainsi,
L'utilisateur connecté exécute des commandes docker
sans disposer de droits d'administrateur. Lorsque vous gérez SSH
clés à l'aide d'OS Login, le compte utilisateur doit être ajouté au groupe docker
manuellement. Sinon, l'utilisateur doit ajouter sudo
pour chaque commande docker
.
Accéder aux images publiques dans Container Registry ou Artifact Registry
L'assistance Container Registry est intégrée à l'image de nœud cos
. Pour démarrer un conteneur à partir de Container Registry, exécutez :
docker run --rm gcr.io/google-containers/busybox echo "hello world"
Le résultat suivant s'affiche :
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
Accéder aux images privées dans Artifact Registry ou Container Registry
À partir des versions 60,
docker-credential-gcr
est préinstallé dans les images Container-Optimized OS. C'est la méthode recommandée pour accéder aux images privées dans Artifact Registry ou Container Registry.
Pour utiliser docker-credential-gcr
, exécutez la commande suivante :
Artifact Registry
docker-credential-gcr configure-docker --registries LOCATION-docker.pkg.dev
Remplacez LOCATION par l'emplacement de votre dépôt.
Container Registry
docker-credential-gcr configure-docker
Le résultat suivant s'affiche :
/home/username/.docker/config.json configured to use this credential helper
Pour exécuter une image à partir du registre, utilisez la commande suivante :
Artifact Registry
docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image
Remplacez LOCATION par l'emplacement de votre dépôt.
Container Registry
docker run --rm gcr.io/your-project/your-image
Vous pouvez utiliser les noms d'hôte Container Registry suivants:
- us.gcr.io
- eu.gcr.io
- asia.gcr.io
Pour utiliser Docker avec sudo
, exécutez la commande suivante. L'option de ligne de commande -E
permet à Docker d'utiliser le fichier .docker/config.json
à partir du répertoire d'accueil d'un utilisateur au lieu du répertoire d'accueil racine.
Artifact Registry
sudo -E docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image
Remplacez LOCATION par l'emplacement de votre dépôt.
Container Registry
sudo -E docker run --rm gcr.io/your-project/your-image
Les noms d'hôte acceptés de Container Registry sont les suivants :
- us.gcr.io
- eu.gcr.io
- asia.gcr.io
Vous pouvez également récupérer les jetons d'accès OAuth appropriés à partir des métadonnées Compute Engine et les utiliser manuellement avec la commande docker login
, comme illustré dans l'exemple suivant :
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
Utiliser cloud-init avec Container Registry
Cet exemple cloud-init utilise le format Cloud Config pour démarrer un conteneur Docker à partir d'une image stockée dans l'instance Container Registry de Docker appelé DockerHub. Cet exemple utilise le format Cloud Config pour démarrer un conteneur Docker à partir d'une image stockée dans 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
Configurer le daemon Docker pour extraire des images du cache du registre
Vous pouvez configurer le daemon Docker pour extraire des images d'un cache de registre à l'aide de miroirs de registre.
Configurez le daemon pour utiliser l'option
registry-mirror
de l'une des manières suivantes :- Dans le fichier
/etc/default/docker
, ajoutez l'optionregistry-mirror
pour le registre (par exemple,https://mirror.gcr.io
) :
echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- Dans le fichier
/etc/default/docker
, ajoutez"--registry-mirror=https://mirror.gcr.io"
au fichierDOCKER_OPTS
existant :
sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
- Dans le fichier
Une fois le miroir de registre ajouté, redémarrez le daemon Docker pour que les modifications prennent effet :
sudo systemctl daemon-reload sudo systemctl restart docker
L'ajout d'une configuration à /etc/default/docker
n'est pas persistant lors du redémarrage.
Pour vous assurer que votre configuration Docker reste persistante lors des redémarrages,
envisagez d'ajouter les commandes dans le script cloud-init
de l'instance
au format cloud-config
.
ou startup script
.
L'exemple suivant utilise le format cloud-config
pour configurer registry-mirror
:
#cloud-config
runcmd:
- echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- systemctl daemon-reload
- systemctl restart docker
Pour en savoir plus sur la configuration d'une instance avec cloud-init
, consultez la page Utiliser cloud-init avec le format de configuration Cloud.
Dépannage
Résoudre les conflits d'options entre le fichier daemon.json
Docker et les options
Lors de la configuration du daemon Docker, si la même option est définie avec un fichier daemon.json
et avec des options, Docker ne démarre pas avec une erreur semblable à celle-ci :
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 solution recommandée pour résoudre ce conflit consiste à modifier la valeur par défaut daemon.json
, qui se trouve dans /etc/docker/daemon.json
. La modification de ce fichier vous permet de ne modifier que les options concernées, tout en conservant les autres options par défaut. Vous pouvez effectuer cette opération à l'aide de cloud-init
, par exemple en utilisant un cloud-config
semblable à :
#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