7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. DevOps

Docker由零開始:使用容器,第二部

Scroll to top
Read Time: 2 mins
This post is part of a series called Docker from the Ground Up: Working with Containers.
Docker From the Ground Up: Working With Containers, Part 1

Chinese (Traditional) (中文(繁體)) translation by Qiang Ji (you can also view the original English article)

這是關於如何使用容器兩部系列裡的第二部。在第一部中,我們專注於運行鏡像的多種方法和選項,以及主機如何與Docker容器進行交互。

在這部分中,我們將介紹如何列出,啟動,停止和重新啟動容器以及執行運行容器的命令。特別地,你將了解運行容器和停止(退出)容器之間的區別,以及當你通過過濾和格式化功能列出容器時如何精確控制信息和顯示。

然後,你將擁有停止,啟動,重新啟動和連接容器的實際操作體驗。最後,你會運行一次性命令,並學到如何對正在運行的容器進行交互式shell訪問。

在我們開始之前,請確認Docker已被正確地安裝在你的環境中。根據安裝的方式和你當前的用戶,你也許需要用sudo命令去運行它。而我將會在此教程中略過sudo的使用。

顯示容器列表

當使用容器時,你常常想要列出,查看和過濾你的容器。 docker ps命令可以為你做這些,它還有幾個有趣的選項。

運行容器

最基本的命令就是不帶參數的簡單的docker ps,它顯示所有當前正在運行的容器。

你會獲得每個容器的信息,這包括容器被創建時的id,鏡像和命令,它當前的狀態,它的端口和它的名字。 從這些混合在一起的信息中找到你要的東西有點困難。我們稍後會看到如何對這些輸出的信息進行過濾和格式化。注意,信息中的命令和id是被剪短了的版本。如要顯示完整的命令,在命令行中加入--no-trunc參數。

現在,完整的命令是:nginx -g 'daemon off;'

顯示所有的容器

你應該記得,Docker不會自動刪除已被停止的容器除非你運行它們時使用了--rm參數。使用一個-a參數將顯示所有的容器。

格式化

docker ps命令的輸出會很冗長並且常常顯示很多無用的東西。你可以使用Go-template格式去顯示你感興趣的東西。以下的命令只顯示容器的名字和命令。

它是工作的,如要顯示信息行的名字,你可以在格式字符串之前加入“table”。

容器id(在上面命令中沒有被使用)的格式化名字是{{.ID}}(全部大寫)。

過濾

docker ps命令支持很多過濾格式。它們的使用非常直觀。語法是-f "<filter>=<value>"。支持的過濾名有id,label,name,exited,status,ancestor,before,since,isolation,network和health。

這裡有個例子是通過使用容器名子作為過濾名只顯示busybox容器。

-q 參數

如果所有你想要的就是列出所有容器的id,你可以使用-q參數(quite參數)。它比--format 'table {{.ID}}'簡單。當你想要對多個容器進行操作時,這個命令會被經常用到(稍後你會看到一個例子)。

停止,啟動和重啟動容器

你能停止正在運行的容器,也能啟動一個已被停止的容器。在啟動一個已被停止的容器和運行一個由相同鏡像創建的新實例之間,有幾個不同點。

  • 你使用同樣的環境變量,磁盤空間,端口和其它最初運行命令所帶的參數。
  • 你不必創建另一個容器。
  • 如果已被停止的鏡像實例改動了文件系統,啟動的容器將使用那些被改動的文件系統。

讓我們停止nginx容器然後再啟動它。當你引用一個容器時,你可以使用它的名字或它id的一個明確的前綴。 我通常給我長期運行的容器命名,這樣我就有一個有意義的容器名並且我不需要去處理Docker自動生成的容器名或容器id的前綴。

好吧。 Nginx被停止了(狀態是“Exited”)。讓我們啟動它。

另一個選項是重啟動一個正在運行的容器,這相當於去運行docker stop接著運行docker start

$ docker restart nginx

接入一個正在運行的容器

當你啟動一個已被停止的容器,或如果你用分離模式運行你的容器(-d 命令行參數),你看不到輸出結果。但你能接入它。

刪除容器

你可以用命令:docker rm <container id or name> 刪除已被停止的容器。

如果你想要刪除一個正在運行的容器,你可以先停止它,也可以使用-f(force)命令行參數:

如果你想要刪除所有容器,這裡有一小段漂亮的代碼:

docker rm -f $(docker ps -aq)

如果你僅僅想要刪除已被停止的容器,把-f(force)參數從命令行去掉就行了。

在正在運行的容器中執行一個命令

Docker在容器內運行一個單線程,但你可以針對一個正在運行的容器執行額外的命令。它非常類似於對docker run命令提供一個定制的命令。

簡單命令

執行一個簡單的命令是通過docker exec實現的。你提供一個正在運行容器的id,名字和你想執行的命令。讓我們看一下在nginx容器內的nginx.conf文件,看看有多少工作線程已被配置。

交互式Shell

Docker容器的一個最出色的問題診斷技巧就是連接一個可進行交互式操作的Shell,直接查閱容器內部的文件系統。為了接入stdin和拿到一個tty,你需要提供-i -t命令行參數(可以被寫成-it),接著是一個shell 可執行文件(通常是bash)的名字。

最終結果是你可通過主機的shell對你的容器進行訪問。這裡有一個從容器“內部”交互式地檢查工作線程的例子。

總結

Docker是一個功能強大的平台,由於容器是它工作的基礎單元,它提供很多的工具可以管理和使用容器。我介紹了大部分重要的使用容器的方面,但是對那些我已經提到過的命令還有有更多高級的功能,選項,並且也有其它的命令。

如果你經常使用Docker容器,花點時間去學習它的所有方面。這是非常值得的。

关注我们的公众号
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.