Menjalankan container di instance

Anda dapat menjalankan container Docker di mesin yang menjalankan Container-Optimized OS dengan cara yang sama seperti yang Anda lakukan di sebagian besar distribusi image node lainnya, dengan menggunakan perintah docker run. Contoh:

docker run --rm busybox echo "hello world"

Output berikut akan muncul:

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
Saat mengelola kunci SSH dalam metadata, semua akun pengguna yang dikelola oleh Compute Engine pada image cos akan ditambahkan ke grup docker secara default. Hal ini memungkinkan pengguna yang login menjalankan perintah docker tanpa hak istimewa root. Saat mengelola kunci SSH menggunakan Login OS, akun pengguna harus ditambahkan ke grup docker secara manual. Jika tidak, pengguna harus menambahkan sudo untuk setiap perintah docker.

Mengakses image publik di Container Registry atau Artifact Registry

Dukungan Container Registry sudah terintegrasi dengan image node cos. Untuk memulai container dari Container Registry, jalankan:

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

Output berikut akan muncul:

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

Mengakses image pribadi di Artifact Registry atau Container Registry

Mulai dari rilis milestone 60, docker-credential-gcr sudah diprainstal di image Container-Optimized OS. Ini adalah cara yang direkomendasikan untuk mengakses image pribadi di Artifact Registry atau Container Registry.

Untuk menggunakan docker-credential-gcr, jalankan perintah berikut:

Artifact Registry

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

Ganti LOCATION dengan lokasi repositori Anda.

Container Registry

docker-credential-gcr configure-docker

Output berikut akan muncul:

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

Untuk menjalankan image dari registry, gunakan perintah berikut:

Artifact Registry

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

Ganti LOCATION dengan lokasi repositori Anda.

Container Registry

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

Anda dapat menggunakan nama host Container Registry berikut:

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

Untuk menggunakan docker dengan sudo, jalankan perintah berikut. Flag command line -E membuat docker menggunakan file .docker/config.json dari direktori rumah pengguna, bukan direktori rumah root.

Artifact Registry

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

Ganti LOCATION dengan lokasi repositori Anda.

Container Registry

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

Nama host Container Registry yang didukung adalah:

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

Atau, Anda dapat mengambil token akses OAuth yang sesuai dari metadata Compute Engine dan menggunakannya dengan perintah docker login secara manual, seperti yang ditunjukkan dalam contoh berikut:

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

Menggunakan cloud-init dengan Container Registry

Contoh cloud-init ini menggunakan format Cloud Config untuk memulai penampung Docker dari image yang disimpan di container registry Docker yang disebut DockerHub. Contoh di bawah menggunakan format Cloud Config untuk memulai penampung Docker dari image yang disimpan di 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

Mengonfigurasi daemon Docker untuk mengambil image dari cache registry

Anda dapat mengonfigurasi daemon Docker untuk mengambil image dari cache registry menggunakan cermin registry.

  1. Konfigurasikan daemon untuk menggunakan opsi registry-mirror dengan salah satu cara berikut:

    • Di file /etc/default/docker, tambahkan opsi registry-mirror untuk registry (misalnya, https://mirror.gcr.io):
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    • Dalam file /etc/default/docker, tambahkan "--registry-mirror=https://mirror.gcr.io" ke DOCKER_OPTS yang ada:
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
  2. Setelah menambahkan mirror registry, mulai ulang daemon Docker agar perubahan diterapkan:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

Menambahkan konfigurasi ke /etc/default/docker tidak akan dipertahankan setelah mulai ulang. Untuk memastikan konfigurasi Docker Anda tetap persisten saat mulai ulang, pertimbangkan untuk menambahkan perintah dalam skrip cloud-init metadata instance dalam format cloud-config atau startup script.

Contoh berikut menggunakan format cloud-config untuk mengonfigurasi registry-mirror:

#cloud-config

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

Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi instance dengan cloud-init, lihat Menggunakan cloud-init dengan format konfigurasi Cloud.

Pemecahan masalah

Menyelesaikan konflik opsi antara daemon.json dan flag Docker

Saat mengonfigurasi daemon Docker, jika opsi yang sama ditetapkan dengan file daemon.json dan dengan flag, Docker akan gagal dimulai dengan error yang mirip dengan:

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:

Solusi yang direkomendasikan untuk menyelesaikan konflik ini adalah mengubah daemon.json default, yang terletak di /etc/docker/daemon.json. Mengubah file ini memungkinkan perubahan hanya pada opsi yang terpengaruh, sekaligus mempertahankan opsi default lainnya. Hal ini dapat dilakukan menggunakan cloud-init, misalnya menggunakan cloud-config yang mirip dengan:

#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