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

Docker 學校內部教學之一

Kyle Bai
November 27, 2015

Docker 學校內部教學之一

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