COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
-
Upload
- -
Category
Technology
-
view
418 -
download
1
Transcript of COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
![Page 2: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/2.jpg)
投影片 http://goo.gl/3aHqNd
原檔 https://goo.gl/EiUL61等等會有一些程式碼
在投影片上面不容易複製建議可以在原檔複製
![Page 3: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/3.jpg)
DEMO!
![Page 4: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/4.jpg)
緣起
![Page 5: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/5.jpg)
網路上有很多 git 教學
![Page 6: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/6.jpg)
但是幾乎大多數
![Page 7: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/7.jpg)
都是模擬的系統
![Page 8: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/8.jpg)
偶然之間得知有 git-it
這套教學軟體
![Page 9: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/9.jpg)
除了要在終端機下實機操作 git
![Page 10: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/10.jpg)
還要實機操作 GitHub
![Page 11: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/11.jpg)
Very Good
![Page 12: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/12.jpg)
BUT
![Page 13: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/13.jpg)
但是社團跟系上借的電腦教室
![Page 14: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/14.jpg)
全部都有裝還原卡
![Page 15: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/15.jpg)
一堂課的時間很寶貴
![Page 16: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/16.jpg)
光安裝系統就飽了
![Page 17: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/17.jpg)
練習 git-it 根本來不及
![Page 18: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/18.jpg)
而且電腦教室的網路所有人一起抓軟體時
![Page 19: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/19.jpg)
就會慢到跟烏龜一樣
![Page 20: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/20.jpg)
於是希望可以省掉 git-it 安裝
![Page 21: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/21.jpg)
還希望能有即時成績看板ACM 中毒
![Page 22: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/22.jpg)
使用 docker 架設 git-it 環境
![Page 23: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/23.jpg)
首先 我們需要
![Page 24: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/24.jpg)
能執行 Docker 的主機
![Page 25: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/25.jpg)
以下是我用過的虛擬主機DigitalOcean
Create Droplet→ One-click Apps→Docker 1.x.x on 14.04
AWS EC2
Ubuntu Server 14.04 LTS (HVM)→自己安裝 Docker
![Page 26: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/26.jpg)
如果你需要安裝 Docker官方 Linux 安裝腳本
Ubuntu
其他版本
如果你用 DigitalOcean 的 Docker 1.x.x on 14.04就可以跳過啦。
“
“
![Page 27: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/27.jpg)
實做時間請大家完成到可成功測試 Docker
sudo service docker start sudo docker run hello-world
![Page 28: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/28.jpg)
接下來我們要來寫 Docker le
![Page 29: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/29.jpg)
Docker le 是什麼?
![Page 30: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/30.jpg)
Docker le 包含創建映像檔所需要的全部指令。
我們可以使用 docker build 指令來創建映像檔。
通過減少映像檔和容器的創建程序來簡化部署。
![Page 31: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/31.jpg)
先來看幾個Docker le 的訣竅
![Page 32: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/32.jpg)
撰寫 Docker le 訣竅1. 先開一個基礎的容器
# 開啟一個基礎的 ubuntu:14.04 指令 sudo docker run -ti ubuntu:14.04 /bin/bash
2. 按照安裝教學安裝一次3. 將指令改成 non-interactive (不須互動,自動安裝)
4. 再把指令複製到 Docker le
![Page 33: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/33.jpg)
git-it 安裝教學https://github.com/jlord/git-
it/blob/master/original-readme.md
![Page 34: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/34.jpg)
系統更新sudo apt-get update sudo apt-get upgrade
non-interactive
apt-get update -qq apt-get upgrade -y
![Page 35: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/35.jpg)
git-it 需求Git
Node.js
純文字編輯器 (Text Editor)
英文語系 (English locales)
![Page 36: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/36.jpg)
git 安裝sudo apt-get install git
non-interactive
apt-get install -y git
![Page 37: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/37.jpg)
Node.js & npm 安裝sudo apt-get install nodejs npm # 由於 git-it 預設使用 node 執行,故須 link sudo ln -s /usr/bin/nodejs /usr/bin/node
non-interactive
apt-get install -y nodejs npm ln -s /usr/bin/nodejs /usr/bin/node
![Page 38: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/38.jpg)
純文字編輯器 (Text Editor)sudo apt-get install vim nano
non-interactive
apt-get install -y vim nano
![Page 39: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/39.jpg)
git-it 安裝sudo npm install -g git-it
non-interactive
npm install -g git-it
![Page 40: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/40.jpg)
Docker le 小結FROM ubuntu:14.04 RUN apt-get update -qq RUN apt-get upgrade -y RUN apt-get install -y git nodejs npm vim nano RUN ln -s /usr/bin/nodejs /usr/bin/node RUN npm install -g git-it
![Page 41: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/41.jpg)
接下來
![Page 42: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/42.jpg)
該怎麼讓學員進到自己的蘿蔔坑呢
![Page 43: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/43.jpg)
我們只有很少的主機
![Page 44: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/44.jpg)
一台主機上有很多個 client
![Page 45: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/45.jpg)
不能讓學員從 host 進入 client
r m - r f /
![Page 46: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/46.jpg)
SSHSecure Shell
![Page 47: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/47.jpg)
然後再把每個 client 的 SSH 埠
![Page 48: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/48.jpg)
port forwarding 出來
![Page 49: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/49.jpg)
BUT
![Page 50: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/50.jpg)
Docker 容器通常預設沒有 ssh
![Page 52: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/52.jpg)
Docker le 小結# ... 略 RUN apt-get install -y openssh-server RUN mkdir /var/run/sshdRUN echo 'root:git-it' | chpasswd RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/'RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
![Page 53: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/53.jpg)
現在
![Page 54: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/54.jpg)
你的 Docker le
已經足以練習 git-it
![Page 55: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/55.jpg)
BUT
![Page 56: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/56.jpg)
一次面對一個班級的時候還是有很多問題
![Page 57: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/57.jpg)
該怎麼快速開很多 client?
![Page 58: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/58.jpg)
docker start
docker-compose
![Page 59: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/59.jpg)
安裝 docker-compose
請注意 Docker Compose 的版本。
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname chmod +x /usr/local/bin/docker-compose docker-compose --version
參考網址
1. https://docs.docker.com/compose/install/
2. https://github.com/docker/compose/releases
“
“
![Page 60: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/60.jpg)
docker-compose.ymlversion: '2' services: client: build: client/ ports: - "22"
YML 的縮行很重要“ “
![Page 61: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/61.jpg)
開多台 client可自由指定數量
sudo docker-compose up -d sudo docker-compose scale client=5
![Page 62: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/62.jpg)
VPS 的 RAM 太小?
![Page 63: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/63.jpg)
設定 swap (建議)
如果開的機器 RAM 較小,則建議手動新增 swap 以供Docker 使用。
https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
![Page 64: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/64.jpg)
該怎麼指派SSH PORT 給學員?
![Page 65: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/65.jpg)
查詢 port forwarding 列表docker-compose ps
Name Ports --------------------------------------------------------------------gititcoursedocker_client_1 0.0.0.0:32794->22/tcp scoreboard 0.0.0.0:22000->22/tcp, 0.0.0.0:80->80/tcp
![Page 66: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/66.jpg)
client 的密碼所有人都知道該怎麼辦?
![Page 67: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/67.jpg)
強制登入後更改密碼在 Docker le 加上
RUN chage -d 0 root
![Page 68: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/68.jpg)
實做時間使用 SSH 進入 client
登入後立即要求更改 root 密碼
輸入 git-it 後進入選題選單
![Page 69: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/69.jpg)
接下來是比較進階的主題
![Page 70: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/70.jpg)
scoreboard
![Page 71: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/71.jpg)
scoreboard
能幫助我們什麼呢?
![Page 72: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/72.jpg)
scoreboard 能幫我們...顯示 client 的 SSH PORT
顯示哪個 client 還沒有人使用
顯示學員的名字
顯示學員的解題數使用網頁公開資料
![Page 73: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/73.jpg)
scoreboard 該怎麼用程式抓取 client 的 SSH PORT?
![Page 74: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/74.jpg)
先幫 client 的 Docker le 加上LABEL# Dockerfile LABEL role="git-it-client"
![Page 75: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/75.jpg)
使用 LABEL 進行過濾在 Docker Remote API 文件 範例
curl http://host/containers/json?filters={"label":["role=git-it-client"
docker ps 範例
docker ps --filter "label=role=git-it-client" --format '"{{.ID}}":{{.Ports}}'
![Page 76: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/76.jpg)
接下來是 client 的回報程式
![Page 77: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/77.jpg)
client 回報是否有人使用1. 查詢登入密碼是否已被更改
OWNED=`[ "never" = "$(chage -l root | grep 'Password expires' | sed -r 's/^[^:]+: //')
2. client 定期 (cron) 回報給 scoreboard
![Page 78: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/78.jpg)
client 回報學員的名字git-it 的題目會要求幫 git 設定使用者的名字和 GitHub的帳號,所以直接抓 git 的 user.name 和 user.username就好了。
NAME=`git config --global user.name || hostname` GITHUB=`git config --global user.username || echo ''`
![Page 79: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/79.jpg)
顯示學員的解題數git-it 會把解題數存放在 ~/.config/git-it/completed.json
COMPLETED=`test -r /root/.config/git-it/completed.json && cat /root/.config/git-it/completed.json ||
![Page 80: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/80.jpg)
client 需安裝 curlsudo apt-get install curl
non-interactive
apt-get install -y curl
![Page 81: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/81.jpg)
回報資料給 scoreboard#!/bin/bash COMPLETED=`test -r /root/.config/git-it/completed.json && cat /root/.config/git-it/completed.json || MID=`hostname` NAME=`git config --global user.name || hostname` GITHUB=`git config --global user.username || echo ''` OWNED=`[ "never" = "$(chage -l root | grep 'Password expires' | sed -r 's/^[^:]+: //') curl \ --data-urlencode "completed=${COMPLETED}" \ --data-urlencode "mid=${MID}" \ --data-urlencode "name=${NAME}" \ --data-urlencode "github=${GITHUB}" \ --data-urlencode "owned=${OWNED}" \ http://scoreboard/completed/update
![Page 82: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/82.jpg)
為什麼剛剛的回報程式可以用 scoreboard 當作主機?
![Page 83: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/83.jpg)
因為 Docker 的 LINK
會很貼心的幫我們設定DNS 解析 /etc/hosts
![Page 84: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/84.jpg)
於 client 中架設 crontab 定期回報
![Page 85: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/85.jpg)
撰寫 /etc/crontab每分鐘回報 client 的資料給 scoreboard,以 root 身份執行。
* * * * * root /usr/bin/scoreboard-reporter.sh >> /dev/null 2>&1
![Page 86: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/86.jpg)
client Docker le 加入 cron參考 https://github.com/aptible/docker-cron-example
RUN apt-get -y install rsyslog ADD crontab /etc/crontab ADD client-start.sh /usr/bin/client-start.sh ADD scoreboard-reporter.sh /usr/bin/scoreboard-reporter.sh RUN chmod +x /usr/bin/client-start.sh RUN chmod +x /usr/bin/scoreboard-reporter.sh RUN touch /var/log/cron.log
![Page 87: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/87.jpg)
client 啟動腳本由於我們需要執行的程式已經超過一個了,為了避免Docker le 的 CMD 指令太過複雜,所以我們要開新client 要執行的指令都寫在 client-start.sh
#!/bin/sh # client-start.sh sleep 5 rsyslogd cron /usr/sbin/sshd # 刪掉 -D 參數 /usr/bin/scoreboard-reporter.sh # 開機時先回報一次 tail -F /var/log/syslog /var/log/cron.log
![Page 88: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/88.jpg)
修改 Docker le CMD 指令# 要把舊的刪除,因為只有最後一個 CMD 有效 CMD /usr/bin/client-start.sh
![Page 89: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/89.jpg)
實作時間請參考 https://github.com/taichunmin/git-it-course-docker/tree/master/client
client 完成到可以回報資料給 scoreboard
![Page 90: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/90.jpg)
scoreboard
scoreboard Docker le
![Page 91: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/91.jpg)
主要接收 client 的回報還會去跟 Docker Remote API
取得每個 client
所對應的 PORT
![Page 92: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/92.jpg)
單純就是一個 HTTP Server
![Page 93: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/93.jpg)
由於不是每個人都會 PHP
所以就不深入談了
![Page 94: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/94.jpg)
我已經事先把 scoreboard
build 到 Docker Hub
![Page 95: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/95.jpg)
可以直接用 Docker Hub
來寫 docker-compose.yml
![Page 96: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/96.jpg)
scoreboard 的 docker-compose.yml
![Page 97: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/97.jpg)
version: '2' services: scoreboard: # build: scoreboard/ image: taichunmin/git-it-course-docker:scoreboard ports: - "80:80" - "22000:22" container_name: scoreboard volumes: - /var/run/docker.sock:/var/run/docker.sock
port 80 是網頁伺服器port 22 是 SSH,為了方便就固定對應到 22000
設定了 container_name 可以避免誤開多台
設定 volumes 可以讓 scoreboard 存取 Remote API
![Page 98: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/98.jpg)
須開放 Docker Remote API給 scoreboard
![Page 99: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/99.jpg)
開放 Docker Remote API利用 Volumes
version: '2' services: scoreboard: # 省略 volumes: - /var/run/docker.sock:/var/run/docker.sock
![Page 100: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/100.jpg)
然後我們需要修改 client 的docker-compose.yml
![Page 101: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/101.jpg)
version: '2' services: client: build: client/ ports: - "22" links: - scoreboard depends_on: - scoreboard
讓 docker-compose 自動對應 port 22 出來LINK 到 scoreboard,讓 client 可以回報資料depends_on 讓 docker-compose 確保有 scoreboard
![Page 102: COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境](https://reader030.fdocuments.net/reader030/viewer/2022021500/5878a0df1a28ab42588b5751/html5/thumbnails/102.jpg)
到此結束歡迎提問