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
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.
Konfigurasikan daemon untuk menggunakan opsi
registry-mirror
dengan salah satu cara berikut:- Di 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
- Di file
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