การใช้งาน Docker

เขียนโดย ดร.จักรกฤษณ์  แสงแก้ว วันที่ 5 ธันวาคม 2561

การติดตั้ง Docker

$ sudo apt-get install docker.io
$ sudo usermod -aG docker $USER
การติดตั้งสำหรับวินโดวส์ ดาวน์โหลด docker 17.03.1
ปล. หากติดปัญหาศึกษาจากลิงค์นี้

การแม็พ local disk ให้กับ docker container

docker run it --rm -v /local-disk-path/root:/root
# เมื่อรัน container จะลบไดเร็คทอรี่ root ในคอนเทนเนอร์ออกไปและจะแม็พ /local-disk-path/root เข้าไปแทน root ในคอนเทนเนอร์
# ทำให้ข้อมูลต่าง ๆ จะเก็บในไดเร็คทอรี่  /local-disk-path/root และข้อมูลจะไม่หายเมื่อรันคอนเทนเนอร์ใหม่อีกครั้ง

การ Commit และ Load Container

$ docker commit [หมายเลขคอนเทนเนอร์] [ชื่อคอนเทนเนอร์]
$ docker save [ชื่อคอนเทนเนอร์] > ชื่อไฟล์.tar
$ docker load -i ชื่อไฟล์.tar

การเปลี่ยนชื่อ docker image

» รูปแบบคำสั่ง docker tag [เลขแท็ก] [ชื่อใหม่]
» ตรวจสอบหมายเลขแท็กด้วยคำสั่ง $ docker images
» ตัวอย่าง docker tag 4271a45fbea3 openpose

การลบ container session ที่ตกค้าง

$ docker rm $(docker ps -aq)

การหยุดการทำงานของ docker container อย่างฉับพลัน

ในกรณีที่มีคอนเทนเนอร์ทำงานอยู่เบื้องหลัง สามารถส่งพารามิเตอร์ kill เพื่อไปทำลายโปรเซสให้หยุดลงได้ เช่น
$docker ps -aq   # แสดงรายชื่อ container session
$ docker kill [เลข session ที่ต้องการให้ยุติการทำงาน]
$ docker rm $(docker ps -aq)   # คือการลบ session ที่ค้าง อยู่ทิ้งไป

การลบ docker image ที่ลบไม่ออกด้วย -f

$ docker rmi -f [หมายเลขคอนเทนเนอร์]

การแชร์กล้อง การแชร์จอ การแชร์เน็ต

$ docker run --privileged -p 9000:9000 -p 80:80 -it --device /dev/video0:/dev/video0 --net=host -v /media/learning/2TB/face-recognition/:/web 

- แชร์เน็ต (--net =host)
- แชร์กล้อง (--device /dev/video0:/dev/video0)
- แชร์ไฟล์ (-v /hostpath:/containerpath)
- แชร์พอร์ต (-p 9000:9000)
- ให้มีเชลล์รับคำสั่ง (-it)

การเข้าไปในคอนเทนเนอร์ที่กำลังรัน

$ docker exec -it [หมายเลขคอนเทนเนอร์] bash

การสร้างเน็ตเวอร์คการ์ดให้คอนเทนเนอร์

$ docker network create -d macvlan -o macvlan_mode=bridge --subnet=202.28.34.0/24 --gateway=202.28.34.222 -o parent=eth0 macvlan_bridge
$ docker run --name cont1 --net=macvlan_bridge --ip=202.28.34.200 --mac-address 00:50:56:00:60:42 -it nginx bash
หรือ
$ docker run --net=macvlan_bridge --ip=202.28.34.200 --mac-address 00:50:56:00:60:42 -it nginx bash

การติดตั้ง Nvidia-Docker

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt install nvidia-390

$ lsmod | grep nvidia

install nvidia-modprobe before install nvidia-docker 
$ sudo apt-get install nvidia-modprobe
$ sudo apt-get install nvidia-docker

หมายเหตุ : อย่าเรียกคำสั่งนี้ เพราะมันเอาเวอร์ชั่น 304.135 มาลงให้ แย่มาก !! 
sudo apt-get install nvidia-current

ตรวจเคอเนลเวอร์ชั่น
$ uname -a

เช็คเจอ eGPU มั้ย ?
$ cat /sys/bus/thunderbolt/devices/0-1/device_name

อนุญาตให้ eGPU ใช้งานได้
$ sh -c "echo 1 > /sys/bus/thunderbolt/devices/0-1/authorized"

ตรวจสอบว่าเจอ eGPU 
$ lspci | grep NVIDIA

ใช้ riser จะแสดงรายการ lspci ดังนี้
$ lspci -nn | grep "NVIDIA"
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1c20] (rev a1)
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1b06] (rev a1)
05:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10ef] (rev a1)

ไม่ใช้ riser (การ์ดจอ 1060 ในเครื่องโน๊ตบุ๊ค) จะแสดงดังนี้
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1c20] (rev a1)

ต่อมาลองใส่ m2 riser กลับเข้าไปและพบว่า lspci จะไม่เห็น nvidia ที่ใส่เข้าไป.. (งง ปัญหามาจากแหล่งจ่ายไฟไม่พอเลี้ยงการ์ด nvidia)
$ lspci
00:00.0 Host bridge: Intel Corporation Device 5910 (rev 05)
00:01.0 PCI bridge: Intel Corporation Sky Lake PCIe Controller (x16) (rev 05)
00:02.0 VGA compatible controller: Intel Corporation Device 591b (rev 04)
00:14.0 USB controller: Intel Corporation Sunrise Point-H USB 3.0 xHCI Controller (rev 31)
00:14.2 Signal processing controller: Intel Corporation Sunrise Point-H Thermal subsystem (rev 31)
00:16.0 Communication controller: Intel Corporation Sunrise Point-H CSME HECI #1 (rev 31)
00:17.0 SATA controller: Intel Corporation Sunrise Point-H SATA Controller [AHCI mode] (rev 31)
00:1c.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #1 (rev f1)
00:1c.3 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #4 (rev f1)
00:1c.4 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #5 (rev f1)
00:1d.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #9 (rev f1)
00:1f.0 ISA bridge: Intel Corporation Sunrise Point-H LPC Controller (rev 31)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-H PMC (rev 31)
00:1f.3 Audio device: Intel Corporation Device a171 (rev 31)
00:1f.4 SMBus: Intel Corporation Sunrise Point-H SMBus (rev 31)
01:00.0 VGA compatible controller: NVIDIA Corporation Device 1c20 (rev a1)
02:00.0 Network controller: Intel Corporation Device 24fb (rev 10)
03:00.0 Ethernet controller: Qualcomm Atheros Killer E2400 Gigabit Ethernet Controller (rev 10)
04:00.0 USB controller: ASMedia Technology Inc. ASM1142 USB 3.1 Host Controller
05:00.0 VGA compatible controller: NVIDIA Corporation Device 1b06 (rev a1)
05:00.1 Audio device: NVIDIA Corporation Device 10ef (rev a1)
1. เปิด power shell หรือ cmd (ด้วยสิทธิ์ administrator)
2. เรียกคำสั่งต่อไปนี้
cd "C:\Program Files\Docker\Docker"
DockerCli.exe -SwitchDaemon

การแก้ปัญหา

ข้อความปัญหา : 
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.35/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running

 ที่ console ให้เรียกคำสั่งต่อไปนี้ด้วยสิทธิ์ของ administrator จากนั้น reboot
dism /Online /Enable-Feature:Microsoft-Hyper-V /All

หลังจากนั้นตรวจสอบการทำงานด้วยคำสั่ง
docker version
ปล. หากทำงานได้สมบูรณ์จะไม่มีแสดงข้อความผิดพลาด ถ้ายังมีข้อผิดพลาดให้รันคำสั่งต่อไปนี้ bcdedit /set hypervisorlaunchtype auto

การใช้งาน MacVLAN

สร้างเน็ตเวอร์ดังนี้
# eth0
New-VMSwitch -SwitchName "NAT" -SwitchType Internal
# eth1
New-VMSwitch -SwitchName "VLAN" -SwitchType Internal

- เปิด Hyper V -> Setting NIC -> เลือก Enable MAC Address sproofing
- ติดตั้ง VirtNet เป็น network interface https://www.ntkernel.com/virtnet/ ดาวน์โหลด https://www.ntkernel.com/downloads/VirtNet.zip

กรณีมีปัญหา Hypervisor is not Running

1. เปิด command line ด้วยสิทธิ์ admin (คลิ๊กขวา cmd -> run as administrator) และพิมพ์คำสั่ง
dism /online /enable-feature /featurename:Microsoft-Hyper-V -All

2. restart

3. เปิด command line ด้วยสิทธิ์ admin (คลิ๊กขวา cmd -> run as administrator) และพิมพ์คำสั่ง
bcdedit /set hypervisorlaunchtype auto

4. ที่ด้านล่างขวาด้านล่าง (systray) เลือก  docker ->  switch to linux containers หรือ windows containers ตามต้องการ
ปล. ในตัวอย่างนี้ใช้กับ hyperv ไม่มีการติดตั้ง virtual box

การเปิดใช้ apache/php

» โหลด container : docker pull newdeveloper/apache-php
» รัน docker run --net=host -it newdeveloper/apache-php bash
» เขียนไฟล์ index.php ใน container เช่น /home/index.php 
» รัน php ด้วยคำสั่ง php -S เลขไอพีของโฮสคอมพิวเตอร์:8083
» เนื่องจากใช้ --net=host ดังนั้น พอร์ตต่าง ๆ จะถูกแม็พไปยังเครื่องโฮสคอมพิวเตอร์
» ในคอนเทนเนอร์รัน php ด้วยเลขไอพีของโฮสคอมพิวเตอร์และใช้พอร์ต 8083

การติดตั้ง vsftpd และ filezila server บน ubuntu

$ sudo apt-get install vsftpd
» แก้ไข sudo vim /etc/vsftpd.conf
  » เปลี่ยน anonymous_enable=NO
  » เอาคอมเมนต์ออก xferlog_file=/var/log/vsftpd.log
  » เอาคอมเมนต์ออก ftpd_banner และใส่ข้อความต้อนรับตามต้องการ
$ sudo service vsftpd restart
» ทดสอบ telnet ที่พอร์ต 21 ดังนี้ $ sudo telnel localhost 21
» เพิ่มผู้ใช้ sudo adduser ftp1user
» ผู้ใช้งานดาวน์โหลด https://filezilla-project.org/
https://msazure.club/docker-macvlan-demystify/

การติดตั้ง nvidia docker บน ubuntu 20.04

» Ubuntu 20.04
» CUDA 10.2
» Docker Latest
1. update
sudo apt update && sudo apt -y upgrade
sudo apt install -y build-essential
2. ติดตั้ง cuda
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
sudo apt update
sudo apt -y install cuda-drivers
sudo systemctl set-default  multi-user.target
sudo reboot
3. ติดตั้ง docker
sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER
sudo reboot
4. ติดตั้ง nvidia
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update && sudo apt -y install nvidia-container-toolkit
sudo systemctl restart docker
docker run --gpus all --pid host nvidia/cuda:10.2-runtime nvidia-smi

การสร้างเน็ตเวอร์คด้วย Docker

$ sudo apt-get install vsftpd
» 1. สร้าง network 
$ docker network create -d macvlan -o macvlan_mode=bridge --subnet=202.28.34.0/24 --gateway=202.28.34.222 -o parent=eth0 macvlan_bridge
$ docker run --name cont1 --net=macvlan_bridge --ip=202.28.34.200 --mac-address 00:50:56:00:60:42 -it nginx bash
หรือ
$ docker run  --net=macvlan_bridge --ip=202.28.34.200 --mac-address 00:50:56:00:60:42 -it nginx bash
การใช้งาน Docker