Menjalankan container pada instance

Anda dapat menjalankan container Docker pada mesin yang menjalankan Container-Optimized OS dengan cara yang sama seperti yang Anda lakukan pada sebagian besar distribusi image node lainnya, 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 setiap 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 dibangun pada 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 versi 60 rilis, docker-credential-gcr sudah diinstal dalam image OS yang Dioptimalkan untuk Container. Cara ini 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 beranda pengguna, bukan direktori utama 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 container Docker dari image yang disimpan di registry container Docker yang disebut DockerHub. Contoh di bawah ini menggunakan format Cloud Config untuk memulai container 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 mirror registry.

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

    • Dalam 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 pencerminan registry, mulai ulang daemon Docker agar perubahan diterapkan:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

Penambahan konfigurasi ke /etc/default/docker tidak bersifat persisten saat reboot. Untuk memastikan konfigurasi Docker Anda tetap dipertahankan meskipun perangkat dimulai ulang, sebaiknya tambahkan perintah dalam skrip cloud-init dari metadata instance atau startup script.cloud-config

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, baca artikel Menggunakan cloud-init dengan format konfigurasi Cloud.

Pemecahan masalah

Menyelesaikan konflik opsi antara daemon.json Docker dan flag

Saat mengonfigurasi daemon Docker, jika opsi yang sama ditetapkan dengan file daemon.json dan dengan flag, Docker akan gagal memulai 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 mengatasi konflik ini adalah dengan mengubah daemon.json default, yang terletak di /etc/docker/daemon.json. Dengan memodifikasi file ini, Anda hanya dapat mengubah opsi yang terpengaruh, sambil 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