magnum

Docker get start

Install Docker (Ubuntu 14.04)

#加入第三方的apt來源
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv \ --keyserver hkp://ha.pool.sks-keyservers.net:80 \ --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
#驗證docker已存在於apt-cache
$ sudo apt-get update
$ apt-cache policy docker-engine
#為了使用aufs storage driver,14.04版應是先安裝linux-image-extra-* kernel packages
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
#安裝docker-engine
$ sudo apt-get update
$ sudo apt-get install docker-engine
#啟動docker,作hello-world image測試
$ sudo service docker start

Docker 運作流程

  1. Docker Engine CLI client 連接到 Docker Engine daemon.
  2. Docker Engine daemon 從 Docker Hub pull image(例如:"hello-world" image)
  3. Docker Engine daemon 利用抓下來的image載入到一個新的container並執行其內容
  4. Docker Engine daemon 將運行結果回傳給 Docker Engine CLI client,並送回到原本執行command的terminal

Verify Installation

#hello-world image測試
$ sudo docker run hello-world
#啟動一個ubuntu tty,-t 選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。
$ sudo docker run -it ubuntu bash
#啟動一個whalesay image,
$ docker run docker/whalesay cowsay boo
#docker版本查詢
$ sudo docker version
#docker containers運行清單
$ sudo docker ps -a
#docker image清單
$ sudo docker images

Build image

#寫一個Dockerfile
$ mkdir mydockerbuild
$ cd mydockerbuild
$ touch Dockerfile
$ nano Dockerfile
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
#利用Dockerfile build一個image
$ docker build -t docker-whale .

Push and pull image

#找出image id
$ sudo docker images
#標記image
$ sudo docker tag [image-id] baddychiang/docker-whale:latest
#登入docker hub
$ sudo docker login
#push image到repository
$ sudo docker push baddychiang/docker-whale
#移除本地端image
$ sudo docker rmi docker-whale
#重新pull image下來執行
$ sudo docker run baddychiang/docker-whale
OpenStack

Basic OpenStack operations

API

透過GUI、CLI下的指令,都會轉換成API來執行,所以任何指令也都能透過API來完成

Debug CLI

CLI加上–debug,便能expose API的行為

Set environmental variables

#bash的completion
$ source /opt/stack/python-novaclient/tools/nova.bash_completion
#從某個demo in demo執行指令
$ source openrc demo demo

Keystone – creating tenants, users and roles

#建立General tenant
$ keystone tenant-create --name General
#建立XXX user
$ keystone user-create \
--name=XXX \
--pass=openstack \
--tenant-id [tenant_id] \
--email=XXX@mail.com
#查看user list, role list
$ keystone user-list
$ keystone role-list
#增加一個role
$ keystone user-role-add \
--tenant-id [tenant_id] \
--user-id [user_id] \
--role-id [role_id]

Neutron – tenant network

inside tenant要建立一個private network、subnet、virtual router再與public(external) network連接

#建立一個internal network
$ neutron net-create \
--tenant-id [tenant_id] \
[NETWORK_NAME]
#在network中建立一個subnet
$ neutron subnet-create \
--tenant-id [tenant_id] \
[NETWORK_NAME] \
[SUBNET_RANGE CIDR  ex:172.24.220/24]
#建立一個virtual router
$ neutron router-create \
--tenant-id [tenant_id] \
[ROUTER_NAME]
#把router加入到internal subnet
$ neutron router-interface-add \
[ROUTER_ID] \
[SUBNET_ID]
#秀出external network list
$ neutron net-external-list
#[已經有external network]指定外部的external network作為internal router的gateway
$ neutron router-gateway-set \
[ROUTER_ID] \
[EXT_NETWORK_ID]
#[尚未有external network]若外部沒有external network,則必須建立一個,預設是由admin tenant來建立
$ neutron net-create \
[EXT_NETWORK_NAME] \
--router:external=True
#[尚未有external network]在external network中建立一個subnet
$ neutron subnet-create \
--gateway [GATEWAY_IP ex:192.168.2.1] \
--allocation-pool start=[IP_START ex:192.168.2.2] ,end=[IP_END ex:192.168.2.254] \
[NETWORK_NAME ex:new_public] \
[SUBNET_RANGE CIDR  ex:192.168.2.0/24] \
--enable_dhcp=False
#秀出router list
$ neutron router-list
#切換router gateway,從已有的external network切換到新建立的external network
$ neutron router-gateway-clear \
[ROUTER_ID]
$ neutron router-gateway-set \
[ROUTER_ID] \
[NEW_EXT_NETWORK_ID]
#秀出特定router的info
$ neutron router-show

 Keystone、Nova、Cinder Quotas management

每個tenant建立時就會帶入預設的quota,每個tenant中的user也會配置tenant的預設quota,但是每個user的quota都可以被調整,當增加quotas超過tenant的quota時,tenant quota也會被調升。

#秀出tenant id
$ keystone tenant-list
#秀出目前tenant內的nova(Compute) quotas information
$ nova quota-show \
--tenant [TENANT_ID]
#秀出目前tenant預設quotas (不加TENANT_ID)
$ nova quota-show
#修改某個tenant的quota限制
$ nova quota-update \
--[QUOTA_KEY ex:cores] [QUOTA_VALUE ex:20] \
[TENANT_ID]
#查詢某個tenant內的user quotas information (預設user quota會等同預設的tenant quota,不受修改的tenant quota影響)
$ nova quota-show \
--user [USER_ID] \
--tenant [TENANT_ID]
#修改某個tenant的user quota限制
$ nova quota-update \
--user [USER_ID] \
--[QUOTA_KEY ex:instance] [QUOTA_VALUE ex:1] \
[TENANT_ID]
#秀出目前tenant內的cinder(Storage) quotas information
$ cinder quota-show \
--tenant [TENANT_ID]
#秀出目前tenant內的neutron(Networking) quotas information
$ neutron quota-show \
--tenant [TENANT_ID]

文章參考資料

  • OpenStack IN ACTION (ISBN:9781617292163)
OpenStack

DevStack testing

安裝DevStack流程

建議使用Ubuntu 14.04版

#更新packages
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
#安裝git,以clone DevStack
$ sudo apt-get -y install git
#clone DevStack至/opt/devstack/
$ sudo git clone https://github.com/openstack-dev/devstack.git /opt/devstack/
#創建devstack專用用戶stack
$ cd /opt/devstack/
$ sudo chmod u+x tools/create-stack-user.sh
$ sudo tools/create-stack-user.sh
$ sudo chown -R stack:stack /opt/devstack/
#切換到stack以執行安裝
$ sudo -iu stack
$ cd /opt/devstack/
#配置所需的local.conf
$ nano local.conf
#進行安裝./stack.sh
$ ./stack.sh
#-----------------------------------------------
#中途若遇到失敗,可透過unstack以及clean的動作進行重新安裝
$ ./unstack.sh
$ ./clean.sh
$ sudo rm -rf /opt/stack
$ sudo reboot
$ sudo mkdir /opt/stack
#接著再從 上述 [#創建devstack專用用戶stack] 重新進行
#-----------------------------------------------


文章參考資料

  • OpenStack IN ACTION (ISBN:9781617292163)