จริงๆ แล้ว ใน Ubuntu 18.04 ก็มีแพ็กเกจ Docker ที่สามารถใช้คำสั่ง apt install ได้เลย และค่อนข้างใหม่ด้วยคือเป็นเวอร์ชัน 17.12
แต่ถ้าเราต้องการติดตั้ง Docker เวอร์ชันใหม่ เช่น ตอนที่เขียนบทความนี้เป็นเวอร์ชัน 18.06 แล้ว เพื่อใช้คุณสมบัติล่าสุดของ Docker แนะนำให้ติดตั้งจาก Docker Repositories โดยตรง ซึ่งทางทีม Docker จัดเตรียมไว้สำหรับลีนุกซ์เวอร์ชันต่างๆ ติดตั้งใช้งานกันได้
ในที่นี้ลองมาดูวิธีการติดตั้ง Docker เวอร์ชัน CE (Community Edition) บน Ubuntu 18.04 โดยติดตั้งจาก Docker Repositories
ถ้าเคยติดตั้งแพ็กเกจ docker ไว้ก่อนหน้านี้แล้ว ให้ใช้คำสั่ง apt remove เพื่อถอน (remove) การติดตั้งเวอร์ชันเดิมออกก่อน
รันคำสั่ง apt update เพื่อปรับปรุงระบบ
$ sudo apt update
ติดตั้งแพ็กเกจสำหรับใช้คำสั่ง apt ติดตั้ง repository ผ่านทาง https
$ sudo apt install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
ติดตั้ง GPG Key ของ Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg |\ sudo apt-key add -
ตรวจสอบความถูกต้องของ Key ที่ติดตั้ง โดยในส่วน fingerprint ต้องแสดงค่า
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
ติดตั้ง Docker repository (stable)
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
รัน apt update อีกครั้ง เพื่อปรับปรุงรายชื่อแพ็กเกจ
$ sudo apt update
ใช้คำสั่ง apt install ติดตั้งแพ็กเกจชื่อ docker-ce ซึ่งเป็นชื่อแพ็กเกจของ Docer CE จาก Docker repository
$ sudo apt install docker-ce
หลังจากติดตั้งเสร็จเรียกร้อย เซอร์วิส docker จะถูกรันขึ้นมาโดยอัตโนมัติ
ตัวอย่างการใช้คำสั่ง systemctl status เพื่อตรวจสอบสถานะของเซอร์วิส docker
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; ...
Active: active (running) since Thu 2018-07-26 21:32:04 +07;...
Docs: https://docs.docker.com
Main PID: 3334 (dockerd)
Tasks: 20
CGroup: /system.slice/docker.service
├─3334 /usr/bin/dockerd -H fd://
└─3353 docker-containerd --config /var/run/docker/...
ทดลองรัน docker version เพื่อแสดงข้อมูลเวอร์ชันที่ติดตั้งได้
$ sudo docker version Client: Version: 18.06.0-ce API version: 1.38 Go version: go1.10.3 Git commit: 0ffa825 Built: Wed Jul 18 19:09:54 2018 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.0-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: 0ffa825 Built: Wed Jul 18 19:07:56 2018 OS/Arch: linux/amd64 Experimental: false
โดยดีฟอลต์จากการติดตั้ง ต้องใช้ sudo เพื่อรันคำสั่ง docker แต่ถ้าเราไม่ต้องการพิมพ์คำสั่ง sudo นำหน้า สามารถทำได้โดยเพิ่มชื่อ user ที่ใช้รันคำสั่ง เข้าไปในกลุ่มชื่อ docker
ตัวอย่างการรันคำสั่ง docker ด้วย user ธรรมดา จะไม่สามารถรันได้ ขึ้น permission denied
$ id
uid=1000(alice) gid=1004(alice) groups=1004(alice),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd),1000(lpadmin),1001(sambashare),1002(debian-tor),1003(libvirtd)
$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
ใช้คำสั่ง usermod เพิ่ม user ที่ต้องการใช้รันคำสั่ง docker เข้าไปในกลุ่ม docker
$ sudo usermod -aG docker alice
ต้อง logout แล้ว login ใหม่อีกครั้ง เพื่อให้กลุ่มใหม่ที่เพิ่มมีผลกับ user
ตัวอย่างการใช้คำสั่ง id หลังจาก login ใหม่อีกครั้ง
$ id
uid=1000(alice) gid=1004(alice) groups=1004(alice),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd),999(docker),1000(lpadmin),1001(sambashare),1002(debian-tor),1003(libvirtd)
ทดลองรัน docker อีกครั้ง
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...
ก็จะสามารถรันได้ผลลัพธ์ที่ต้องการ