devops-cd之esxi和docker實(shí)戰(zhàn)
概要
devops-cd之vagrant virtualbox實(shí)戰(zhàn)
https://www.yuque.com/wushifengcn/kb/qo3kmu
這篇文章講解和示范了vagrant自動(dòng)化virtualbox的情況
在vmware跨機(jī)器和docker場(chǎng)景下如下使用呢,本文總結(jié)下
- vmware esxi
- 通過vagrant操控
- 通過terraform操控
- docker
- docker-compose
- docker swarm
名詞
Vmware 服務(wù)器虛擬化第一個(gè)產(chǎn)品叫ESX,該產(chǎn)品只有60天測(cè)試,沒有官方認(rèn)可的免費(fèi)版。后來Vmware在4版本的時(shí)候推出了ESXI,ESXI和ESX的版本最大的技術(shù)區(qū)別是內(nèi)核的變化,ESXI更小,更安全,從其他方面來說ESXI可以在網(wǎng)上申請(qǐng)永久免費(fèi)的license,但是兩個(gè)版本的收費(fèi)版功能是完全一樣的。
從4版本開始VMware把ESX及ESXi產(chǎn)品統(tǒng)稱為vSphere,但是VMware從5版本開始以后取消了原來的ESX版本,所以現(xiàn)在來講的話vSphere就是ESXI,只是兩種叫法而已。一般官方文檔中以稱呼vSphere為主。
- ESXi Free版被更名為VMware vSphere Hypervisor
- vSphere的免費(fèi)產(chǎn)品名字叫vSphere Hypervisor,而收費(fèi)產(chǎn)品有各個(gè)版本,包括Essentials,Standard,Enterprise和Enterprise Plus。
- vCenter Server則是另外一個(gè)獨(dú)立產(chǎn)品,用于集中式管理vSphere環(huán)境。
【 VMware ESX 和 VMware ESXi 都是直接安裝在服務(wù)器硬件上的裸機(jī)管理程序】
ESXI上部署
軟件可以在官方下載
具體的esxi server可以通過WEB瀏覽器進(jìn)行管理
下面我們關(guān)注的是遠(yuǎn)程的自動(dòng)化操作,vagrant和terrafom都可以來操控,可以根據(jù)自己的熟悉程度和自己的團(tuán)隊(duì)的技術(shù)棧來選擇
vagrant操控
#
vagrant plugin list | grep vagrant-vmware-esxi || {
vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ --debug vagrant-vmware-esxi
}
vagrant box list|grep 'centos7.4_vmware' || {
vagrant init centos7.4_vmware "http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1708_01.VMwareFusion.box"
#導(dǎo)入后在 ~/.vagrant.d/boxes/centos7.4_vmware/0/vmware_desktop 可以看到虛擬機(jī)文件
}
# 修改Vagrantfile后執(zhí)行即可遠(yuǎn)程部署和啟動(dòng)我們?cè)O(shè)置的虛擬機(jī)vagrant up --provider=vmware_esxi
vagrant up
Vagrantfile的vmware_esxi插件語法和例子參考如下
https://hub.fastgit.org/josenk/vagrant-vmware-esxi
https://hub.fastgit.org/josenk/vagrant-vmware-esxi/tree/master/example_box
設(shè)置好Vagrantfile后,即可使用vagrant的命令語法來操控了
terraform操控
https://registry.terraform.io/providers/hashicorp/vsphere/latest terraform官方針對(duì)vsphere的操作說明是針對(duì)大多是針對(duì)vcenter進(jìn)行操作,有的也可以直接在esxi server上執(zhí)行執(zhí)行,如果安裝vcenter有些復(fù)雜
我們選這一個(gè)比較簡(jiǎn)潔的方式,社區(qū)的一個(gè)實(shí)現(xiàn)https://hub.fastgit.org/josenk/terraform-provider-esxi
【注意這個(gè)依賴于
- ovftool from VMware.
安裝 Vmare workstation 后直接有這個(gè)工具 【或者https://code.vmware.com/web/tool/4.4.0/ovf 下載,VMware-ovftool-4.4.1-16812187-lin.x86_64.bundle 】
- You MUST enable ssh access on your ESXi Server
terraform配置文件main.tf
variable "vm_name" {
description = "VM to be created's name"
default = "testvm"
}
variable "vcpus" {
description = "VM to be created's Cpu count"
default = "1"
}
variable "memsize" {
description = "VM to be created's memory[mb]"
default = "1024"
}
variable "state" {
description = "VM state[on / off]"
default = "on"
}
terraform {
required_version = ">= 0.13"
required_providers {
esxi = {
source = "josenk/esxi"
version = "1.8.1"
}
}
}
#esxi server的信息
provider "esxi" {
esxi_hostname = "192.168.80.201"
esxi_hostport = "22"
esxi_hostssl = "443"
esxi_username = "root"
esxi_password = "Root123!"
}
resource "esxi_guest" "vmtest" {
guest_name = var.vm_name
disk_store = "datastore1"
power = var.state
numvcpus = var.vcpus
memsize = var.memsize
#準(zhǔn)備部署的ova文件,這個(gè)提前準(zhǔn)備好
ovf_source = "./ovaexp/vmtest.ova"
network_interfaces {
virtual_network = "VM Network"
# mac_address =
# nic_type = "e1000"
}
}
output "ip" {
value = esxi_guest.vmtest.ip_address
}
部署腳本vm.sh
執(zhí)行如下的內(nèi)容,即可動(dòng)態(tài)的建立一個(gè)虛擬機(jī)了【由于josenk/esxi這個(gè)provider不能直接設(shè)置ip,因此腳本中換了種方式使用ansible進(jìn)行設(shè)置】
#!/bin/bash
set -xeuo pipefail
BaseDir=$(cd "$(dirname "$0")"; pwd)
cd ${BaseDir}
#原始的IP和需要改變成的IP
#192.168.80.100
RIP=192.168.80.100 #inventory的地址和這個(gè)一樣
NAME=${1-TEST}
VCPUS=${2-1}
MEMSIZE=${3-1024}
IP=${4-192.168.80.100}
echo "Create VM: ${NAME} ${VCPUS} ${MEMSIZE} ${IP}"
#1 通過terraform導(dǎo)入一個(gè)固定IP的虛擬機(jī)
#指定虛擬機(jī)名字、CPU個(gè)數(shù)、內(nèi)存大小[MB]
terraform apply -auto-approve -var "vm_name=${NAME}" -var "vcpus=${VCPUS}" -var "memsize=${MEMSIZE}"
#2 如上固定的IP可用后,使用ansbile修改IP
# ova鏡像先期條件 ssh -o StrictHostKeyChecking=no -i ./id_rsa vagrant@192.168.80.100
[ "${IP}" = "${RIP}" ] || {
ansible all -i inventory -m ping
ansible all -i inventory -m replace -a "path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp=${RIP} replace=${IP}" -b
#修改后重啟下機(jī)器
terraform apply -auto-approve -var "vm_name=${NAME}" -var "vcpus=${VCPUS}" -var "memsize=${MEMSIZE}" -var "state=off"
terraform apply -auto-approve -var "vm_name=${NAME}" -var "vcpus=${VCPUS}" -var "memsize=${MEMSIZE}" -var "state=on"
}
#如上做完了,在這個(gè)虛擬機(jī)上可以自由發(fā)揮了
echo "done"
inventory文件內(nèi)容
[ovfbase]
192.168.80.100
[ovfbase:vars]
# ansible_ssh_user ansible_ssh_pass
ansible_ssh_port=22
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=./id_rsa.pub
host_key_checking=false
docker上部署
- 單機(jī)上
- 只是運(yùn)行某個(gè)容器,直接命令行或者shell腳本即可
- 如果是多個(gè)容器并有依賴關(guān)系等比較復(fù)雜的設(shè)置,可以使用docker-compose
- 多機(jī)上
- docker swarm進(jìn)行分布式部署【不過這個(gè)逐步淘汰了,k8s是目前更主流的形式】,但優(yōu)點(diǎn)是比k8s簡(jiǎn)單易用
docker-compose
docker-compose是在單機(jī)上進(jìn)行容器編排的工具
在多機(jī)分布式式容器編排,docker公司提供的是swarm產(chǎn)品,目前主流的是k8s
docker-compose是python寫的程序,可以從這下載單個(gè)的打包執(zhí)行文件,放入/usr/bin/下直接使用【 https://github.com/docker/compose/releases ,python方式的安裝方法pip install docker-compose】
docker-compose通過配置好的compose文件運(yùn)行【compose文件中指定了運(yùn)行的所有設(shè)置,默認(rèn)讀取的文件名為docker-compose.yml】,compose文件語法
https://docs.docker.com/compose/compose-file/compose-file-v3/
從這個(gè)例子可以看到概貌
https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples
例子解釋
version: "3.9" compose的版本
services: 啟動(dòng)的容器服務(wù)節(jié),這個(gè)下面可以定義各種服務(wù)
redis: 定義一個(gè)服務(wù)
image: redis:alpine 容器鏡像名稱
ports: 提供服務(wù)的端口,也可以設(shè)置映射到host機(jī)器的端口
- "6379"
networks:使用的網(wǎng)絡(luò)
- frontend
deploy: swarm方式下的部署條件設(shè)置
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes: 存儲(chǔ)卷設(shè)置
- db-data:/var/lib/postgresql/data 將docker的db-data卷映射到容器的/var/lib/postgresql/data目錄
networks:
- backend
deploy:
placement:
max_replicas_per_node: 1
constraints:
- "node.role==manager"
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- "5000:80"
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:#swarm集群下管理節(jié)點(diǎn)上【node.role==manager】部署1個(gè)實(shí)例,可彈性部署【replicated】
mode: replicated
replicas: 1
labels: [APP=VOTING] #標(biāo)簽用于分類和過濾等,k8s中一個(gè)很關(guān)鍵的屬性
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints:
- "node.role==manager"
visualizer:
image: dockersamples/visualizer:stable
environment: #部署主機(jī)的主機(jī)名hostname
- node.name=visualizer
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement: #swarm集群下僅在管理節(jié)點(diǎn)部署這個(gè)容器
constraints:
- "node.role==manager"
networks: 網(wǎng)絡(luò)設(shè)置,如下設(shè)置了2個(gè)網(wǎng)絡(luò),網(wǎng)絡(luò)的配置使用默認(rèn)
frontend:
backend:
volumes: 卷配置
db-data:
大體的邏輯關(guān)系:
frontend網(wǎng)絡(luò)中
redis容器:redis 6379服務(wù)
vote容器:依賴于redis容器,80服務(wù),映射到主機(jī)的端口是5000
backend網(wǎng)絡(luò)
db容器:postgres 服務(wù),持久化數(shù)據(jù)到db-data卷
result容器:依賴于db, 80服務(wù)端端口,映射到主機(jī)的端口是5001
跨越frontend backend網(wǎng)絡(luò)
worker容器:
默認(rèn)的docker網(wǎng)絡(luò):
visualizer容器: 8080服務(wù)端端口,映射到主機(jī)的端口是8080
常用命令
- 啟動(dòng)
- 服務(wù)方式:
- docker-compose up -d:容器不存在創(chuàng)建并運(yùn)行
- docker-compose start: 容器已經(jīng)存在時(shí)運(yùn)行
- 阻塞方式:docker-compose up
- 指定某個(gè)配置運(yùn)行:docker-compose -f docker-composeV3.yml up
- 停止
- docker-compose down: Stop and remove containers, networks, images, and volumes
- docker-compose stop: Stop services
- 清理
- docker-compose rm
docker常用運(yùn)行例子
- docker run --rm/-itd -v $PWD:/rally --name rally --network host dev.docker:8085/elastic/rally:2.0.0 --track=nyc_taxis --test-mode --pipeline=benchmark-only --target-hosts=localhost:9200
- --rm/-itd:--rm運(yùn)行后直接刪除容器; itd 服務(wù)方式運(yùn)行容器
- -v $PWD:/rally: 將當(dāng)前目錄掛載到容器的/rally目錄下,作為存放數(shù)據(jù)目錄使用
- --name rally:執(zhí)行容器的名字,這樣docker exec之類的方便使用
- --network host:直接使用主機(jī)的ip地址
- dev.docker:8085/elastic/rally:2.0.0:鏡像的名稱和版本
- --track=nyc_taxis... :運(yùn)行是傳遞的參數(shù),這個(gè)是和容器內(nèi)啟動(dòng)程序配合的,如果直接寫bash/sh之類,那就會(huì)啟動(dòng)個(gè)shell
- docker exec -uroot -it rally sh
- 已經(jīng)運(yùn)行的容器,以root用戶shell登錄進(jìn)去
- docker logs rally -f
- 查看運(yùn)行的rally容器的輸出日志
https://developer.aliyun.com/article/783289?spm=a2c6h.12883283.1362932.3.5f1f201cdosA8U 《AI開發(fā)者的Docker實(shí)踐》這個(gè)電子書可以參考
Tip
- 多容器間主機(jī)名的通訊
- 在同一個(gè)網(wǎng)絡(luò)的容器可以直接通過主機(jī)名【或容器名】通訊,docker內(nèi)部相當(dāng)于有個(gè)dns,直接解析成了ip
- docker的數(shù)據(jù)存儲(chǔ)
- 數(shù)據(jù)不要在容器內(nèi)直接存儲(chǔ),因此容器的格式是aufs,效率沒有ext等文件系統(tǒng)高
- 數(shù)據(jù)一般使用docker建立卷或者映射主機(jī)的目錄,具體有如下幾種
- docker volume命令建立的卷
- -v 映射主機(jī)的數(shù)據(jù)目錄掛載到容器的卷
- 在容器內(nèi)使用nfs之類遠(yuǎn)程掛載
- host主機(jī)ip幫助
- docker-compose -h
- docker-compose help up ....
- docker-compose中變量使用
- 啟動(dòng)時(shí)設(shè)置變量 export ELASTIC_VERSION=7.9.0
- compose文件中引用
- image: dev.docker:8085/kibana:${ELASTIC_VERSION:-7.8.0}
- 容器內(nèi)的服務(wù)提供服務(wù)
- 容器想提供服務(wù),需要首先確保容器內(nèi)對(duì)應(yīng)的服務(wù)進(jìn)程的正常
- 服務(wù)端口需要暴露,expose
- 對(duì)外提供服務(wù)
- 方式1:使用容器的:ip+端口
- 方式2:設(shè)置端口映射,使用:host主機(jī)ip+映射端口
- 方式3:僅在網(wǎng)絡(luò)模式設(shè)置了host模式時(shí),使用:host主機(jī)ip+expose端口
- 【方式1,2如果對(duì)其他的主機(jī)提供服務(wù)還需要一些特別的設(shè)置,方式3其他主機(jī)可以直接訪問這個(gè)服務(wù);服務(wù)的診斷curl tcpdump工具很重要】
- docker的鏡像
- Dockerfile文件的約定 https://docs.docker.com/engine/reference/builder/
- 自己做鏡像是,鏡像大小需要注意下,這個(gè)有較多的優(yōu)化技巧【當(dāng)然如果只是局域網(wǎng)內(nèi)部用,大小不受限的話就無所謂】
- docker鏡像被墻了
- 方式1:使用vpnFQ下載
- 方式2:使用阿里云容器服務(wù)或者github上進(jìn)行海外構(gòu)建方式,可以規(guī)避這個(gè)問題【執(zhí)行查找docker海外構(gòu)建】
- 容器的資源如何限制
- cpu 、內(nèi)存等都是可以設(shè)置的,具體參考官方文檔,命令行和compose文件都可以設(shè)置
- 容器和HOST主機(jī)如何傳遞數(shù)據(jù)文件
- 方式1:基于sftp相互拷貝【需要容器配置好ssh服務(wù)并開啟sftp】
- 方式2:使用docker cp FILES containerName:FILES 互相拷貝
- 方式3:使用共享的卷傳遞,docker運(yùn)行時(shí)-v指定的共享目錄
- 容器運(yùn)行數(shù)據(jù)如何清理
- 運(yùn)行相關(guān)的數(shù)據(jù)涉及 network volume container system【這個(gè)包含了前面3個(gè)】,清理這些數(shù)據(jù)時(shí)這些數(shù)據(jù)資源不能正在使用,其中volume這個(gè)需要慎重,這是程序運(yùn)行保存的數(shù)據(jù),需要做好備份
- 使用方法類似:docker system prune -f
- 容器的資源使用情況如何監(jiān)控
- 在容器內(nèi)執(zhí)行top看到的數(shù)據(jù)不是容器的數(shù)據(jù),監(jiān)控需要使用類似
- 容器內(nèi)運(yùn)行:ctop
- HOST機(jī)器上運(yùn)行:cadvisor、metricbeat、docker stats 命令行查看
- 在HOST主機(jī)上如何自動(dòng)運(yùn)行容器內(nèi)的腳本等執(zhí)行文件
- 類似: docker exec -it radius sh "apk add freeradius-client",權(quán)限不對(duì)的可以增加-u username 參數(shù)
參考
devops-hasicorp產(chǎn)品圖 https://www.yuque.com/wushifengcn/kb/bbvrtw
devops-cd之esxi和docker實(shí)戰(zhàn) https://www.yuque.com/wushifengcn/kb/tyy1r6
devops-cd之vagrant virtualbox實(shí)戰(zhàn) https://www.yuque.com/wushifengcn/kb/qo3kmu