iT邦幫忙

2023 iThome 鐵人賽

DAY 2
1

Yes

  • 前面先針對這次會用到的 docker 基本操作做簡易說明,如果你對 docker 很熟的話這邊就可以跳過了 /images/emoticon/emoticon37.gif

  • Docker 的基本指令可以參考 Docker Engine commands for Docker Images,這張圖將相關指令整理得相當清楚,這邊我就針對幾個這次比賽會用到個功能做說明即可。

https://ithelp.ithome.com.tw/upload/images/20230909/20148308yg9aU3n6pd.png

  • 從上圖我們可以觀察到幾個元件名稱

    1. Docker : 系統架構為 Client-Server 架構,Server 部分為 Docker Daemon,用來控管容器的啟動、停止。
    2. Images : 唯讀檔案,用來啟動 Container 會使用到的檔案。
    3. Docker Registry : 存放 Images 的倉庫,可以拉取別人的 Image,也可以推送自己編譯過的 Image。當然也可以自建私有倉庫,這部分防禦面的地方會提到。
    4. Container : 將 Image 執行起來的狀態,可以針對執行下特別的參數,像是對外開放 port、要掛載的目錄或是給予執行權限。
    5. Dockerfile : 編譯客製化 Image 用。
  • 首先,先來練習拉一下 Images,這次拉的對象是 ubuntu:22.04,預設使用的 Docker Registry 為 dockerhub,建議可以去申請個帳號。相關資訊可以到 ubuntu 上面查看。然後這邊會利用工具 dive 來觀察一下 images 裡面的內容。

#顯示目前已經抓下來的 images 資訊
docker images ;
docker pull ubuntu:22.04 ;
docker images ; 
wget https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.deb ;
sudo dpkg -i dive_0.10.0_linux_amd64.deb ;
dive ubuntu:22.04 ;
#顯示出所有容器(執行中、結束)
docker ps -a ; 

#接收不到使用者資訊,也沒啟動虛擬終端機,直接結束
docker run ubuntu:22.04 [啟動指令] ; 
docker ps -a ;
docker run -it ubuntu:22.04 [啟動指令] ;
exit ;

#顯示很多結束的容器
docker ps -a ;

#砍掉所有的容器
docker rm $(docker ps -qa); 
  • 這邊再加入其他一些輔助參數,包含 --rm ,會在容器結束時砍掉容器。--name 可以指定容器名稱。
#給予名稱方便指定執行對象
docker run -it --rm --name ithome ubuntu:22.04 ; 

# docker exec -it ithome [啟動指令] ;
docker exec -it ithome bash ; 

#找不到指令
ifconfig ; 
  • 到這邊會發現有些常用指令找不到,因為 image 的設計本來就是精簡化為原則。但這邊可以試著幫它安裝一下。
apt update && apt install  net-tools -y ;
ifconfig ;
exit ;
  • 都退出後重新執行一遍,會發現剛剛對 Container 的變更不見了,這個是因為 Container 是依據 Image 建立出來的,而 Image 又是唯讀,因此需要額外進行編譯出自己的 Image。
docker run -it --rm --name ithome ubuntu:22.04 ; 
ifconfig ;
  • 這邊需要使用到 Dockerfile,但我這邊不會細講裡面的東西,就簡單帶過我是如何編寫我自己要使用的 Dockerfile。
  1. 新增 Dockerfile
FROM ubuntu:22.04

RUN apt update && apt install wget curl vim net-tools iproute2 procps fdisk kmod ncat dsniff tcpdump iputils-ping telnet python3 -y
  1. docker build 進行編譯
docker build --tag [dockerhub帳號]/[image名稱]:[版本號] --no-cache . ;

#可以看到編譯好的 image 檔案
docker images ; 
docker run -it --rm [dockerhub帳號]/[image名稱]:[版本號] ;
exit ;

#假如想把 image push 到 dockerhub,必須先登入
docker login ; 

#推上去後大家都抓的到了
docker push [dockerhub帳號]/[image名稱]:[版本號] ; 
  • 因為容器的網路跟宿主機預設是分開的,所以容器要開放 port 必須在 docker run 的時候帶入,還算是一個蠻常用的功能。
docker run -it --rm aeifkz/my-ubuntu:v1.0 ;

#在容器內開啟 8080 port
python3 -m "http.server" 8080 ; 

#切到宿主機,無法連通
curl http://localhost:8080 ; 

# docker run -p [host_port]:[container_port] 
docker run -it --rm -p 8888:8080 aeifkz/my-ubuntu:v1.0 ;

#在容器內開啟 8080 port ;
python3 -m "http.server" 8080 ; 

#切到宿主機,通了!!!!
curl http://localhost:8888 ;
  • 另外假如想把宿主機的資料夾掛入容器也是在 docker run 的時候執行。
# docker run -v [host_path]:[container_path] 
docker run -it --rm -v /tmp:/mnt aeifkz/my-ubuntu:v1.0 ;
touch /mnt/oh_my_god ;

#切到宿主機,會發現這個檔案的 owner 是 root,這個以後會在說明
ls /tmp/oh_my_god -al; 
  • 最後來清空一下 container 跟 image
docker rm [container 名稱] ;
docker rmi [image 名稱] ;
  • 差不多就到這邊了,假如是第一次用 docker 的話可能會覺得指令很多,但這部分我已經過濾出必要會使用到的部分,假如看完有興趣的話可以再參考其他鐵人賽系列做更深入的研究。

  • 今日總結 :

    • 本日回顧 :
      • 針對容器觀念以及本次鐵人賽會用到的指令做說明,那我覺得使用容器最重要的第一個觀念是搞懂images 和 container 的差異,這樣未來再考慮容器安全檢測的時候才會知道對這兩者進行掃描的差異在哪。另外也會發現到容器的啟動是為了單一Process而生的,當那隻Process結束的時候那個容器的生命周期也會跟著結束,這個跟使用虛擬機器上有很大的差別。/images/emoticon/emoticon33.gif
    • 次日預告 :
      • 其實容器本身就是執行在宿主機上的 Process,但它是被隔離起來的。那明天就會針對這部分透過簡單的指令去呈現這個現象,讓各位更有感覺的去了解這件事情。

上一篇
Day01 - 作業1 解答 - 建立 CentOS 7 環境
下一篇
Day03 - 容器隔離概念介紹
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言