1、Docker 基本概念 什麼是 Docker? Docker 是一個開源的容器化平臺,允許開發者封裝他們的應用程式及其所有依賴項到一個標準化的單元中,這個單元被稱為“容器”。容器可以在任何支持 Docker 的環境中運行,從而確保應用程式的可移植性和一致性。 Docker 的優勢 一致性和可移植 ...
1、Docker 基本概念
什麼是 Docker?
Docker 是一個開源的容器化平臺,允許開發者封裝他們的應用程式及其所有依賴項到一個標準化的單元中,這個單元被稱為“容器”。容器可以在任何支持 Docker 的環境中運行,從而確保應用程式的可移植性和一致性。
Docker 的優勢
- 一致性和可移植性:Docker 容器在任何支持 Docker 的平臺上都能運行,確保開發和生產環境的一致性。
- 資源隔離和控制:容器使用系統的資源而不是虛擬化,因此更高效,且提供了資源隔離和分配控制。
- 快速部署和啟動:容器的啟動速度非常快,通常只需要幾秒鐘。
- 簡化依賴管理:容器包含了應用程式運行所需的所有依賴,減少了“在我的機器上可以工作”的問題。
Docker 結構
- 鏡像(Image):一個 Docker 鏡像是一個只讀的模板,包含了運行某個應用程式所需的所有依賴、庫、配置文件等。鏡像可以用來創建容器。
- 容器(Container):容器是鏡像的一個運行實例。它是一個輕量級、獨立的可執行包,包含了軟體運行所需的所有內容。
- Dockerfile:一個文本文件,包含了創建 Docker 鏡像的所有命令。通過編寫 Dockerfile,開發者可以定義鏡像的內容和行為。
- Docker Hub:一個雲端的 Docker 鏡像庫,用戶可以從中拉取公共鏡像或上傳自己的鏡像。
安裝 Docker 後,Docker 本身是一個平臺或工具,它提供了運行容器的能力。但要運行具體的應用程式或服務,需要使用 Docker 鏡像。鏡像和 Docker 平臺之間的關係可以類比為軟體和操作系統之間的關係:
總結
- Docker 平臺提供了運行和管理容器的能力,但不包含具體的應用程式。
- Docker 鏡像是具體應用程式的封裝,包含了應用程式運行所需的一切內容。
- Docker 容器是鏡像的運行實例,提供了一個獨立的運行環境。
2、Docker 安裝
參考我這篇文章中的 安裝docker。
3、Docker 常用命令
文章中的 CONTAINER
表示容器的 id 或 name
鏡像管理(Images)
-
拉取鏡像
docker pull ubuntu:20.04 # 這個命令從 Docker Hub 拉取名為 `ubuntu` 且標簽為 `20.04` 的鏡像。
-
列出鏡像
docker images
列出本地所有可用的 Docker 鏡像。
-
刪除鏡像
docker image rm ubuntu:20.04 # 刪除本地名為 `ubuntu:20.04` 的鏡像。
或
docker rmi ubuntu:20.04 # 刪除本地名為 `ubuntu:20.04` 的鏡像。
-
提交容器為新鏡像
docker commit CONTAINER IMAGE_NAME:TAG # 將一個正在運行的容器 `CONTAINER` 提交為一個新的鏡像 `IMAGE_NAME:TAG`。
-
保存鏡像到本地文件
docker save -o ubuntu-20.04.tar ubuntu:20.04 # 將 `ubuntu:20.04` 鏡像導出到本地文件 `ubuntu-20.04.tar` 中。
-
從本地文件載入鏡像
docker load -i ubuntu-20.04.tar # 從本地文件 `ubuntu-20.04.tar` 中載入鏡像 `ubuntu:20.04`。
容器管理(Containers)
-
創建容器
docker create -it ubuntu:20.04 # 使用鏡像 `ubuntu:20.04` 創建一個容器。
-
查看容器
docker ps -a # 查看本地所有容器(包括運行中和停止的)。
-
啟動容器
docker start CONTAINER # 啟動一個停止的容器 `CONTAINER`。
-
停止容器
docker stop CONTAINER # 停止一個運行中的容器 `CONTAINER`。
-
重啟容器
docker restart CONTAINER # 重啟一個容器 `CONTAINER`。
-
創建並啟動容器
docker run -p 20000:22 --name mycontainer -itd ubuntu:20.04 # 使用 `ubuntu:20.04` 鏡像創建並啟動一個容器 # -p 20000:22 指的是它將容器內的埠 22(通常是 SSH 服務埠)映射到主機的埠 20000 # --name 重命名 # 也可以不加 -p --name 及 後面的參數
-
進入到容器
docker attach CONTAINER # 附加到一個運行中的容器。按 `Ctrl + p`,再按 `Ctrl + q` 可以退出容器而不停止它。
-
在容器中執行命令
docker exec CONTAINER COMMAND # 不進入運行中的容器 並且執行命令 `COMMAND`。
-
刪除容器
docker rm CONTAINER # 刪除一個容器 `CONTAINER`。
-
刪除所有停止的容器
docker container prune # 刪除所有已停止的容器。
-
導出容器到本地文件
docker export -o xxx.tar CONTAINER # 將容器 `CONTAINER` 導出到本地文件 `xxx.tar` 中。
-
從本地文件導入容器
docker import xxx.tar image_name:tag # 從本地文件 `xxx.tar` 中導入為鏡像 `image_name:tag`。
-
查看容器進程
docker top CONTAINER # 查看容器 `CONTAINER` 中的進程。
-
查看容器資源使用
docker stats # 查看所有容器的統計信息,包括 CPU、記憶體、網路等。
-
複製文件
docker cp CONTAINER:xxx xxx # 在本地(鏡像)和容器之間複製文件。
-
重命名容器
docker rename CONTAINER NEW_NAME # 重命名容器 `CONTAINER` 為 `NEW_NAME`。
-
更新容器資源限制
docker update CONTAINER --memory 500M --memory-swap 1G # memory: 容器可用的記憶體上限。 # memoryswap: 容器可用的總記憶體,包括交換空間。如果沒有顯式設置,memoryswap 預設為 memory 的兩倍。 # 修改容器 `CONTAINER` 的記憶體限製為 500M。
通過這些命令,我們可以有效地管理 Docker 鏡像和容器,滿足各種開發和部署需求。
4、Docker 應用示例
下麵我們演示 在 docker
的一個容器裡面配置一個 ssh
登陸, 相當於是在自己的遠程雲伺服器裡面通過 docker
創建了一個容器 (虛擬機)
這個示例非常常用, 我們之後開發一般會把項目部署到 docker
的容器里, 本地連接雲端伺服器的 docker的容器 就需要用到 ssh
。
1、下載一個ubuntu鏡像
docker pull ubuntu:20.04
# 這裡我用的 20.04
2、基於 下載的鏡像 創建一個容器
docker run -p 20000:22 --name test1 -itd ubuntu:20.04
# -p 20000:22 指的是它將容器內的埠 22(通常是 SSH 服務埠)映射到主機的埠 20000。(本機也就是當前的伺服器)
3、進入到創建的容器
docker attach test1
4、設置這個容器的 root 密碼
passwd
5、下載ssh服務
# 下載
apt update
apt install -y openssh-server
# 編輯配置文件(預設是ssh配置文件不允許以root用戶登陸)
vim /etc/ssh/sshd_config
# 在 sshd_config中添加如下內容
PermitRootLogin yes
PasswordAuthentication yes
# 上面兩個內容分別是允許 ssh以 root 用戶登陸 和 啟用了密碼認證
# 啟動ssh服務
service ssh start
# 查看是否啟動
service ssh status
6、遠程伺服器登陸登陸
Ctrl + p 然後按 Ctrl + q 掛起這個容器
# 在本機 ssh 登陸
ssh root@localhost -p 20000
# ssh 連接本機的 20000 埠, 因為我們創建的 docker 容器的22埠給改成 20000埠了
至此,我們完成了在本機伺服器登陸本機docker的容器
下麵我們繼續, 讓 本地電腦 直接登錄到 遠程伺服器的docker容器里。(這裡說的 本地電腦 指自己的沒有公網ip的電腦,本機、遠程伺服器 指的是我們租的有公網ip的電腦)
7、開放 伺服器的20000埠
8、本地連接 伺服器的容器
# root 是因為我們伺服器的那個容器預設是一個root用戶, 我們還沒有給他創建其他用戶
# 把 127.0.0.1 改成你伺服器的 公網ip
ssh [email protected] -p 20000
常見問題 : 你伺服器的docker的那個容器沒有打開,讓那個 容器 處於開啟狀態
至此已經完成了本地直連伺服器的 docker
容器。簡化本地登陸 可以參看我這篇文章 -> 地址 (文章 2、3節講的就是簡化登錄和免密登陸)
完結,覺得不錯的可以點個贊