一、用Chef自動化部署Docker
1.為什么需要自動化部署?
- Docker引擎需要配置很多參數(cgroups、內存、CPU、文件系統等)
- 識別Docker容器運行在哪個宿主機上
- 耗時且容易出錯,不易管理
2.Docker的配置管理
- 從應用開發、演示、測試到部署生產環境,Docker容器可以復制應用程序的全部環境
- 編譯Docker鏡像是一種簡便使應用程序更新並部署到所有環境中的方法
- Docker允許團隊成員掌握應用程序運行所需要的全部信息,同時可以將必要的變更高效地交付給客戶。深入Dockerfile,他們可以知道應用程序的那部分需要更新以及正常運行所需的依賴
- Docker記錄我們對Docker鏡像所做的全部環境變更。然后,它通過相應版本的Dockerfile記錄,同時記錄了變更的內容、變更的操作人以及變更的發生時間。
3.使用Chef
(1)安裝docker-engine軟件包示例
package 'docker-engine' do
action :install
end
(2)Chef環境部署
A. 注冊Chef服務器
Chef服務器包括cookbook、策略、Docker宿主機的元信息
- 官網創建賬號
- 創建一個組織
- 點擊“Download Starter Kit”下載壓縮包
B. 搭建工作站
與Chef服務器進行交互。
Chef資源庫包含了所有需要交互的信息並且保持與Chef服務器同步,還保存了私有密鑰以及其他需要授權的配置文件。
Chef開發工具包包含了所有與讀取chef-repo中配置信息有關的程序。(去官網下載適合的工具包)
C. 啟動節點
chef-client負責Chef服務器並下載必要的配置文件,同時將節點配置到預期狀態。
- 在Chef服務器上注冊並授權管理當前節點
- 收集節點上的系統信息用於創建一個節點對象
- 根據節點需要同步相應的Chef cookbook
- 通過加載節點所需的recipe來編譯資源
- 執行所有的資源並按照相應的操作去配置節點
- 報告chef-client的結果給Chef服務器和其他已配置的消息終端
knife bootstrap dockerhost
訪問網站確定宿主機已注冊成功。
(3)配置Docker宿主機
生成cookbook模板
cd cookbooks
chef generate cookbook dockerhost
編輯cookbook
cd dockerhost
vim metadata.rb
name 'dockerhost'
maintainer 'The Authors'
maintainer_email 'dayun@163.com'
license 'all_rights'
description 'Installs/Configures dockerhost'
long_description 'Installs/Configures dockerhost'
version '0.1.0'
depends 'apt', '~> 2.7.0'
depends 'docker', '~> 0.40.3'
開始安裝
berks install
編寫Chef recipe
vim recipes/default.rb
apt_repository 'docker' do
uri 'http://apt.dockerproject.org/repo'
components %w(debian-jessie main)
keyserver 'p80.pool.sks-keyservers.net'
key '5813fh193f8834fjqewifj9348j34ifjq'
cache_rebuild true
end
package 'docker-engine'
應用部署
上傳Chef cookbook到Chef服務器
berks upload
通過設置run_list應用dockerhost recipe到節點
knife node run_list set dockerhost dockerhost
在dockerhost中執行chef-client
ssh dockerhost
sudo chef-client
(4)部署Docker容器
解決的問題:
- 哪些容器需要運行
- 容器間如何連接
- Docker容器被部署在哪個宿主機
創建Chef recipe
chef generate recipe . containers
(將在dockerhost目錄下創建recipes/containers.rb)
拉取Nginx的Docker鏡像
在containers.rb文件中加入如下行:
docker_image 'nginx' do
tag '1.9.3'
end
配置宿主機運行容器
在containers.rb中添加如下行:
node.set['docker']['container_init_type'] = 'systemd'
directory '/usr/lib/systemd/system'
docker_container 'nginx' do
tag '1.9.3'
container_name 'webserver'
detach true
ort '80:80'
end
發布cookbook,通過metadata.rb中指定信息實現
name 'dockerhost'
maintainer 'the Authors'
maintainer_email 'hdlptz@163.com'
license 'all_rights'
description 'Installs/Configures dockerhost'
long_description 'Installs/Configures dockerhost'
version '0.2.0'
depends 'apt', '~> 2.7.0'
depends 'docker', '~> 0.40.3'
更新Berksfile.lock文件來鎖定所有將要上傳到Chef服務器的cookbook文件版本
berks install
上傳cookbook到Chef服務器
berks upload
添加recipes/containers.rb到Docker宿主機的運行列表
knife node run_list add dockerhost dockerhost::containers
重新運行chef-client來更新Docker宿主機配置
ssh dockerhost
sudo chef-client
訪問http://dockerhost確認工作正常
二、其他可選方案
- Puppet
- Ansible
- CFEnginc
- SaltStack
- Docker machine
雲提供商
- Google Container Engine
- Amazon EC2 Container Service
- Azure Docker VM Extension
- Joyent Elastic Container Service
部署工具
- Docker Swarm
- Google Kubernetes
- CoreOS fleet
- Mesophere Marathon
- SmartData Center Docker Engine