Repository budi/katalog-web sudah menunggu, tetapi daemon di laptop Budi belum memperkenalkan diri kepada siapa pun. Autentikasi adalah syarat untuk dua hal sekaligus: hak melakukan push ke repository milik kita, dan kuota pull terautentikasi yang lebih besar daripada kuota anonim pada Chapter Docker Hub. Chapter ini membedah docker login beserta seluruh detail di sekitarnya — personal access token sebagai pengganti password, lokasi penyimpanan kredensial beserta risikonya, credential helper sebagai penawarnya, docker logout, dan cara memverifikasi identitas yang sedang dipakai daemon.

Login Interaktif ke Docker Hub #

Bentuk paling sederhana dari autentikasi adalah docker login tanpa argumen; CLI menanyakan identitas kita secara interaktif:

bash
$ docker login

Output yang Dihasilkan:

text
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: budi
Password:
WARNING! Your password will be stored unencrypted in /home/budi/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

Mari kita telaah output di atas:

  1. Baris Username: dan Password: — prompt interaktif; password diketik tanpa digema ke layar, seperti perilaku login pada umumnya.
  2. WARNING! Your password will be stored unencrypted — CLI mengingatkan bahwa kredensial akan ditulis ke berkas config.json dalam bentuk yang tidak terenkripsi; peringatan ini muncul karena credential helper belum dikonfigurasi.
  3. Login Succeeded — kredensial diterima registry dan tersimpan lokal; mulai saat ini docker push dan docker pull berjalan atas nama akun budi.

Kita juga bisa mempersingkat sesi dengan menyebut username sebagai argumen, sehingga CLI hanya menanyakan password:

bash
$ docker login -u budi

Output yang Dihasilkan:

text
Password:
WARNING! Your password will be stored unencrypted in /home/budi/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

Personal Access Token sebagai Pengganti Password #

Kolom Password: pada prompt di atas tidak harus diisi password akun. Praktik yang lebih aman adalah mengisi personal access token (PAT) — token yang dibuat khusus untuk CLI melalui Account Settings → Personal access tokens di Docker Hub. Akun yang mengaktifkan two-factor authentication bahkan diwajibkan memakai PAT untuk login CLI, karena password utama ditolak.

Di Mana Kredensial Disimpan #

Secara bawaan, hasil login disimpan di berkas ~/.docker/config.json. Mari kita intip isinya setelah Budi login:

json
{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "YnVkaTpyYWhhc2lhMTIz"
    }
  }
}

Nilai auth tampak seperti bahasa rahasia, padahal bentuknya sederhana: base64 dari string username:password. Kita bisa membuktikannya sendiri di terminal:

bash
$ echo "YnVkaTpyYWhhc2lhMTIz" | base64 -d

Output yang Dihasilkan:

text
budi:rahasia123

Credential Helper #

Docker mengatasi masalah penyimpanan tersebut lewat credential helper: program eksternal yang menyimpan kredensial di penyimpanan aman milik sistem operasi. Kita mengaktifkannya dengan menambahkan kunci credsStore pada config.json:

json
{
  "credsStore": "desktop",
  "auths": {
    "https://index.docker.io/v1/": {}
  }
}

Pilihan nilai credsStore menyesuaikan platform tempat Docker berjalan:

Nilai credsStorePlatformPenyimpanan kredensial
desktopDocker Desktop (semua OS)keyring yang dikelola Docker Desktop
passLinuxpenyimpanan GPG melalui tool pass
osxkeychainmacOSKeychain
wincredWindowsWindows Credential Manager

Setelah credsStore aktif, lakukan docker logout lalu docker login ulang supaya kredensial berpindah dari berkas ke keyring. Sejak saat itu entri di config.json hanya berisi objek kosong per registry, kredensial aslinya terenkripsi di keyring, dan peringatan WARNING! Your password will be stored unencrypted tidak lagi muncul pada login berikutnya.

Login ke Registry Lain #

docker login tanpa argumen selalu menunjuk Docker Hub, tetapi perintah yang sama bekerja untuk registry mana pun: cukup sebutkan hostname registry-nya sebagai argumen pertama. Contoh berikut login ke GitHub Container Registry memakai PAT GitHub dengan permission packages:

bash
$ docker login ghcr.io -u budi-github

Output yang Dihasilkan:

text
Password:
WARNING! Your password will be stored unencrypted in /home/budi/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

Login bersifat per registry: satu berkas config.json dapat memuat kredensial untuk docker.io, ghcr.io, dan registry privat kantor sekaligus tanpa saling menimpa — kunci auths menyimpan satu entri per alamat registry. Pola yang sama berlaku untuk registry privat perusahaan, misalnya docker login registry.example.com -u budi, yang akan kita praktikkan pada Chapter Private Registry.

Logout dan Verifikasi Status #

Menghapus kredensial sama mudahnya dengan menyimpannya. docker logout membersihkan kredensial registry bawaan:

bash
$ docker logout

Output yang Dihasilkan:

text
Removed login credentials for https://index.docker.io/v1/

Sementara untuk registry lain, hostname-nya disebut secara eksplisit:

bash
$ docker logout ghcr.io

Output yang Dihasilkan:

text
Removed login credentials for ghcr.io

Terakhir, saat kita ragu mesin ini sedang login sebagai siapa, docker info menampilkan identitas yang dipakai klien saat bicara dengan registry:

bash
$ docker info

Output yang Dihasilkan (dipotong):

text
Client:
 Context:    default
 Debug Mode: false
 Username:   budi
...
Server:
 Containers: 5
  Running: 2
...

Baris Username: budi menjadi konfirmasi cepat sebelum push — berguna pada mesin CI yang dipakai bergantian, tempat kredensial terakhir bisa jadi bukan milik job yang sedang berjalan. Perhatikan pula bahwa baris tersebut hidup di bagian Client: identitas login dibaca dari berkas config.json milik pengguna yang menjalankan perintah, bukan dari keadaan daemon.

Referensi #

Autentikasi kini beres: Docker Hub mengenal laptop Budi, kredensial tersimpan aman di credential helper, dan docker info mengonfirmasi identitasnya. Persoalan berikutnya ada di sisi lokal — image katalog-web:2.0 yang berdiri di penyimpanan masih bernama polos tanpa namespace dan tanpa alamat registry tujuan. Memberi nama lengkap budi/katalog-web:2.0 kepada image adalah pekerjaan tagging, topik yang kita bahas pada chapter berikutnya.