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。
install docker
install docker on ubuntu- docker CE (community edition - free)
- docker EE (enterprise edition)
uninstall old versions
1
2
3
4
5apt-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.Set up the repository
update apt package & install package to allow apt to use a repository over HTTPS
1
2
3
4
5
6apt-get update
apt-get install \
ca-certificates \
curl \
gnupg \
lsb-releaseAdd 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
3echo \
"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
Install Docker Engine
update apt packeage & install the latest version of docker engine, containerd
1
2
3
4
5
6apt-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.iohello world
1
2
3
4
5
6docker run hello-world
# 會先檢查本地是否存在名為 hello-world的 image
# 找不到則會到hub 去找
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# 表示安裝成功檢查狀態
1
2systemctl status docker
# active確認版本
1
docker --version
若是使用非root 帳號操作,但希望此帳號在docker 中 可以不需要以sudo 來操作root 權限,可將此使用者加入docker
1
2sudo usermod -aG docker username
|-使用者名稱-|
若不是本地管理者,或是主機沒有足夠的資訊,或只是想要測試某些功能但不想要啟動linux vm
可以到這裡 進行操作可建立多台主機
可透過url 與其他共同開發者分享
限制四小時,時間到會自動刪除
測試 -> nginx
1
docker container run nginx
查看
1
2docker container ps
# 可看到nginx 被加入了
Lesson2-2
常用指令:
docker --version
查看版本docker version
取得更多資訊docker info
取得系統資訊,包含container及image的數量docker
ordocker help
可查看常用指令
image 命名規則:
host name/image name
若是官方的image,則只會有image name。
image 可在 docker hub 裡面搜尋;也可透過指令docker search keywords
搜尋。
tag 可以是數字或是名字,用以區別不同的版本,會有多個tags 但是都指向同一個image。
1 | docker image pull redis:5.0.10 |
若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
2docker container create -p 80:80 httpd
# |-指定port-|-image-| - docker container start這時我們可以透過瀏覽器搜尋主機外部ip,但不需要再指定port號(因為建立container 時已指定80 port),可以看到一樣的畫面(It works!)
1
2
3
4docker container ls -a
# 查看剛才建立的httpd Container ID 是多少
docker container start <container id>
# 執行
Lesson 2-3
- 透過docker nginx 執行網頁安裝完成後,可透過
1
2
3
4
5
6docker 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 有哪些
- httpd 監聽80port 也就是上一個步驟建立的
- nginx 監聽8080port 則是剛剛下的指令所建立的,此時於網頁輸入ip:8080 可以看到nginx 的預設頁面
今天的進度先到這邊,接下來會有更多的上課筆記。