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