在前一章「Ansible 用 Jupyter 操控 Ansible (Managed node)」我們借由 Docker 實(shí)作用 Control Machine 和 Managed node 的環(huán)境。雖看似完美,可當(dāng)容器一多就會(huì)讓建置環(huán)境的流程變得復(fù)雜且繁瑣,這次凍仁將改用 Docker Compose 來(lái)簡(jiǎn)化練習(xí) Ansible 的步驟。
Docker Compose 是個(gè)用來(lái)定義和執(zhí)行復(fù)雜 Docker 應(yīng)用程序的工具,它就好比 Shell Script 和 Ansible Playbooks,通過(guò)事先撰寫好的 docker-compose.yml
來(lái)批次管理 Docker 容器。
官網(wǎng)簡(jiǎn)介如下:
Docker Compose allows you to define your multi-container application with all of its dependencies in a single file, then spin your application up in a single command.
若想深入了解 Docker Compose,可參考以下文章:
底下只列出本次主題所會(huì)用到的相關(guān)指令,練習(xí)時(shí)只需執(zhí)行步驟 1, 2 即可。
建立并執(zhí)行容器。
$ docker-compose up
觀看容器狀態(tài)和綁定的埠口 (Port)。
$ docker-compose ps
停止容器。
$ docker-compose stop
啟用容器。
$ docker-compose start
移除容器:再移除之前得先停用容器后才可移除。
$ docker-compose rm -f
# -f, --force: Don't ask to confirm removal
上一章我們開(kāi)了 3 個(gè) Docker 容器來(lái)實(shí)作 Control Machine (Jupyter, Ansible) + Managed node (CentOS 7, Ubuntu 14.04) 的環(huán)境,這次就再加一個(gè) Debian 8 的 Managed node,并命名為 server3。
圖片來(lái)源: https://www.docker.com/products/docker-compose
docker-compose.yml
這次凍仁挑了 chusiang/ansible-jupyter:alpine-3.4
的 Docker image 作為 Control Machine,而新加入的 Managed node 則是 chusiang/ansible-managed-node:debian-8
。
$ vi docker-compose.yml
version: '2'
services:
control_machine:
ports:
- 8888:8888/tcp
image: chusiang/ansible-jupyter:alpine-3.4
server1:
ports:
- 2221:22/tcp
image: chusiang/ansible-managed-node:ubuntu-14.04
server2:
ports:
- 2223:22/tcp
image: chusiang/ansible-managed-node:centos-7
server3:
ports:
- 2222:22/tcp
image: chusiang/ansible-managed-node:debian-8
使用 docker-compose up
來(lái)批次秒開(kāi)所有容器!
$ docker-compose up
Starting ch09_server2_1
Starting ch09_server1_1
Starting ch09_server3_1
Creating ch09_control_machine_1
Attaching to ch09_server3_1, ch09_server1_1, ch09_server2_1, ch09_control_machine_1
control_machine_1 | [I 22:29:59.156 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
control_machine_1 | [I 22:29:59.208 NotebookApp] Serving notebooks from local directory: /home
control_machine_1 | [I 22:29:59.209 NotebookApp] 0 active kernels
control_machine_1 | [I 22:29:59.209 NotebookApp] The Jupyter Notebook is running at: http://0.0.0.0:8888/
control_machine_1 | [I 22:29:59.210 NotebookApp] Use Control-C to stop this server and shut down allkernels (twice to skip confirmation).
...
這部份大多與前一章的 Ansible 用 Jupyter 操控 Ansible (Managed node) 重復(fù),請(qǐng)?zhí)貏e留意 inventory
檔案的設(shè)置。
取得本機(jī)的 IP:凍仁取得的 IP 為 192.168.1.104
,請(qǐng)自行修改。
# GNU/Linux
$ ifconfig eth0
# macOS
$ ifconfig en7
取得 Managed node 容器所綁定的 OpenSSH port,請(qǐng)?zhí)貏e留意 0.0.0.0:222?->22/tcp
的部份。
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
ch09_control_machine_1 docker-entrypoint.sh jupyt ... Up 0.0.0.0:8888->8888/tcp
ch09_server1_1 /usr/sbin/sshd -D Up 0.0.0.0:2221->22/tcp
ch09_server2_1 /usr/sbin/sshd -D Up 0.0.0.0:2223->22/tcp
ch09_server3_1 /usr/sbin/sshd -D Up 0.0.0.0:2222->22/tcp
進(jìn)入 Jupyter notebook 網(wǎng)站 (http://localhost:8888/)。
若不想通過(guò) Jupyter 操作 Ansible,可直接進(jìn)入容器里操作,但要記得切換到 /home
目錄底下。
# 從 Host OS 進(jìn)入容器。
$ docker exec -it ch09_control_machine_1 sh
/ #
# 切換目錄。
/ # cd /home
# 列出 /home 底下的檔案。
/home # ls -1
ansible.cfg
ansible_on_jupyter.ipynb
inventory
setup_jupyter.yml
修改 inventory
檔案,并填入步驟 1 取得的 IP 和步驟 2 取得的 OpenSSH port。這次容器的 Port mapping 將會(huì)依照 docker-compose.yml 所定義的內(nèi)容建立,不像原先得一個(gè)個(gè)的手動(dòng)設(shè)定。
server1 ansible_ssh_host=192.168.1.104 ansible_ssh_port=2221
server2 ansible_ssh_host=192.168.1.104 ansible_ssh_port=2222
server3 ansible_ssh_host=192.168.1.104 ansible_ssh_port=2223
請(qǐng)勿在這個(gè) Lab 使用 localhost 和 127.0.0.1 的位址,這會(huì)讓 Control Machine 一直對(duì)自己找 Managed node。在這里我們是把 Managed node 的 OpenSSH port 綁在 Host OS 1 上,而不是 Control Machine 的容器里。
環(huán)境建置完成!現(xiàn)在可以到 Control Managed (Jupyter + Ansible) 上對(duì)各個(gè) Managed node (Ubuntu 14.04, CentOS 7, Debian 8) 進(jìn)行操作了。
現(xiàn)在我們可以通過(guò) Ansible 操控 3 個(gè) Managed node 了,記得把 inventory 的部份從 localhost
改成 all
喔!
改用 Docker Compose 管理容器后,我們可以一次對(duì)所有容器進(jìn)行操作,并大幅簡(jiǎn)化建置復(fù)雜 Ansible 練習(xí)環(huán)境的操作流程!
以上,希望大家會(huì)喜歡簡(jiǎn)化過(guò)的 Docker Compose 流程。:D
更多建議: