1. 程式人生 > >Docker的使用-常用命令

Docker的使用-常用命令

第一個docker映象

  • 拉取映象 docker pull [OPTIONS] NAME[:TAG]
docker pull hello-world
  • 檢視本機都有哪些映象 docker images

Docker 容器映象刪除

停止所有的container,這樣才能夠刪除其中的images

docker ps -a 檢查對應的映象id程序和核實程序是否存在
docker rm f0b 刪除對應容器id程序
docker rmi 116  刪除對應的映象id
docker images 檢查映象是否還存在

檢視映象列表

docker images 

然後根據映象id IMAGE ID,執行如下命令進行刪除

docker rmi 8397388696e1

第一個docker容器

  • 執行容器 docker run [OPTIONS] IMAGE[:TAG][COMMAND][ARG…]
docker run hello-world
  • 檢視當前正在執行的容器
docker ps

看不到hello-world了: hello-word它就是一個列印,列印完了,程式就結束了。程序就看不到了。。

執行持久執行容器nginx

拉取映象

docker pull hub.c.163.com/library/nginx:latest

在前臺啟動映象

docker run hub.c.163.com/library/nginx

在後臺執行映象,加 -d引數即可

docker run -d hub.c.163.com/library/nginx

在容器中執行一個命令,進入容器內部等 docker exec -it d4容器的id,可以只寫前面一部分,只要docker能唯一的確定這個容器 bash要在容器中執行的命令,這裡是bash就是給你一個bash環境。

docker exec -it d4 bash

多使用 --help檢視命令引數含義 docker exec --help等

Docker網路

libnetwork共有5種內建驅動:bridge驅動、host驅動、overlay驅動、remote驅動、null驅動。 1、bridge驅動  此驅動為Docker的預設設定驅動

,使用這個驅動的時候,libnetwork將創建出來的Docker容器連線到Docker網橋上。**作為最常規的模式,bridge模式已經可以滿足Docker容器最基本的使用需求了。**然而其與外界通訊使用NAT,增加了通訊的複雜性,在複雜場景下使用會有諸多限制。

2、host驅動  使用這種驅動的時候,libnetwork將不為Docker容器建立網路協議棧,即不會建立獨立的network namespace。Docker容器中的程序處於宿主機的網路環境中,相當於Docker容器和宿主機共同用一個network namespace,使用宿主機的網絡卡、IP和埠等資訊。

但是,容器其他方面,如檔案系統、程序列表等還是和宿主機隔離的。host模式很好地解決了容器與外界通訊的地址轉換問題,可以直接使用宿主機的IP進行通訊,不存在虛擬化網路帶來的額外效能負擔。但是host驅動也降低了容器與容器之間、容器與宿主機之間網路層面的隔離性,引起網路資源的競爭與衝突。  因此可以認為host驅動適用於對於容器叢集規模不大的場景。

3、overlay驅動  此驅動採用IETE標準的VXLAN方式,並且是VXLAN中被普遍認為最適合大規模的雲端計算虛擬化環境的SDN controller模式。在使用過程中,需要一個額外的配置儲存服務,例如Consul、etcd和zookeeper。還需要在啟動Docker daemon的時候額外新增引數來指定所使用的配置儲存服務地址。

4、remote驅動  這個驅動實際上並未做真正的網路服務實現,而是呼叫了使用者自行實現的網路驅動外掛,使libnetwork實現了驅動的可外掛化,更好地滿足了使用者的多種需求。使用者只需要根據libnetwork提供的協議標準,實現其所要求的各個介面並向Docker daemon進行註冊。

5、null驅動  使用這種驅動的時候,Docker容器擁有自己的network namespace,但是並不為Docker容器進行任何網路配置。也就是說,這個Docker容器除了network namespace自帶的loopback網絡卡名,沒有其他任何網絡卡、IP、路由等資訊,需要使用者為Docker容器新增網絡卡、配置IP等。  這種模式如果不進行特定的配置是無法正常使用的,但是優點也非常明顯,它給了使用者最大的自由度來自定義容器的網路環境。

  • 使用docker network ls 可以檢視這臺主機上的所有Docker網路
# docker network  ls
NETWORK ID          NAME                DRIVER              SCOPE
879f8d1788ba        backend             bridge              local
6c16e2b4122d        bridge              bridge              local
d150ba23bdc0        frontend            bridge              local

這3個網路是Docker daemon預設建立的,分別使用了3種不同的驅動,而這3種驅動則對應了Docker原來的3種網路模式。需要注意的是,3種內建的預設網路是無法使用docker network rm進行刪除的。

容器訪問外部世界

容器預設就能訪問外網。 我們檢視一下 docker host 上的 iptables 規則

iptables -t nat -S

返回結果: -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE 其含義是:! -o docker0 的意思是所有目標地址不是docker0的資料包(即訪問外網)。這條規則是指:容器內部訪問外網的包,會做NAT,然後通過host的網絡卡(比如enp0s3)發出去。

通過 NAT,docker 實現了容器對外網的訪問。

外部世界如何訪問容器

在使用Bridge時,利用埠對映,使容器內的某個埠與容器所在主機上的某個埠做對映,當你訪問主機的某個埠其實就是訪問容器裡面的對映的埠。

預設情況使用Bridage模式,預設我們沒有告訴它埠怎麼對映,所以我在主機上訪問不到容器裡面的埠。 因此使用,如下方法,新增對映,注意先停止容器。

使用docker run --help檢視引數說明 主要是 -p手動指定 -P對映所有 docker -d -p 8080主機的埠:80容器的埠 容器的名字

docker ps
docker stop dc60e24c907a
docker run -d -p 8080:80 hub.c.163.com/library/nginx

遇到問題:

  1. 容器無ifconfig和ping命令的解決 Docker的Ubuntu映象安裝的容器無ifconfig命令和ping命令 解決: apt-get update apt install net-tools # ifconfig apt install iputils-ping # ping
  2. 容器中使用iptables報錯can’t initialize iptables table Permission denied (you must be root)? 參考URL: https://blog.csdn.net/styshoo/article/details/78279762 解決方法 在啟動容器時加上對應的privileged引數。