Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker 學校內部教學之一

Avatar for Kyle Bai Kyle Bai
November 27, 2015

Docker 學校內部教學之一

Avatar for Kyle Bai

Kyle Bai

November 27, 2015
Tweet

More Decks by Kyle Bai

Other Decks in Technology

Transcript

  1. 什什麼是 Docker? !2 Docker 是⼀一個開源專案,誕⽣生於 2013 年年初,最初是 dotCloud 公司內部的⼀一個業餘專案。它基於 Google

    公司推出的 Go 語 ⾔言實作。 專案後來來加入了了 Linux 基⾦金金會,遵從了了 Apache 2.0 協議,原始碼在 GitHub 上進⾏行行維護。
  2. Docker 是新技術? !3 Docker 專案的⽬目標是實作輕量量級的作業系統虛擬化解決⽅方案。 Docker 的基礎是 Linux 容器(LXC)等技術。好比 namespaces、cgroups、Another

    UnionFS(AUFS)等。並在 LXC 的基礎上 Docker 進⾏行行了了進⼀一步的封裝,讓使⽤用者不需 要去關⼼心容器的管理理,使得操作更更為簡便便。
  3. NAMESPACES VS. CGROUPS !7 Namespaces provide isolation: •pid (processes) •net

    (network interfaces, routing...) •ipc (System V IPC) •mnt (mount points, filesystems) •uts (hostname) •user (UIDs) Control groups control resources: •cpu (CPU shares) •cpusets (limit processes to a CPU) •memory (swap, dirty pages) •blockio (throttle reads/ writes) •devices •net_cls, net_prio: control packet class and priority
  4. Docker Images !10 Docker 映像檔就是⼀一個唯讀的模 板。 Docker 映像檔會儲存⼀一個系統當 下的狀狀態; 與

    VM 比較不同是, VM可以有許多執⾏行行中的服務, Docker 則只是檔案系統儲存狀狀態。
  5. Docker version and info !15 顯⽰示版本: $ docker -v $

    docker version Docker version 1.9.0, build 76d6bc9 列列出 docker 服務的設定值,如執⾏行行驅動、儲存驅動等: $ docker info Containers: 7 Images: 108
  6. 取得 images !16 取得⼀一個 hello-world 的 image: $ docker pull

    hello-world b901d36b6f2f: Pull complete … P.S ⼀一般不加入指定版本號,會抓 latest 版本 取得⼀一個指定版本的 docker image: $ docker pull ubuntu:14.04 P.S 若若環境沒有該 Image 就會去 docker 倉庫上找尋。
  7. 執⾏行行⼀一個 Container !17 執⾏行行 Hello-world Container: $ docker run hello-world

    Hello from Docker. …. 執⾏行行⼀一個 Ubuntu Container $ docker run ubuntu:14.04 /bin/echo 'Hello world’ $ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
  8. 列列出 Container 資訊與 log !18 當⼀一個 Container 被執⾏行行後,可以⽤用以下指令查看 ps: $

    docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 139218fe7bd4 hello-world "/hello" 22 minutes ago Exited (0) 21 minutes ago angry_pike P.S -a 為印出所有包含停⽌止的容器, -q 只顯⽰示 ID, -s 顯⽰示暫⽤用⼤大⼩小, -l 最新容 器, -n=“” 要顯⽰示幾個容器, -before=“” 顯⽰示特定名稱之前,-after=“” 之後。 $ docker logs --tail <Container_ID>
  9. 與 Docker 互動 !19 Container 被執⾏行行後,透過以下進⾏行行互動: $ docker exec -t

    -i <Container_ID> root@cbddb5419e5a:/# P.S -t 配置⼀一個虛擬終端機, -i 為互動模式 也可以直接執⾏行行並互動: $ docker run --rm -t -i --name=“my-ubuntu” ubuntu:14.04 /bin/bash P.S --rm 執⾏行行完成後移除, --name 為 container 名稱
  10. Stop、Start、Restart 與 Remove !20 當要暫停該 Container 時,可以⽤用: $ docker stop

    <Container_ID> P.S 若若加入 -t 可以設定等待時間 若若想再啟動該 Container 時,可以⽤用: $ docker start <Container_ID> $ docker restart <Container_ID> 若若想刪除該 Container 時,可以⽤用: $ docker rm <Container_ID> $ docker ps -a -q | xargs docker rm
  11. 查閱 Docker Container 資訊與⾏行行程 !21 檢閱指令可以列列出容器或映像檔的詳細資訊,回應的格式是⼀一個 JSON: $ docker inspect

    <Container_ID> $ docker inspect -f ‘{{.NetworkSettings.IPAddress}}’<Container_ID> P.S 加入 -f 可以使⽤用 GO 語⾔言的板模表⽰示法 查看⾏行行程資訊可以使⽤用以下: $ docker top <Container_ID>
  12. 登入 Docker Hub 使⽤用以下指令登入⾃自⼰己的 docker hub 帳號: $ docker login

    Username : test 使⽤用以下指令登出⾃自⼰己的 docker hub 帳號: $ docker logout !24
  13. 修改⼀一個 Image 執⾏行行⼀一個 Ubuntu Container: $ docker run -idt ubuntu:14.04

    f5f8dc8cd20c646d560b2aa553c3 進入⼀一個 Ubuntu Container: $ docker exec -ti <contianer_id> bash !25
  14. 安裝相關套件 執⾏行行 apt-get 安裝 apache2與 sshd 套件: $ apt-get install

    -y apache2 openssh-server vim 離開 container 輸入以下指令,確認本 container 修改哪些: $ docker diff <container_id> C /var/log/faillog C /var/log/lastlog A /var/www A /var/www/html A /var/www/html/index.html !26
  15. 新增 boot_run 檔案 再次進入 Container,新增⼀一個檔案 boot_run.sh 於 /etc ⽬目錄底下,內容如下: !27

    #!/bin/bash CMD=${1:-"exit 0"} if [[ "$CMD" == "-d" ]]; then service apache2 start /usr/sbin/sshd -D -d else /bin/bash -c "$*" fi 在 container 裡⾯面修改 boot_run.sh 權限: $ chown root.root /etc/boot_run.sh $ chmod 700 /etc/boot_run.sh
  16. 設定 sshd 在 container 裡執⾏行行以下指令: $ mkdir /var/run/sshd $ echo

    'root:123456' | chpasswd $ sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config $ sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd $ echo "export VISIBLE=now" >> /etc/profile !28
  17. 驗證 boot_run.sh 檔案 在 container 裡⾯面執⾏行行剛建立的 script : $ /etc/boot_run.sh

    -d Set /proc/self/oom_score_adj from 0 to -1000 debug1: Bind to port 22 on 0.0.0.0. Server listening on 0.0.0.0 port 22. debug1: Bind to port 22 on ::. Server listening on :: port 22. 成功的話會看到以上資訊 !29
  18. 從修改的 container 建立新 image 離開 container,執⾏行行以下指令來來提交修改: $ docker commit -m

    "Add apache2 and sshd ..." <container_id> 3d2d0c1af482a206abf8b581e4 P.S 可以在後⾯面接著加入 tag 名稱, 如 kairen/apache:1.0.0 使⽤用 docker images,會看到⼀一個 <none> 或是 tag 名稱的映像檔: REPOSITORY TAG <none> <none> 使⽤用 docker tag 改變名稱: $ docker tag <image_id> !30
  19. 驗證新的 images 透過 run 來來驗證新的 image 是否成功建立: $ docker run

    -d -p 8080:80 -p 10022:22 --name apache2 kairen/ apache2:1.0.0 /bin/sh -c "/etc/boot_run.sh -d" P.S /etc/boot_run.sh 的 -d 是我們設定的參參數,參參考前⾯面 script 可以⽤用以下指令來來查看有哪些 port 被映射到該主機: $ docker port <container_id> 22/tcp -> 0.0.0.0:10022 80/tcp -> 0.0.0.0:8080 !31
  20. 驗證 apache2 與 ssh 透過 browser 輸入 8080 port 來來觀看是否有網⾴頁。

    透過 ssh client 來來驗證 sshd 成功啟動: $ ssh -p 10022 [email protected] [email protected]'s password: 確認沒問題後,可以使⽤用 stop 與 rm 刪除該 container: $ docker stop <container_id> && docker rm <container_id> !32
  21. 上傳⾄至 Docker hub 當完成 docker image 建置後,就可以上傳⾄至 docker hub: $

    docker push kairen/apache2:1.0.0 The push refers to a repository [docker.io/kairen/apache2] (len: 1) 3d2d0c1af482: Pushing [=============================================> ] 74.99 MB/83.1 MB 完成後,可以使⽤用以下指令查找⾃自⼰己的 image: $ docker search kairen // 查所有作者為 kairen $ docker search kairen/apache2 // 查作者為 kairen, 名稱為 apache2 !33
  22. 儲存與載入 images 當完成 docker image 建置後,也可以透過匯出⽅方式給其他⼈人使 ⽤用: $ docker save

    kairen/apache2:1.0.0 > kairen-apache2.tar $ docker save -o kairen-apache2.tar kairen/apache2:1.0.0 載入⼀一個 image 可以使⽤用以下⽅方式: $ docker load < kairen-apache2.tar $ docker load --input kairen-apache2.tar !34
  23. 匯出與匯入 images 當執⾏行行⼀一個 container 時,可以匯出當下快照狀狀態: $ docker export <container_id> >

    ubuntu.tar 可以使⽤用 docker import 從容器快照檔案中再匯入為映像檔,例例如: $ cat ubuntu.tar | docker import - kairen/ubuntu:14.04 也可以使⽤用 url ⽅方式來來 import: $ docker import http://example.com/exampleimage.tgz example/ imagerepo !35