iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
1

天呀,1人訂閱,4人追蹤。(有人在看a,好緊張@@)
其實只是整理網路資料,主要都參考網路大大跟官網文章,今年只求完賽而己

這幾天先來介紹Docker,其實我覺得在家玩DevOps,或小型團隊,其實Docker就很夠用了
而k8s有點像 須彌納芥子 芥子納須彌
芥子(很小):k8s cluster很小,但內部根本就是完整的網路機房....芥子納須彌
須彌(很大):機房、AWS、GCP 很大,可以建k8s cluster....須彌納芥子

k8s到現在還沒建成功…再用基本工具撐個幾天

每個主題之間沒有什麼關聯,甚至同一主題不同天都沒串連
基本上就是新的VM重玩,會建議用VMware裝個Ubuntu的VM

  • VMWare Fusion 不要用自動安裝,常常會Lag ~"~
  • Parallel 對虛擬化的支援好像比較差(去年花990$買了也沒啥在用,今年就不升級了)
  • Virtual Box 應該也能跑,只是效能似乎比 VMWare 差,Vagrant 預設是建 Virtual Box
  • 實務工作上比較會碰到的應該是 VMWare、Hpyer-V

真的很感謝大大們的文章,讓小弟在那麼多的新技術能玩玩皮毛、有個方向
抱著回饋的心態,明年要是沒意外的話應該還是會參賽吧
明天一定提升文章質量

本篇主要參考

用30天來介紹和使用Docker

https://ithelp.ithome.com.tw/users/20103456/ironman/1320

Docker —— 從入門到實踐

https://philipzheng.gitbooks.io/docker_practice/content/install/ubuntu.html

今天只會整理想用的部分,也是自己常用指令的筆記,
若要學習完整的Docker,請大家去看上面大大們的原文喔~ 保證是優質好文

雖然感覺Docker比較不會汙染到環境
但建議您建一個VM來玩Docker,以確保每次的環境是乾淨的

安裝Docker

好像我其他天會有教學,不過我忘記放在哪一天了,安裝Docker就請先參考官網吧

systemctl start docker
systemctl enable docker
systemctl restart docker # 使用時機:如果有動到/etc/docker/daemon.json的話

非常重要,讓docker可讓non-root user身份執行

  • 在ubuntu,除用sudo免打密碼的指令:
$ echo "你的帳號 ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/你的帳號
# 1、建一個docker group
$ sudo groupadd docker 
# 2、把你的帳號加到docker group
$ sudo usermod -aG docker 你的帳號 
# 3、重新開機(登出再登入應該也行)

如果遇到這個錯誤
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

  • 解法1
    刪掉~/.docker/,會自己重建
  • 解法2
$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R

Docker 常用指令

docker images

$ docker images # 列出本機端所有的映像檔 (images)

docker search

$ docker search ubuntu # 找關鍵字ubuntu的images

docker pull

$ docker pull library/ubuntu:latest # 下載image

=========超重要的指令 start =========

docker run: 新建並啟用容器 (Container)

$ docker run -itd ubuntu /bin/bash

要用ctrl+p、ctrl+q離開shell,否則container會停掉喔!

建議一定要下的參數
-itd是常用的起手式,-d:以daemon方式執行
--restart=always # 重開機就重啟container
--name ubuntu # 一定要給container命名
就像生小孩要去戶政事務所報戶口一樣,叫小孩是用名字,若用身份證字號不是很麻煩嗎?

$ docker logs ubuntu # 查container的name為ubuntu的log
$ docker ps -a # 列出所有的container,若沒有-a:只列出在running的
$ docker ps -a: 列出所有的容器, 或 docker ps --all
$ docker stats nginx # 看某個container狀態
$ docker start/stop [Container_Name]: 啟用/終止容器
$ docker exec [Container_Name] [Command]: 執行一段 command 在已啟用的 Container
$ docker exec -it nginx /bin/bash # 這個要背起來
$ docker rmi docker.io/nginx # 刪掉image,i是指image
$ docker rm -f nginx

接下來…玩Docker的很重要的指令

<<天空之城>> 毀滅咒語~ 巴魯斯!!!!!!

$ docker rmi -f $(docker images -aq) # 刪除所有image,-f就是force啦
$ echo $(docker images -aq) # 列出所有image id
$ docker rm $(docker ps -a -q) # 刪除所有container,在macOS上亂玩的很重要

刪container之前要先停止container,就像正在開啟的word檔是刪不掉的
$ docker stop $(docker ps -a -q)
$ echo $(docker ps -a -q) # 列出所有container id
fc344ed3d222 83ada6712fb2

=========超重要的指令 end =========

上面的 docker run 只是起手式
回頭來補充 docker run 的其他參數
說不定熟練後,能串連所有招式,招與招之間轉換如行雲流水,讓對手難以找到破綻 = =
這些就很像k8s的pod,基本上類似的設定到時候又要學一次,而且更自由
(例如:用label當filter,這些配置寫成yaml檔)

docker run 之資源篇

--memory 512MB
--cpu-period=1000000 # 單位是micro second(10^(-3)秒)
--cpu-quota=500000
通常--cpu-period跟--cpu-quota使用上不直覺
--cpuset-cpus="0,1" # 指定使用cpu 0跟cpu 1
--cpu-shares=512 # cpu分配比例,如果2個container都是512,那滿載時就是50%、50%,這個較實用

docker run 之儲存篇

$ docker inspect -f '{{.Mounts}}' nginx # 找container nginx掛載的volumes
或
$ docker inspect -f '{{.Mounts}}' container's id

-v # host的資料夾 Mapping 到 Container 的資料夾
-v 後面接 host path: container path,如果沒給host path就會隨機亂掛到/etc/lib/docker/volumes/ooxxggyy....

-v /home/user1/storage:/storage 

2個container共享volumes

--volumes-from container1

個人覺得-v很重要,如果有時間的話,我會去詳讀官網的volumes文件(嗯…好心虛)
https://docs.docker.com/storage/volumes/

docker run 之網路篇

(範例引用自yangj26952大大的文章喔)

若2個container要連得到
--link container1 # 會自動加在container2的/etc/hosts裡,在container2裡ping container1
--net=none # container沒network interface
--net=host # 使用 Host 的 network interface,比較危險喔
--net=bridge # 預設的網路模式,會用host network interface裡的docker0
--net=container:container1 # 直接用container1的network ineterface

2個host的container要連得到(overlay network),透過consul

  • 假設把consul建在host1
  • 修改/etc/docker/daemon.json
{
 "live-restore": true,
 "group": "dockerroot", # 因為權限關係,要設dockerroot群組
 "hosts": [
   "unix:///var/run/docker.sock",
   "tcp://10.1.0.223:2375"
 ],
 "cluster-store": "consul://10.1.0.221:8500", # 要連接到 consul 的 service
 "cluster-advertise": "enp8s0:2375" # 取得 overlay 網路模式的連線資訊
}
  • 在host1開機時,就把consul跑起來
$ docker run -d -p 8500:8500 progrium/consul -server -bootstrap
$ docker network create -d overlay overlay1 # 建議建2個vm玩,否則你的mac會一堆network interface
$ docker run -it --name=container1 --net=overlay1 busybox # Host1建container1,ni給overlay1
  • host2 設定/etc/docker/daemon.json
{
 "live-restore": true,
 "group": "dockerroot", # 因為權限關係,要設dockerroot群組
 "hosts": [
   "unix:///var/run/docker.sock",
   "tcp://10.1.0.223:2375"
 ],
 "cluster-store": "consul://10.1.0.221:8500",
 "cluster-advertise": "enp8s0:2375"
}
  • 在 Host2 上,用 docker network ls 確認是否有連到 consul
    $ docker run -it --name=container2 --net=overlay1 busybox # 跑起來,在container2 ping container1

備份

$docker export nginx > nginx.tar # export好像是比較好的方式,另一種就忘記它吧~
$cat nginx.tar | docker import - import'sImageName

明天內容會包含

dockerfile
docker compose
docker-machine
docker private registry
docker registry's API


上一篇
day01_序
下一篇
day03_docker02_基礎工具
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

尚未有邦友留言

立即登入留言