Linux Administration Build 5 Hands-On Linux Projects 2022 Docker篇(二)

延續上一篇,我們在Digital Ocean上面開了一台Ubuntu 的主機,接下來會在主機上安裝Docker,
並學習Docker 的操作語法。

Lesson2-1 Docker

  • docker container 與 vm
    Container屬於應用層的虛擬化容器,而VM 則是作業系統的容器,
    或可以想成 Container 是實作(實例化)了執行環境,而VM 則是實作(實例化)了作業系統。
    換句話理解,Container封裝了應用程式的執行環境,而VM是配製好CPU、RAM、Storage 的作業環境。
    所以說Container就是一種可以搬遷與重複利用的執行環境,提高了環境建置、專案部屬的速度,
    比方說開發人員在自己的電腦開發,其環境為centOS 8 + Nginx + Mysql + PHP7.4,上測試環境時需要再主機上重現一樣的環境,
    未來上正式機時也需要再做一次一樣的操作。
    此時若透過docker 來建置環境,只需要幾個指令就可以將一樣的環境複製到不同的主機上。

但是值得注意的是,容器並不是用來取代VM,而是與VM共存。
今天我們透過VM開了一個作業系統,但仍然需要建立專案所需的環境,所以可以透過Container來快速建置。
又因為Container 之間彼此獨立存在的特性,所以我們可以在同一個VM下,分別執行不同版本的專案,
例如Container1是php 7.0,而Container2 則是 php 7.4。

  1. uninstall old versions

    1
    2
    3
    4
    5
    apt-get remove docker docker-engine docker.io containerd runc
    # sudo 取決於登入的角色
    # E: Unable to locate package docker-engine (可能會顯示這個訊息)
    # apt-get remove docker docker.io containerd runc (後來改成這段,拿掉 docker-engine)
    # 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  2. Set up the repository

    • update apt package & install package to allow apt to use a repository over HTTPS

      1
      2
      3
      4
      5
      6
      apt-get update
      apt-get install \
      ca-certificates \
      curl \
      gnupg \
      lsb-release
    • Add Docker Official GPG keys

      1
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    • set up the stable repository

      1
      2
      3
      echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  3. Install Docker Engine

    • update apt packeage & install the latest version of docker engine, containerd

      1
      2
      3
      4
      5
      6
      apt-get update
      sudo apt-get install docker-ce docker-ce-cli containerd.io

      # 或是指定版本
      # apt-cache madison docker-ce (查看)
      # apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
    • hello world

      1
      2
      3
      4
      5
      6
      docker run hello-world
      # 會先檢查本地是否存在名為 hello-world的 image
      # 找不到則會到hub 去找
      # Hello from Docker!
      # This message shows that your installation appears to be working correctly.
      # 表示安裝成功
    • 檢查狀態

      1
      2
      systemctl status docker
      # active
    • 確認版本

      1
      docker --version
    • 若是使用非root 帳號操作,但希望此帳號在docker 中 可以不需要以sudo 來操作root 權限,可將此使用者加入docker

      1
      2
      sudo usermod -aG docker username
      |-使用者名稱-|
  4. 若不是本地管理者,或是主機沒有足夠的資訊,或只是想要測試某些功能但不想要啟動linux vm
    可以到這裡 進行操作

    • 可建立多台主機

    • 可透過url 與其他共同開發者分享

    • 限制四小時,時間到會自動刪除

    • 測試 -> nginx

      1
      docker container run nginx
    • 查看

      1
      2
      docker container ps
      # 可看到nginx 被加入了

Lesson2-2

常用指令:

  • docker --version 查看版本
  • docker version取得更多資訊
  • docker info 取得系統資訊,包含container及image的數量
  • docker or docker help 可查看常用指令

image 命名規則:

host name/image name

若是官方的image,則只會有image name。

image 可在 docker hub 裡面搜尋;也可透過指令docker search keywords 搜尋。

tag 可以是數字或是名字,用以區別不同的版本,會有多個tags 但是都指向同一個image。

1
2
docker image pull redis:5.0.10
# |-image-|-tag-|

若pull 的時候不指定tag,則會下載最新的版本。

若沒有安裝直接下docker container run,則會透過docker hub 下載並執行

1
docker container run -P httpd

若要測試httpd 是否被安裝且執行,可以透過網頁輸入此主機對外ip,(digital ocean上可以找到,或是透過指令 ip address 找到)
不過這個時候會看到無法連線,這是因為沒有對外暴露80port,而是用隨機port 指向80port,可以利用 docker container ls (需要開啟另一個cli 視窗)看到運作中的container 正在使用哪一個port 號,補上之後就可以顯示運作中了!

若要中斷執行中的container,只要按下 ctrl + C 即可。

docker container run,背後執行了兩件事情,我們將其拆開來做

  • docker container create
    1
    2
    docker container create -p 80:80 httpd
    # |-指定port-|-image-|
  • docker container start
    1
    2
    3
    4
    docker container ls -a
    # 查看剛才建立的httpd Container ID 是多少
    docker container start <container id>
    # 執行
    這時我們可以透過瀏覽器搜尋主機外部ip,但不需要再指定port號(因為建立container 時已指定80 port),可以看到一樣的畫面(It works!)

Lesson 2-3

  • 透過docker nginx 執行網頁
    1
    2
    3
    4
    5
    6
    docker container run -d -p 8080:80 --name mysite nginx
    # -d 將執行程序抽離出來,於背景執行形成
    # -p 8080:80 將容器的80 port 暴露在 docker主機的8080port
    意指 nginx container 會監聽80 port, 但是user 則需透過主機ip 的8080port 來進入
    # --name mysite 為container 取名(若無則會隨機給)
    # nginx 是image 的名稱
    安裝完成後,可透過container ls查看目前正在執行的container 有哪些
  1. httpd 監聽80port 也就是上一個步驟建立的
  2. nginx 監聽8080port 則是剛剛下的指令所建立的,此時於網頁輸入ip:8080 可以看到nginx 的預設頁面

今天的進度先到這邊,接下來會有更多的上課筆記。