Create Droplet
→One-click Apps
→Docker 1.x.x on 14.04
Ubuntu Server 14.04 LTS (HVM)
→自己安裝 Dockersudo service docker start
sudo docker run hello-world
docker build
指令來創建映像檔。# 開啟一個基礎的 ubuntu:14.04 指令
sudo docker run -ti ubuntu:14.04 /bin/bash
sudo apt-get update
sudo apt-get upgrade
apt-get update -qq
apt-get upgrade -y
sudo apt-get install git
apt-get install -y git
sudo apt-get install nodejs npm
# 由於 git-it 預設使用 node 執行,故須 link
sudo ln -s /usr/bin/nodejs /usr/bin/node
apt-get install -y nodejs npm
ln -s /usr/bin/nodejs /usr/bin/node
sudo apt-get install vim nano
apt-get install -y vim nano
sudo npm install -g git-it
npm install -g git-it
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
# ... 略
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:git-it' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
請注意 Docker Compose 的版本。
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
參考網址
version: '2'
services:
client:
build: client/
ports:
- "22"
YML 的縮行很重要
sudo docker-compose up -d
sudo docker-compose scale client=5
如果開的機器 RAM 較小,則建議手動新增 swap 以供 Docker 使用。
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
在 Dockerfile 加上
RUN chage -d 0 root
git-it
後進入選題選單# Dockerfile
LABEL role="git-it-client"
OWNED=`[ "never" = "$(chage -l root | grep 'Password expires' | sed -r 's/^[^:]+: //')" ] && echo '1' || echo '0'`
git-it 的題目會要求幫 git 設定使用者的名字和 GitHub 的帳號,所以直接抓 git 的 user.name
和 user.username
就好了。
NAME=`git config --global user.name || hostname`
GITHUB=`git config --global user.username || echo ''`
git-it 會把解題數存放在 ~/.config/git-it/completed.json
COMPLETED=`test -r /root/.config/git-it/completed.json && cat /root/.config/git-it/completed.json || echo []`
sudo apt-get install curl
apt-get install -y curl
#!/bin/bash
COMPLETED=`test -r /root/.config/git-it/completed.json && cat /root/.config/git-it/completed.json || echo []`
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/^[^:]+: //')" ] && echo '1' || echo '0'`
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
/etc/hosts
/etc/crontab
每分鐘回報 client 的資料給 scoreboard,以 root 身份執行。
* * * * * root /usr/bin/scoreboard-reporter.sh >> /dev/null 2>&1
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
由於我們需要執行的程式已經超過一個了,為了避免 Dockerfile 的 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
# 要把舊的刪除,因為只有最後一個 CMD 有效
CMD /usr/bin/client-start.sh
docker-compose.yml
docker-compose.yml
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
container_name
可以避免誤開多台volumes
可以讓 scoreboard 存取 Remote API利用 Volumes
version: '2'
services:
scoreboard:
# 省略
volumes:
- /var/run/docker.sock:/var/run/docker.sock
docker-compose.yml
version: '2'
services:
client:
build: client/
ports:
- "22"
links:
- scoreboard
depends_on:
- scoreboard
depends_on
讓 docker-compose 確保有 scoreboard