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
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.
Konfigurasikan daemon untuk menggunakan opsi
registry-mirror
dengan salah satu cara berikut:- Dalam file
/etc/default/docker
, tambahkan opsiregistry-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"
keDOCKER_OPTS
yang ada:
sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
- Dalam file
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