【Docker教程】進入docker容器的外殼

(一)

1.瞭解Docker映像和容器之間的區別

Docker是用於輕鬆創建,部署和運行應用程序的工具。它允許我們使用所有依賴關係打包應用程序,並將它們作為單獨的分發包分發。Docker保證我們的應用程序將在每個Docker實例上以相同的方式運行。

當我們開始使用Docker時,我們需要明確兩個主要概念 - 圖像和容器

我們將瞭解它們是什麼以及它們之間的區別。

2. Docker鏡像

映像是代表打包的應用程序的文件,具有正確運行所需的所有依賴項。換句話說,我們可以說Docker映像就像Java類

圖像構建為一系列圖層。層被組裝在一起。那麼,什麼是層?簡而言之,層就是圖像。

假設我們要創建一個Hello World Java應用程序的Docker映像。我們需要考慮的第一件事是我們的應用程序需要什麼。

首先,它是一個Java應用程序,因此我們需要一個JVM。好的,這似乎很簡單,但是JVM需要運行什麼?它需要一個操作系統。因此,

我們的Docker映像將具有一個操作系統層,一個JVM和我們的Hello World應用程序

Docker的主要優勢在於其龐大的社區。如果要構建映像,可以轉到Docker Hub並搜索所需的映像是否可用。

假設我們要使用PostgreSQL數據庫創建一個數據庫。我們不需要從頭開始創建新的PostgreSQL映像。我們只是去Docker Hub,搜索postgres,這是PostgresSQL的Docker官方映像名稱,選擇我們需要的版本,然後運行它。

我們從Docker Hub創建或提取的每個映像都存儲在我們的文件系統中,並通過其名稱和標記進行標識。也可以通過其圖像ID進行標識

使用docker images命令,我們可以查看文件系統中可用的映像列表:

<code>$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 11.6 d3d96b1e5d48 4 weeks ago 332MB
mongo latest 9979235fc504 6 weeks ago 364MB
rabbitmq 3-management 44c4867e4a8b 8 weeks ago 180MB
mysql 8.0.18 d435eee2caa5 2 months ago 456MB
jboss/wildfly 18.0.1.Final bfc71fe5d7d1 2 months ago 757MB
flyway/flyway 6.0.8 0c11020ffd69 3 months ago 247MB
java 8-jre e44d62cf8862 3 years ago 311MB/<code>

3.運行Docker映像

使用帶有映像名稱和標籤的

docker run命令運行映像。假設我們要運行postgres 11.6圖像:

<code>docker run -d postgres:11.6/<code>
注意,我們提供了-d選項。這告訴Docker在後臺運行映像-也稱為分離模式。

使用docker ps命令,我們可以檢查映像是否正在運行,我們應該使用以下命令:

<code>$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3376143f0991 postgres:11.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp tender_heyrovsky/<code>

請注意上面輸出中的容器ID。讓我們看一下什麼是容器以及它與圖像的關係。

4. Docker容器

容器是圖像的實例。每個容器都可以通過其ID進行標識。回到我們的Java開發類比,我們可以說容器就像類的實例。

Docker為容器定義了七個狀態:創建重新啟動運行移除

暫停退出已死。這一點很重要。由於容器只是圖像的一個實例,因此它不需要運行。

現在,讓我們再次考慮上面已經看到的run命令。我們已經說過,它是用來運行圖像的,但這並不完全準確。事實是,運行命令用於創建 和啟動 圖像的新容器。

一大優勢是容器就像輕量級的VM。他們的行為是完全相互隔離的。這意味著我們可以運行同一圖像的多個容器,使每個容器處於不同的狀態,並具有不同的數據和不同的ID。

能夠同時運行同一圖像的多個容器是一個很大的優勢,因為它使我們能夠輕鬆地擴展應用程序。例如,讓我們考慮微服務。如果將每個服務打包為Docker映像,則意味著可以根據需要將新服務部署為容器。

5.容器生命週期

之前,我們提到了容器的七個狀態,現在,讓我們看看如何使用docker命令行工具來處理不同的生命週期狀態。

啟動新容器需要我們先

創建它,然後再啟動它。這意味著它必須先經過創建狀態,然後才能運行。我們可以通過顯式創建和啟動容器來做到這一點:

<code>docker container create <image>:
docker container start <container>
/<image>/<code>

或者我們可以使用run命令輕鬆地做到這一點:

<code>docker run <image>:/<image>/<code>

我們可以暫停一個正在運行的容器,然後再次將其置於運行狀態:

<code>docker pause <container>
docker unpause <container>/<container>/<code>

當我們檢查進程時,已暫停的容器將顯示“已暫停”作為狀態:

<code>$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bef2edcad7b postgres:11.6 "docker-entrypoint.s…" 5 minutes ago Up 4 minutes (Paused) 5432/tcp tender_heyrovsky/<code>

我們還可以停止正在運行的容器,然後重新運行它:

<code>docker stop <container>
docker start <container>/<container>/<code>

最後,我們可以刪除一個容器:

<code>docker container rm <container>/<code> 

只能刪除處於停止或創建狀態的容器。

(二)如何進入Docker容器的外殼

1.概述

我們知道Docker是一個易於創建,部署和運行應用程序的強大工具。

那麼,可以連接到容器的操作系統嗎?答案是:是的,現在我們將學習如何做。

2.連接到現有容器

如果要連接到現有容器,則應該使任何容器處於運行狀態。為此,我們必須使用docker ps命令檢查系統中的容器狀態:
<code>$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b9d83040f4a hello-world "/hello" 8 days ago Exited (0) 8 days ago dazzling_perlman
/<code>

由於我們沒有正在運行的容器,因此我們以啟動RabbitMQ容器為例:

<code>$ docker run -d rabbitmq:3
/<code>

啟動容器後,我們將從另一個對docker ps的調用中看到它:

<code>$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

b7a9f5eb6b85 rabbitmq:3 "docker-entrypoint.s…" 25 minutes ago Up 25 minutes 4369/tcp, 5671-5672/tcp, 25672/tcp trusting_bose

/<code>

現在連接到這個容器就像執行一樣簡單:

<code>$ docker exec -it b7a9f5eb6b85 sh
/<code>

至此,我們在容器內部有了一個交互式shell:

  • docker exec告訴Docker我們要在正在運行的容器中執行命令
  • 該-IT說法意味著它將在交互模式下執行-它使STIN開放
  • b7a9f5eb6b85是容器ID
  • sh是我們要執行的命令

讓我們探索一下我們新創建的容器的操作系統:

<code>$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic/<code>

它似乎是仿生海狸Ubuntu。如果檢查RabbitMQ Dockerfile中的FROM指令,我們將意識到該映像是使用Ubuntu 18.04構建的。

我們可以使用exit命令或僅按CTRL + d與容器斷開連接。

這個例子很簡單,因為當我們啟動RabbitMQ容器時,它一直運行直到停止它。另一方面,有時我們必須處理無法存活的容器,例如操作系統容器。

3.以交互模式運行容器

如果我們嘗試啟動一個新的操作系統容器,例如一個18.04 Ubuntu,我們將發現它並沒有存活:

<code>$ docker run ubuntu:18.04
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08c26636709f ubuntu:18.04 "/bin/bash" 10 seconds ago Exited (0) 7 seconds ago heuristic_dubinsky
b7a9f5eb6b85 rabbitmq:3 "docker-entrypoint.s…" About an hour ago Up About an hour 4369/tcp, 5671-5672/tcp, 25672/tcp trusting_bose
/<code>

RabbitMQ容器仍在運行時,Ubuntu容器已停止。因此,我們無法使用docker exec命令連接到此容器。

避免這種情況的一種方法是以交互方式運行此容器:

<code>$ docker run -it ubuntu:18.04
/<code>

因此,既然我們位於容器內,就可以檢查外殼類型:

<code>$ echo $0
/bin/bash
/<code>
實際上,當我們以交互方式啟動容器時,使用–rm參數很方便。退出時,請確保刪除容器:
<code>$ docker run -it --rm ubuntu:18.04
/<code>

4.保持容器運行

有時,我們會遇到一些奇怪的情況,需要啟動並連接到容器,但是交互模式不起作用。

如果我們遇到這些情況之一,可能是因為出了點問題,應予以糾正。

但是,如果需要快速解決方法,可以在容器中運行tail命令:

<code>$ docker run -d ubuntu:18.04 tail -f /dev/null
/<code>

使用此命令,我們將以分離/後臺方式(-d)啟動一個新容器,並在容器內執行tail -f / dev / null命令。結果,這將迫使我們的容器永遠運行。

現在,我們只需要使用docker exec命令以以前看到的相同方式進行連接:

<code>$ docker exec -it CONTAINER_ID sh
/<code>

請記住,這是一種解決方法,應僅在開發環境中使用。

5.結論

在本教程中,我們已經看到了如何連接到正在運行的容器的外殼,以及如何以交互方式啟動容器。

6.最後

歡迎大家討論,喜歡的話可以關注收藏,以後會持續為大家更新優質內容。
往期內容:



分享到:


相關文章: