Docker修煉之旅(一)—— Docker一些基本命令


title: Docker修煉之旅(一)
date: 2019-06-25 16:48:48
tags:
- Docker
categories:
- Study
- Docker


Docker學(xué)習(xí)過程的一些記錄


前言

之前對Docker只停留在用的層面上,只會用docker-compose一鍵部署,偶爾也會對Dockerfile進(jìn)行一些修改,但每次改都要查半天搜索引擎才會。所以決定系統(tǒng)學(xué)習(xí)下Docker,補充下自己的知識。
主要參考的是:《第一本Docker書》,當(dāng)做學(xué)習(xí)筆記來寫吧。


Docker容器概念

Docker容器(Container)類似于一個輕量級的沙箱子(因為Docker是基于Linux內(nèi)核的虛擬技術(shù),所以消耗資源十分少),Docker利用容器來運行和隔離應(yīng)用。

容器是從鏡像創(chuàng)建的應(yīng)用運行實例,可以將其啟動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。

可以吧每個容器看作一個簡易版的Linux系統(tǒng)環(huán)境(包括了root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間),以及與運行在其中的應(yīng)用程序打包而成的應(yīng)用盒子。

鏡像自身是只讀的。容器從鏡像啟動的時候,Docker會在鏡像的最上層創(chuàng)建一個可寫層,鏡像本身將保持不變。就像用ISO裝系統(tǒng)之后,ISO并沒有什么變化一樣。

容器就相當(dāng)于鏡像的實例化,我們可以認(rèn)為,鏡像是Docker生命周期的構(gòu)建或打包階段,而容器則是啟動或執(zhí)行階段,具體關(guān)系如下圖


image

創(chuàng)建第一個容器

安裝啟動好docker后,先可以通過docker info命令查看docker的一些配置信息,如所有容器和鏡像的數(shù)量等

image

然后通過docker run命令創(chuàng)建容器,docker run命令提供了Docker容器的創(chuàng)建到啟動過程。我們使用docker run -i -t ubuntu /bin/bash命令我們的第一個容器,這句命令的解釋如下

首先告訴Docker執(zhí)行docker run命令,并且指定了 -i -t兩個參數(shù)。
-i保證容器中的STDIN是開啟的,盡管我們沒有附著(docker attach命令)到容器中。持久的標(biāo)準(zhǔn)輸入是交互式shell的”半邊天",這里說下自己的理解,這個-i參數(shù)意思應(yīng)該就是把STDIN開起來,然后我們就可以通過可以與容器交互,輸入命令執(zhí)行。
-t參數(shù)告訴Docker為要創(chuàng)建的容器分配一個偽tty終端,這樣,新創(chuàng)建的容器才能提供一個交互式shell。
若要在命令行下創(chuàng)建一個我們能與之進(jìn)行交互的容器,這兩個參數(shù)算是最基本的參數(shù)了。
接下來,我們告訴Docker基于什么鏡像來創(chuàng)建容器,這里使用的是ubuntu,這是一個基礎(chǔ)鏡像,保存在Docker Hub Registry上,這里指定鏡像后,Docker會先檢查本地有沒有該鏡像,沒有的話就連接到官方維護(hù)的Docker Hub Registry上查找,找到后下載至本地。然后Docker在文件系統(tǒng)內(nèi)部用這個鏡像創(chuàng)建一個新容器,該容器有自己的網(wǎng)絡(luò)、IP地址,以及一個用來和宿主機(jī)進(jìn)行通信的橋接案例接口
最后的/bin/bash告訴Docker在新容器中要運行什么命令,這里的/bin/bash命令是啟動了一個Bash shell

image

使用容器

上一步,我們利用ubuntu鏡像創(chuàng)建并打開了一個容器,我們可以在里面執(zhí)行命令,使用下我們的容器。

image

不僅能執(zhí)行本地命令,需要網(wǎng)絡(luò)連接的命令也能執(zhí)行。我們可以使用apt-get命令,安裝下vim apt-get update && apt-get install vim
image


給容器命名

我們可以通過鍵入exit來退出當(dāng)前容器,然后用docker ps命令查看本地的容器。

docker ps列出正在運行的容器
docker ps -a列出所有的容器
docker ps -l列出最后一次運行的容器,包括正在運行的或已經(jīng)的停止的。
docker ps -n x x是數(shù)字,表示列出最新幾次運行的容器

這里我們用docker ps -l命令列出剛剛退出的容器,如下圖

image

從上面圖片可以看到,容器的名稱是一個隨機(jī)的名稱,這是由于我們之前創(chuàng)建容器的時候沒有指定名稱,所以Docker給容器自動生成一個隨機(jī)名稱。按理說名稱指不指定不怎么重要,因為可以通過容器ID進(jìn)行指定。不過實際使用中,肯定是用名稱比較方便。所以我們這里介紹下怎么在創(chuàng)建的時候指定名稱。我們可以在docker run命令中用--name標(biāo)志指定
docker run --name Docker_study -i -t ubuntu /bin/bash

image


重新啟動停止的容器

上一步中,為了查看docker ps -l命令,我們退出了容器,那么該怎么重新啟動該容器呢。
我們使用docker start命令,docker start <容器名稱> docker start <容器ID>都可以開啟容器。
如我這里容器名稱是Docker_study,于是用docker start Docker_study啟動停止的容器。

image


附著到容器上

我們可以看到上一步的截圖,使用docker start重新啟動了容器后,容器成功運行,但是我們并沒有進(jìn)入到之前的交互式shell中。這時候我們就可以利用docker attach命令附著進(jìn)入容器,這里我們的命令是docker attach Docker_study

image

創(chuàng)建守護(hù)式容器

上面創(chuàng)建的都是交互式容器,我們也可以創(chuàng)建長期運行的容器,名叫守護(hù)式容器,沒有交互式會話,非常適合運行應(yīng)用程序和服務(wù),大多數(shù)時候我們都需要以守護(hù)式模式運行我們的容器,如之前我搭的CTF題目,都是基于守護(hù)式模式。下面我們就創(chuàng)建一個守護(hù)式容器。使用下面命令:
docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-d參數(shù)表示將容器放在后臺運行
-c參數(shù)表示容器要執(zhí)行的命令
這里執(zhí)行的命令是每隔一秒循環(huán)輸出hello world

執(zhí)行完后,通過docker ps查看是否運行,可以看到運行成功

image


查看容器內(nèi)部都在干什么——日志

我們上面創(chuàng)建了一個守護(hù)式容器,根據(jù)創(chuàng)建時的命令,容器會循環(huán)輸出hello world,但我們怎么查看它是否執(zhí)行呢。這時候就用到了docker logs命令
可以使用docker logs <容器名稱或ID>查看容器日志,會返回最后幾條日志。

image

我們還可以通過使用 -f 參數(shù)實施監(jiān)控Docker日志,與tail -f命令類似
image

還可以加別的參數(shù),使日志輸出更加規(guī)范

--tail 10 獲取日志最后10行
--tail 0 -f跟蹤容器最新日志
-t 為每條日志加上時間戳,便于分析


查看容器的進(jìn)程

使用docker top命令,可以查看到容器內(nèi)部運行的進(jìn)程。

image


在容器內(nèi)部運行進(jìn)程

在Docker 1.3之后,可以通過docker exec命令在容器內(nèi)部額外啟動新進(jìn)程??梢酝ㄟ^追加-d或-t -i參數(shù)指定啟動的進(jìn)程類型是后臺任務(wù)還是交互式任務(wù)。
如我們用docker exec -d daemon_save touch miracle778.txt,新建一個文件
然后用docker exec -i -t daemon_save /bin/bash打開一個交互式shell

image

可以看到, 在新打開的shell里面輸入ls命令,找到了新建的miracle778.txt文件


容器的停止、重啟

可以使用docker start|stop|restart <容器名或ID>啟動|停止|重啟容器。
另外,可以在創(chuàng)建容器的時候指定 --restart標(biāo)志,使容器在因為錯誤情況退出的情況下,根據(jù)--restart標(biāo)志指定的行為和容器錯誤代碼判斷是否重啟容器。--restart標(biāo)志取值說明如下

--restart=always 表示無論容器退出代碼是什么,都自動重啟容器
--restart=on-failure 這樣的話,只有容器的退出代碼非0時才會自動重啟
此外on-failure還接受一個可選的重啟次數(shù)
--restart=on-failure:7 表示,在容器的退出代碼為非0時,自動重啟容器,最多重啟7次
--restart標(biāo)志是docker1.2.0后引入的選項


深入容器

除了用docker ps獲取容器的信息外,我們還可以使用docker inspect來獲取容器的更多信息

image

docker inspect命令會對容器進(jìn)行詳細(xì)的檢查,然后返回其配置信息,包括名稱、命令、網(wǎng)絡(luò)配置以及很多有用的數(shù)據(jù)。同時也可以指定-f或--format標(biāo)志選定查看結(jié)果
這個命令我目前并沒有怎么用到,不過還是記一下。


刪除容器

當(dāng)容器不用的時候,可以通過docker rm刪除已經(jīng)停止的容器。
另外提一下,現(xiàn)在沒有辦法一次刪除所有容器,不過可以用另一種小技巧達(dá)到目的

docker rm `docekr ps -a -q`
這里把docker ps -a -q的結(jié)果傳給docker rm命令
docker ps -a -q命令是列出所有容器的ID

總結(jié)

這一篇主要是對Docker容器的一些操作,用了一些docker的命令

docker run  | docker stop  | docker start  | docker restart | docker exec 
docker top  | docker logs  | docker attach | docker inspect | docker rm

其他的一些命令可以參考:簡書:Docker命令
或者直接找官方文檔:Docker官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容