Docker di macOS Tanpa Docker Desktop

Docker Desktop adalah aplikasi yang memungkinkan kita untuk membuat dan berbagi aplikasi dan microservice dalam container di MAC atau Windows environment. Docker Desktop mencakup Docker Engine, Docker CLI client Docker Compose, Docker Content Trust, Kubernetes, dan Credential Helper.

Pada pertengahan tahun 2021 lalu Docker Desktop dilisensikan sebagai bagian dari langganan Docker gratis (Personal) atau berbayar (Pro, Team, atau Business). Docker Desktop dapat digunakan secara gratis untuk langganan Docker Personal dan dengan persyaratan langganan yang telah ditetapkan.

Docker desktop memang sangat membantu dan mudah digunakan. Namun Docker Desktop bukanlah satu-satunya cara agar dapat menggunakan docker di macOS. Kita dapat menggunakan VM untuk menjalankan docker engine, meskipun itu tidak semudah menggunakan docker desktop.

Pada kesempatan ini, saya akan share tutorial berdasarkan percobaan yang telah saya lakukan dan sampai akhirnya move on dari Docker Desktop. Jadi buat kalian yang ingin move on dari dia 😅 Docker Desktop juga atau hanya sekedar untuk mencoba, silakan dapat menyimak atau mengikuti tutorial ini.

Membuat Virtual Machine baru

Pada tutorial ini saya akan menggunakan Multipass untuk membuat Ubuntu VM sebagai pengganti docker desktop. Untuk cara install multipass dapat langsung didownload melalui multipass.run atau melalui homebrew dengan menggunakan command berikut:

brew install --cask multipass

Setelah berhasil ter-install, selanjutnya membuat Instance baru dangan command berikut:

multipass launch -d 30G -m 4G -n gani-vm 20.04
  • launch adalah perintah untuk membuat instance baru.
  • -d opsi untuk menentukan ukuran disk space yang akan dialokasikan ke instance dan diikuti dengan nilainya, contoh di sini yaitu 30G atau setara dengan 30 GB.
  • -m opsi untuk menentukan ukuran memory dan diikuti dengan nilainya, contoh di sini yaitu 4G atau setara dengan 4 GB.
  • -n opsi untuk menentukan nama instance yang akan dibuat dan gani-vm adalah nama instancenya. Silakan disesuaikan dengan nama yang diinginkan.
  • 20.04 adalah image Ubuntu 20.04 LTS.

Arguments lainnya juga dapat dilihat melalui command multipass launch --help

Selanjutnya install docker daemon ke dalam instance. Masuk ke shell instance yang telah kita buat sebelumnya menggunakan command berikut:

multipass shell gani-vm

Setelah berhasil akses shell nya, selanjutnya install docker daemon dengan menggunakan command berikut:

curl -fsSL https://get.docker.com | sh

Tunggu hingga proses selesai, mungkin akan membutuhkan waktu dan tergantung kecepatan internet yang sedang digunakan.

Sampai di sini docker sudah berhasil ter-install di instance dan sudah dapat digunakan. Namun tidak sampai sini saja, kita perlu melakukan penyesuaian agar dapat diakses dari macOS secara langsung.

Run Docker daemon sebagai non-root user (Rootless mode)

Secara default docker daemon hanya dapat diakses oleh root user. Artinya setiap kali akan mengakses docker daemon perlu menyertakan sudo untuk memberikan akses root.

Jika tidak ingin menyertakan sudo setiap kali menjalankan docker daemon, maka praktik terbaiknya adalah menggunakan Rootless mode daripada memberikan akses root kepada docker group. Karena dengan menambahkan user ke docker group, itu akan setara dengan root user. Untuk detail tentang bagaimana hal ini memengaruhi keamanan di sistem, silakan dapat melihat dokumentasi berikut: Docker Daemon Attack Surface.

Pertama kita perlu menonaktifkan terlebih dahulu docker daemon sebelum install rootless mode:

sudo systemctl disable --now docker.service docker.socket

Install newuidmap dan newgidmap yang dibutuhkan untuk multiple UID/GID dengan command berikut:

sudo sh -eux <<EOF
# Install newuidmap & newgidmap binaries
apt-get install -y uidmap
EOF

Jalankan dockerd-rootless-setuptool.sh install sebagai non-root user untuk menyiapkan daemon:

dockerd-rootless-setuptool.sh install

Saat proses instalasi berhasil, maka akan diikuti dengan informasi kurang lebih seperti berikut ini:

[INFO] Creating /home/testuser/.config/systemd/user/docker.service
...
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger testuser`

[INFO] Make sure the following environment variables are set (or add them to ~/.bashrc):

export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

Pada informasi yang muncul, kita disarankan untuk menambahkan environment variable PATH dan DOCKER_HOST ke dalam file .bashrc. Namun ini bisa kita lewatkan saja, karena nanti kita akan switch ke rootless. Kecuali jika ingin tetap menggunakan default context.

Merubah docker context

Saat rootless mode berhasil diinstall, maka akan ada tambahan docker context baru dengan nama rootless. Context ini yang nantinya akan kita gunakan. Untuk memeriksa docker context dapat menjalan command berikut:

docker context ls

Selanjutnya beralih ke context rootless menggunakan command berikut:

docker context use rootless

Jika berhasil akan menampilkan output seperti berikut:

rootless
Current context is now "rootless"

Update konfigurasi docker.service

Agar docker daemon dapat diakses melalui TCP, maka kita perlu menambahkan host ke dalam file docker.service. Buka file docker.service menggunakan command berikut:

nano ~/.config/systemd/user/docker.service

Selanjutnya pada bagian ExecStart update menjadi seperti berikut:

ExecStart=/usr/bin/dockerd-rootless.sh -H unix:///run/user/1000/docker.sock -H tcp://0.0.0.0

0.0.0.0 artinya dapat menerima semua IP. Kalian juga bisa menggunakan ip yg ditentukan. Misal hanya ingin diakses melalui ip vm saja. Maka bisa diganti menjadi 192.168.64.2.

Note: Kalian tidak perlu merubah konfigurasi ini apabila koneksi docker client ke docker daemon melalui SSH.

Selanjutnya agar docker daemon dapat otomatis launch saat system startup, silakan jalankan command berikut:

systemctl --user enable docker
sudo loginctl enable-linger $(whoami)

Informasi lebih lanjut tentang Rootless mode dapat kalian cek pada dokumentasi berikut: Run the Docker daemon as a non-root user (Rootless mode)

Menyesuaikan konfigurasi di macOS

Selanjutnya kita perlu melakukan penyesuaian untuk dapat mengakses remote Docker Daemon yang ada di VM.

Jika kalian masih menggunakan Docker Desktop, pastikan untuk mematikannya terlebih dahulu dengan cara close aplikasi docker desktopnya, secara otomatis juga akan menonaktifkan docker di macOS. Untuk memastikannya dapat menjalankan command berikut:

docker ps

Jika muncul error, artinya docker sudah dalam keadaan nonaktif.

Note: apabila docker desktop sudah dihapus dari macOS. Maka Anda perlu install docker dan docker-compose secara mandiri menggunakan command brew install docker docker-compose

Cek IP Address yang digunakan pada Ubuntu VM menggunakan command berikut:

multipass info gani-vm

Maka akan muncul informasi kurang lebih seperti berikut:

Name:           gani-vm
State:          Running
IPv4:           192.168.64.2
                172.17.0.1
Release:        Ubuntu 20.04.3 LTS
Image hash:     3d7282d3e92b (Ubuntu 20.04 LTS)
Load:           0.14 0.11 0.05
Disk usage:     5.4G out of 19.2G
Memory usage:   955.5M out of 3.8G
Mounts:         --

IPv4 pada info di atas juga nantinya digunakan untuk mengakses aplikasi kalian yang menjalankan docker. Silakan tambahkan juga ke file /etc/hosts untuk host yang digunakan pada aplikasi.

Selanjutnya tambahkan DOCKER_HOST ke environment variable di macOS kita. Tujuanya agar docker client dapat terhubung ke remote daemon yang ada di VM:

echo "export DOCKER_HOST=192.168.64.2:2375" >> ~/.zshrc
source ~/.zshrc

2375 adalah default port pada docker daemon.

Value pada DOCKER_HOST juga mendukung SSH. Contohya seperti berikut: DOCKER_HOST=ssh://ubuntu@192.168.64.2. Saya pribadi lebih memilih menggunakan ssh karena lebih secure. Namun untuk dapat menggunakan ssh, kita perlu menambahkan SSH public key ke dalam file ~/.ssh/authorized_keys yang ada pada VM.

Note: .zshrc adalah default env file pada macOS saat ini. Jika Anda menggunakan bash, silakan gunakan .bashrc atau .bash_profile

Sampai di sini seharusnya docker client sudah dapat digunakan dan dan terhubung ke remote daemon. Untuk melakukan testing dapat menggunakan command berikut:

docker run --rm -t hello-world

Dari command di atas akan menghasilkan output kurang lebih seperti berikut:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:xxxxx
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Mount a local directory inside the instance

Terakhir adalah melakukan mounting direktori lokal pada macOS ke VM. Karena Docker Daemon berjalan di VM, maka kita perlu mount direktori ke VM:

multipass mount $HOME gani-vm

Dimana $HOME adalah path yang mengarah ke home direktori yg ada di macOS yaitu /Users/namauser/. Kalian juga bisa mengarahkannya ke direktori lain di mana letak projek kalian. Misalnya seperti contoh berikut:

multipass mount /Users/namauser/projects gani-vm

Untuk informasi lebih lanjut terkait multipass mount dapat dilihat melalui command berikut:

multipass mount --help

Sampai di sini seharusnya docker client sudah dapat digunakan dengan semestinya.

Kesimpulan

Walaupun tidak semudah menggunakan Docker Desktop, Multipass menjadi alternatif yang bagus untuk menjalankan docker di macOS. Dari sini juga akan mendapatkan pengalaman tambahan apabila sebelumnya belum begitu tahu flow dan cara kerjanya docker. CMIIW 🙂

Selamat mencoba dan semoga bermanfaat.

Memiliki pertanyaan atau saran? Silakan klik disini untuk berkomentar :).

Masgani

Halo, perkenalkan nama saya Gani. Saat ini saya sebagai penulis sekaligus pemilik situs web masgani.com. Selain menulis di situs web ini, keseharian saya saat ini yaitu sebagai Developer di salah satu perusahaan Startup. Saya berharap tulisan saya situs web ini dapat bermanfaat dan menginspirasi. Terima kasih :)

3 Respon

  1. io berkata:

    Tutorialnya mantap mas Gani.. Baru migrasi dari docker desktop ke multipass dan sekarang udah lancar jaya

  2. Wardani berkata:

    makasih mas gani tutorial nya.. sangat membantu

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.