最近因為工作需要了解了一下 Jenkins 以及 Docker 這兩個工具,雖然這兩個工具在 DevOps 中已經被使用多年,不過因為這次的經驗才第一次從零開始接觸,當中遇到很多問題,不過也學到蠻多東西的,希望可以把這些東西記錄下來,未來如果有人看到或是自己需要再 reference 的話,至少有個管道。
我們就從最基礎開始吧,如何建立一個 Docker Image。不過在先了解我們為什麼要建立之前,可以先了解一下 Docker 的概念,官網的介紹其實蠻詳細的。另外我的環境是在 Windows 上面使用 Docker for Windows,我覺得使用上沒有不一致,使用起來也相當得心應手,如果你的開發環境不全然是 Linux,是可以用 Docker for Windows 的。另外其實 Docker 的教學也寫得非常好,可以讓你真正從零開始打造一個自己的 Image,所以有很多類似的就不贅述了。
我們使用的情境是這樣,每一次 Jenkins build 的時候,會做下面三件事情
- 會起一個暫時的 Container,這個 Container 裡面包含了設定好的環境以及安裝了一些必要的軟體
- Jenkins 會使用我們設定好的帳號密碼登入 Container,並且執行 build 的指令
- 當 build 完之後,會把 build 出來的結果,打包成一包 tar 檔,存放在 Jenkins 上面供其他的 Projects 使用。
那我們要怎麼做這個暫時的 Container 的 Image 呢?我們使用 Dockerfile,要製作一個客製化的 Image,有下面兩種方式:
- 把你要的 base image 抓下來,登入或是利用
docker exec CONTAINER COMMAND
安裝必要軟體以及設定環境,之後再用commit
指令建立新的 image。 - 利用 Dockerfile 把你要做的事情一次寫完,之後只要下
docker build -t IMAGENAME:TAG .
就可以無痛的建立一個 image 了。
那我們先看這個 Dockerfile 的內容,我是拿最新的 Ubuntu 當作我的 base image
總共做了下面幾件事情:
- 安裝一些 Ubuntu 上需要的軟體。
- 新增一組要登入的帳號以及密碼,並且給予 root 權限。
- 切換到新增的帳號,安裝 nvm,主要是希望之後的同事可以把這份當作我們部門的 base image,只要指定好需要的 node 版本就好了。
- 切換回 root,打開 22 port,讓外面可以透過 ssh 的方式連入
使用方法很簡單:
#把所有有開的 port 都給定一個對應的 port
docker run -P IMAGENAME:TAG
#把 port 2222 指向 image 的 port 22,可用 port 22222 連入
docker run -p 22222:22 IMAGENAME:TAG
啟動之後可以輸入
docker container ls
# or
docker ps
可以看到你的 image 已經跑起來了,之後就可以透過 shell 連入 127.0.0.1:22
輸入我們設定好的帳號密碼,就可以登入囉。
列一下常用的 Docker 指令
docker image ls
docker image rm
docker container ls
docker container ls --all
docker stop CONTAINER
docker rm CONTAINER
docker exec CONTAINER COMMAND
docker pull ACCOUNT/IMAGE:TAG
docker tag IMAGE:TAG ACCOUNT/IMAGE:TAG
docker push ACCOUNT/IMAGE:TAG