Docker 使用
環境說明
- CentOS 7.3(不準確地說:要求必須是 CentOS 7 64位)
- 不建議在 Windows 上使用
Docker 基本概念
- 官網:https://www.docker.com/
- 宿主機:安裝 Docker 的那臺電腦
- Docker:一個虛擬化軟件,你可以認為是類似:VMware、Virtualbox
- 鏡像:可以認為是類似 Windows 下的:XXXX.iso
- 容器:容器為鏡像的實例,可以認為是 Virtualbox 運行 XXXX.iso 后的效果
- 官網的鏡像倉庫地址:https://store.docker.com/
- 對開發來講總結一個最簡單的說法:在 Maven 未產生的年代,jar 包要隨著開發項目走到哪里跟到哪里。有了 Maven 寫好 pom.xml 即可。此時的 Docker 就好比如 Maven,幫你省去了開發過程中的部署環境差異,你再也不能隨便說:你的系統可以運行,我的系統就不行。現在別人連系統都幫你做好了。
- 玩法理念:單進程,一個容器最好最專注去做一個事情。雖然它可以既裝 MySQL,又裝 Nginx 等等,但是讓一個容器只做好一件事是最合適的。
- 其他通俗解釋:
Docker的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規整的擺放起來。并且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。 docker就是類似的理念。現在都流行云計算了,云計算就好比大貨輪。docker就是集裝箱。 1.不同的應用程序可能會有不同的應用環境,比如.net開發的網站和php開發的網站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個服務器上就要調試很久,而且很麻煩,還會造成一些沖突。比如IIS和Apache訪問端口沖突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來講,我們可以在服務器上創建不同的虛擬機在不同的虛擬機上放置不同的應用,但是虛擬機開銷比較高。docker可以實現虛擬機隔離應用環境的功能,并且開銷比虛擬機小,小就意味著省錢了。 2.你開發軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。 3.在服務器負載方面,如果你單獨開一個虛擬機,那么虛擬機會占用空閑內存的,docker部署的話,這些內存就會利用起來。 總之docker就是集裝箱原理。
- Docker 的優點:
- 持續部署與測試
Docker在開發與運維的世界中具有極大的吸引力,因為它能保持跨環境的一致性。在開發與發布的生命周期中,不同的環境具有細微的不同,這些差異可能是由于不同安裝包的版本和依賴關系引起的。然而,Docker可以通過確保從開發到產品發布整個過程環境的一致性來解決這個問題。 Docker容器通過相關配置,保持容器內部所有的配置和依賴關系始終不變。最終,你可以在開發到產品發布的整個過程中使用相同的容器來確保沒有任何差異或者人工干預。 使用Docker,你還可以確保開發者不需要配置完全相同的產品環境,他們可以在他們自己的系統上通過VirtualBox建立虛擬機來運行Docker容器。Docker的魅力在于它同樣可以讓你在亞馬遜EC2實例上運行相同的容器。如果你需要在一個產品發布周期中完成一次升級,你可以很容易地將需要變更的東西放到Docker容器中,測試它們,并且使你已經存在的容器執行相同的變更。這種靈活性就是使用Docker的一個主要好處。和標準部署與集成過程一樣,Docker可以讓你構建、測試和發布鏡像,這個鏡像可以跨多個服務器進行部署。哪怕安裝一個新的安全補丁,整個過程也是一樣的。你可以安裝補丁,然后測試它,并且將這個補丁發布到產品中。
- 環境標準化和版本控制
Docker容器可以在不同的開發與產品發布生命周期中確保一致性,進而標準化你的環境。除此之外,Docker容器還可以像git倉庫一樣,可以讓你提交變更到Docker鏡像中并通過不同的版本來管理它們。設想如果你因為完成了一個組件的升級而導致你整個環境都損壞了,Docker可以讓你輕松地回滾到這個鏡像的前一個版本。這整個過程可以在幾分鐘內完成,如果和虛擬機的備份或者鏡像創建流程對比,那Docker算相當快的,它可以讓你快速地進行復制和實現冗余。此外,啟動Docker就和運行一個進程一樣快。
- 隔離性
Docker可以確保你的應用程序與資源是分隔開的。幾個月前,Gartner發表了一篇報告,這份報告說明了運行Docker 容器進行資源隔離的效果和虛擬機(VM)管理程序一樣的好,但是管理與控制方面還需要進行完善。我們考慮這樣一個場景,你在你的虛擬機中運行了很多應用程序,這些應用程序包括團隊協作軟件(例如Confluence)、問題追蹤軟件(例如JIRA)、集中身份管理系統(例如Crowd)等等。由于這些軟件運行在不同的端口上,所以你必須使用Apache或者Nginx來做反向代理。到目前為止,一切都很正常,但是隨著你的環境向前推進,你需要在你現有的環境中配置一個內容管理系統(例如Alfresco)。這時候有個問題發生了,這個軟件需要一個不同版本的Apache Tomcat,為了滿足這個需求,你只能將你現有的軟件遷移到另一個版本的Tomcat上,或者找到適合你現有Tomcat的內容管理系統(Alfresco)版本。對于上述場景,使用Docker就不用做這些事情了。Docker能夠確保每個容器都擁有自己的資源,并且和其他容器是隔離的。你可以用不同的容器來運行使用不同堆棧的應用程序。除此之外,如果你想在服務器上直接刪除一些應用程序是比較困難的,因為這樣可能引發依賴關系沖突。而Docker可以幫你確保應用程序被完全清除,因為不同的應用程序運行在不同的容器上,如果你不在需要一款應用程序,那你可以簡單地通過刪除容器來刪除這個應用程序,并且在你的宿主機操作系統上不會留下任何的臨時文件或者配置文件。除了上述好處,Docker還能確保每個應用程序只使用分配給它的資源(包括CPU、內存和磁盤空間)。一個特殊的軟件將不會使用你全部的可用資源,要不然這將導致性能降低,甚至讓其他應用程序完全停止工作。
- 安全性
如上所述,Gartner也承認Docker正在快速地發展。從安全角度來看,Docker確保運行在容器中的應用程序和其他容器中的應用程序是完全分隔與隔離的,在通信流量和管理上賦予你完全的控制權。Docker容器不能窺視運行在其他容器中的進程。從體系結構角度來看,每個容器只使用著自己的資源(從進程到網絡堆棧)。作為緊固安全的一種手段,Docker將宿主機操作系統上的敏感掛載點(例如/proc和/sys)作為只讀掛載點,并且使用一種寫時復制系統來確保容器不能讀取其他容器的數據。Docker也限制了宿主機操作系統上的一些系統調用,并且和SELinux與AppArmor一起運行的很好。此外,在Docker Hub上可以使用的Docker鏡像都通過數字簽名來確保其可靠性。由于Docker容器是隔離的,并且資源是受限制的,所以即使你其中一個應用程序被黑,也不會影響運行在其它Docker容器上的應用程序。
- 多云平臺
Docker最大的好處之一就是可移植性。在過去的幾年里,所有主流的云計算提供商,包括亞馬遜AWS和谷歌的GCP,都將Docker融入到他們的平臺并增加了各自的支持。Docker容器能運行在亞馬遜的EC2實例、谷歌的GCP實例、Rackspace服務器或者VirtualBox這些提供主機操作系統的平臺上。舉例來說,如果運行在亞馬遜EC2實例上的Docker容器能夠很容易地移植到其他幾個平臺上,比如說VirtualBox,并且達到類似的一致性和功能性,那這將允許你從基礎設施層中抽象出來。除了AWS和GCP,Docker在其他不同的IaaS提供商也運行的非常好,例如微軟的Azure、OpenStack和可以被具有不同配置的管理者所使用的Chef、Puppet、Ansible等。
Docker 安裝和基本配置
- 主要有兩個版本:
Docker Enterprise Edition (Docker EE)?is designed for enterprise development and IT teams who build, ship, and run business critical applications in production at scale. Docker EE is integrated, certified, and supported to provide enterprises with the most secure container platform in the industry to modernize all applications. For more information about Docker EE, including purchasing options, see Docker Enterprise Edition.?Docker Community Edition (Docker CE)?is ideal for developers and small teams looking to get started with Docker and experimenting with container-based apps. Docker CE is available on many platforms, from desktop to cloud to server. Docker CE is available for macOS and Windows and provides a native experience to help you focus on learning Docker. You can build and share containers and automate the development pipeline all from a single environment. Docker CE has both stable and edge channels. Stable builds are released once per quarter and are supported for 4 months. Edge builds are released once per month, and are supported for that month only. If you subscribe to the Edge channel on Linux distributions, you should also subscribe to the Stable channel.
-
官網總的安裝手冊:https://docs.docker.com/install/
-
官網 CentOS 安裝手冊:https://docs.docker.com/install/linux/docker-ce/centos/
-
目前也支持 Windows,特別是 Windows 10,直接官網一個安裝包即可搞定。
-
Windows 10 的 Docker 安裝說明:https://store.docker.com/editions/community/docker-ce-desktop-windows
-
我這里選擇 Docker CE 版本:
-
CentOS 安裝過程:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加 repo(可能網絡會很慢,有時候會報:Timeout,所以要多試幾次)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce
,大小:19M,速度很慢。
-
查看配置文件位置:
systemctl show --property=FragmentPath docker
-
啟動 Docker:
systemctl start docker.service
-
停止 Docker:
systemctl stop docker.service
-
查看狀態:
systemctl status docker.service
-
運行 hello world 鏡像:
sudo docker run hello-world
- 因為是第一次使用,所以沒這個鏡像,需要一個下載過程,所以需要幾分鐘,可能還會報:Timeout。
- 鏡像自動下載好后會輸出這樣一段內容,表示已經正常安裝并可用了:
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 78445dd45222: Pull complete Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7 Status: Downloaded newer image for hello-world:latestHello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
鏡像加速
- 只要是外國的東西在國內基本都很難有好的速度,所有就有了加速器的概念,目前國內常用的如下:
- 阿里云:https://dev.aliyun.com/search.html
- USTC:https://lug.ustc.edu.cn/wiki/mirrors/help/docker
- daocloud:http://get.daocloud.io/
- 網易:https://c.163.com
- 時速云:https://hub.tenxcloud.com/
- 靈雀云:https://hub.alauda.cn/
- 推薦優先阿里云,然后是 USTC
- 我下面的講解也是基于阿里云加速
- 阿里云的服務需要注冊賬號,首次使用需要設置 docker 登錄密碼(阿里云叫做:修改Registry登錄密碼),這個以后用私人倉庫會用到。
- 如果忘記了,后面可以在這里修改:https://cr.console.aliyun.com/#/imageList
- 注冊后請訪問:https://cr.console.aliyun.com/#/accelerator,你會看到專屬的加速地址,比如我是:
https://ldhc17y9.mirror.aliyuncs.com
,所以下面文章你看到該地址都表示是這個專屬地址,請記得自己更換自己的。 - 以及教你如何使用 Docker 加速器。如果你已經安裝了最新版的 Docker 你就不需要用它的腳本進行安裝了。
- 最新版本的 Docker 是新增配置文件:
vim /etc/docker/daemon.json
,增加如下內容:
{"registry-mirrors": ["https://ldhc17y9.mirror.aliyuncs.com"] }
sudo systemctl daemon-reload
sudo systemctl restart docker
- 在以后的生活中如果要經常使用阿里云做為自己倉庫,那你還需要做:
- 在?
namespace管理
?中創建屬于你自己的 namespace:https://cr.console.aliyun.com/#/namespace/index - 創建鏡像倉庫:https://cr.console.aliyun.com/#/imageList
- 創建好倉庫后,點擊:
管理
?進入查看倉庫的更多詳細信息,這里面有很多有用的信息,包括一個詳細的操作指南,這份指南等下會用到。 - 比如我自己創建一個 redis-to-cluster 倉庫,地址是阿里云給我們的:
registry.cn-shenzhen.aliyuncs.com/youmeek/redis-to-cluster
- 那我登錄這個鏡像地址的方式:
- 創建好倉庫后,點擊:
- 在?
docker login registry.cn-shenzhen.aliyuncs.com
會讓我輸入
Username:阿里云郵箱
password:上文提到的--Registry登錄密碼
- 然后在我的倉庫管理地址有教我如何推送和拉取鏡像:https://cr.console.aliyun.com/#/dockerImage/cn-shenzhen/youmeek/redis-to-cluster/detail
- 拉取:
docker pull registry.cn-shenzhen.aliyuncs.com/youmeek/redis-to-cluster:[鏡像版本號]
- 推送:
docker logindocker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/youmeek/redis-to-cluster:[鏡像版本號]docker push registry.cn-shenzhen.aliyuncs.com/youmeek/redis-to-cluster:[鏡像版本號]
Docker 命令,最終部署 Spring Boot 項目
- 建議:初期使用的時候盡量用容器 ID / 鏡像 ID。如果使用 Tag/Name 在東西多的情況下很容易混亂 還不如就用記不住但是肯定唯一的容器 ID / 鏡像 ID
重要的基本概念
- 可以代表一個完整的鏡像名有兩種方式:
- REPOSITORY(倉庫):TAG(標簽)
- 其中 TAG 表面上不是必須有的,本質是 docker 幫你用 latest 來代替了。latest 這里最好翻譯為默認,而不是最新。
- IMAGE ID(鏡像ID)
- 這是一個 Docker 隨機給你生成 數字+字母 的字符串
- REPOSITORY(倉庫):TAG(標簽)
部署一個 Spring Boot 的 Java Web 項目為例
- 宿主機環境說明:
- IP 地址:
http://192.168.137.128
- 停止了防火墻:
systemctl stop firewalld.service ; systemctl stop iptables.service
- 停止防火墻后重啟 Docker 服務:
systemctl restart docker.service
- JDK(jdk-8u121-linux-x64.tar.gz)、jar 應用(spring-boot-my-demo.jar),存放宿主機位置:
/opt/setups
- Spring Boot 的 jar 應用中配置文件給的端口是:8080,常規情況下的訪問路徑:
http://127.0.0.1:8080/youmeek
- IP 地址:
- 下載鏡像:
docker pull centos:6.8
,我的 IMAGE_ID 為:0cd976dc0a98
- 運行鏡像,實例化為一個容器:
docker run -i -t -v /opt/setups:/opt 0cd976dc0a98 /bin/bash
-v:表示需要將本地宿主機的目錄掛載到容器中對應的一個目錄上,格式:-v <宿主機目錄>:<容器目錄>,所以此時對容器此目錄的操作,也是等同于對宿主機的目錄的操作
- 在容器里安裝 Oracle JDK 8、配置 JDK 環境變量這里不多說,具體看:JDK 安裝。
- 把容器中 /opt 目錄下的 spring-boot-my-demo.jar 拷貝到容器的 root 目錄下:
cp /opt/spring-boot-my-demo.jar /root
- 再容器里新建腳本:
vi /root/spring-boot-run.sh
,腳本內容如下:
#!/bin/bash
source /etc/profile
java -jar /root/spring-boot-my-demo.jar
- 在容器中對新建腳本增加執行權限:
chmod u+x /root/spring-boot-run.sh
- 我們啟動另外一個終端
- 查看我們剛剛運行的容器相關信息:
docker ps -a
- 我們看到了我們剛剛運行的容器 ID(CONTAINER ID)為:
a5d544d9b6f9
,這個下面要用到
- 我們看到了我們剛剛運行的容器 ID(CONTAINER ID)為:
- 基于剛剛運行的容器創建新鏡像:
docker commit a5d544d9b6f9 youmeek/springboot:0.1
- 查看現在的鏡像庫:
docker images
,會發現多了一個 youmeek/springboot 新鏡像,鏡像 ID 為:7024f230fef9
- 查看現在的鏡像庫:
- 運行新鏡像,實例化為一個容器,并啟動容器中剛剛寫的腳本:
docker run -d -p 38080:8080 --name=springBootJar --hostname=springBootJar 7024f230fef9 /root/spring-boot-run.sh
-d
:表示以“守護模式”執行 spring-boot-run.sh 腳本,此時 jar 中的 log 日志不會出現在輸出終端上。-p
:表示宿主機與容器的端口映射,此時將容器內部的 8080 端口映射為宿主機的 38080 端口,這樣就向外界暴露了 38080 端口,可通過 Docker 網橋來訪問容器內部的 8080 端口了。--name
:表示給新實例容器取的名稱,用一個有意義的名稱命名即可
- 查看其實運行的容器:
docker ps -a
,可以知道我們的新容器 ID:fd21ac056343
,名稱為:springBootJar
- 查看這個容器的 jar 應用的 log 輸出:
docker logs -f fd21ac056343
,可以看到 jar 啟動后的 log 輸出內容 - 通過瀏覽器訪問容器中的應用:
http://192.168.137.128:38080/youmeek/
,可以看到 jar 應用的首頁可以訪問
Docker 基本命令
- 官網文檔:https://docs.docker.com/engine/reference/run/
版本信息
docker version
,查看docker版本docker info
,顯示docker系統的信息
鏡像倉庫
docker pull
:從倉庫下載鏡像到本地docker pull centos:latest
:獲取 CentOS 默認版本鏡像docker pull centos:7.3.1611
:獲取 CentOS 7 鏡像,下載大小 70M 左右,下面的操作基于此鏡像docker pull centos:6.8
:獲取 CentOS 6 鏡像docker pull registry.cn-hangzhou.aliyuncs.com/chainone/centos7-jdk8
:獲取別人做好的阿里云鏡像
docker push
:將一個鏡像 push 到 registry 倉庫中docker push myapache:v1
docker search
:從 registry 倉庫搜索鏡像docker search -s 3 centos
,參數?-s 數字
:表示篩選出收藏數(stars值)大于等于 3 的鏡像
docker login
:登錄到一個鏡像倉庫。默認登錄的是官網的倉庫:https://hub.docker.com- 登錄阿里云倉庫格式:
sudo docker login --username=阿里云郵箱
- 比如我是這個:
docker login --username=23333212@qq.com registry.cn-shenzhen.aliyuncs.com
,你完整的登錄地址你需要訪問:https://cr.console.aliyun.com/#/imageList,在你自己創建的倉庫中去查看那份詳細操作指南上的地址 - 密碼就是你首次訪問:https://cr.console.aliyun.com/#/accelerator,彈窗出來讓你設置的那個密碼,如果忘記了重新設置下即可,重設地址:https://cr.console.aliyun.com/#/imageList,右上角有一個:修改docker登錄密碼。
- 比如我是這個:
- 登錄阿里云倉庫格式:
本地鏡像管理
docker stats
:查看當前啟動的容器各自占用的系統資源bin docker stats --no-stream kafkadocker_kafka_1 kafkadocker_zookeeper_1
:查看指定容器的占用資源情況- 更加高級的監控方式有一個軟件叫做:ctop(推薦使用):https://github.com/bcicen/ctop
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
4532a9ee27b8 cloud-cadvisor 1.49% 53.28MiB / 3.702GiB 1.41% 13.5MB / 646MB 265MB / 0B 19
3895d5d50a5e kafkadocker_kafka_1 1.45% 1.24GiB / 3.702GiB 33.51% 145MB / 186MB 499MB / 724MB 128
1d1a6a7c48d8 kafkadocker_zookeeper_1 0.11% 70.85MiB / 3.702GiB 1.87% 55.8MB / 33.7MB 209MB / 1.22MB 23
docker images
:顯示本地所有的鏡像列表- 關注 REPOSITORY(名稱),TAG(標簽),IMAGE ID(鏡像ID)三列
docker images centos
:查看具體鏡像情況docker rmi
:刪除鏡像,一般刪除鏡像前要先刪除容器,不然如果鏡像有被容器調用會報錯docker rmi 容器ID
:刪除具體某一個鏡像docker rmi 倉庫:Tag
:刪除具體某一個鏡像docker rmi $(docker images -q)
,刪除所有鏡像docker rmi -f $(docker images -q)
,強制刪除所有鏡像docker rmi $(docker images | grep "vmware" | awk '{print $3}')
,批量刪除帶有 vmware 名稱的鏡像
docker tag
:為鏡像打上標簽docker tag -f ubuntu:14.04 ubuntu:latest
,-f 意思是強制覆蓋- 同一個IMAGE ID可能會有多個TAG(可能還在不同的倉庫),首先你要根據這些 image names 來刪除標簽,當刪除最后一個tag的時候就會自動刪除鏡像;
docker rmi 倉庫:Tag
,取消標簽(如果是鏡像的最后一個標簽,則會刪除這個鏡像)
docker build
:使用 Dockerfile 創建鏡像(推薦)docker build . --rm -t runoob/ubuntu:v1
,參數?-t
,表示:-tag,打標簽- 多次 docker build 過程中是有依賴一個緩存的過程的,一般 build 過程都有好幾個 step,Docker 非常聰明,會自己判斷那些沒有被修改過程的 step 采用緩存。如果想要避免使用緩存,可以使用這樣命令?--no-cache:
docker build --no-cache . --rm -t runoob/ubuntu:v1
docker history
:顯示生成一個鏡像的歷史命令,可以看出這個鏡像的構建過程,包括:每一層鏡像的 ID、指令docker save
:將一個鏡像保存為一個 tar 包,帶 layers 和 tag 信息(導出一個鏡像)docker save 鏡像ID -o /opt/test.tar
docker load
:從一個 tar 包創建一個鏡像(導入一個鏡像)docker load -i /opt/test.tar
容器生命周期管理
docker run
,運行鏡像docker run -v /java_logs/:/opt/ -d -p 8080:80 --name=myDockerNameIsGitNavi --hostname=myDockerNameIsGitNavi -i -t 鏡像ID /bin/bash
-i -t
?分別表示保證容器中的 STDIN 開啟,并分配一個偽 tty 終端進行交互,這兩個是合著用。--name
?是給容器起了一個名字(如果沒有主動給名字,docker 會自動給你生成一個)容器的名稱規則:大小寫字母、數字、下劃線、圓點、中橫線,用正則表達式來表達就是:[a-zA-Z0-9_*-]-d
?容器運行在后臺。-p 8080:80
?表示端口映射,將宿主機的8080端口轉發到容器內的80端口。(如果是 -P 參數,則表示隨機映射應該端口,一般用在測試的時候)-v /java_logs/:/opt/
?表示目錄掛載,/java_logs/ 是宿主機的目錄,/opt/ 是容器目錄
docker run --rm --name=myDockerNameIsGitNavi --hostname=myDockerNameIsGitNavi -i -t centos /bin/bash
,--rm,表示退出即刪除容器,一般用在做實驗測試的時候docker run --restart=always -i -t centos /bin/bash
,--restart=always 表示停止后會自動重啟docker run --restart=on-failure:5 -i -t centos /bin/bash
,--restart=on-failure:5 表示停止后會自動重啟,最多重啟 5 次
docker exec
:對守護式的容器里面執行命令,方便對正在運行的容器進行維護、監控、管理docker exec -i -t 容器ID /bin/bash
,進入正在運行的 docker 容器,并啟動終端交互docker exec -d 容器ID touch /opt/test.txt
,已守護式的方式進入 docker 容器,并創建一個文件
docker stop 容器ID
,停止容器docker stop $(docker ps -a -q)
,停止所有容器docker stop $(docker ps -a -q) ; docker rm $(docker ps -a -q)
,停止所有容器,并刪除所有容器docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
,停止所有容器,并刪除所有容器
docker start 容器ID
,重新啟動已經停止的容器(重新啟動,docker run 參數還是保留之前的)docker restart 容器ID
,重啟容器docker rm
,刪除容器docker rm 容器ID
,刪除指定容器(該容器必須是停止的)docker rm -f 容器ID
,刪除指定容器(該容器如果正在運行可以這樣刪除)docker rm $(docker ps -a -q)
,刪除所有容器docker rm -f $(docker ps -a -q)
,強制刪除所有容器docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
?刪除老的(一周前創建)容器docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
?停止所有容器,刪除所有容器,刪除所有鏡像
docker commit
,把容器打成鏡像docker commit 容器ID gitnavi/docker-nodejs-test:0.1
- gitnavi 是你注冊的?https://store.docker.com/?的名字,如果你沒有的話,那需要先注冊
- docker-nodejs-test 是你為該鏡像起的名字
- 0.1 是鏡像的版本號,默認是 latest 版本
docker commit -m="這是一個描述信息" --author="GitNavi" 容器ID gitnavi/docker-nodejs-test:0.1
- 在提交鏡像時指定更多的數據(包括標簽)來詳細描述所做的修改
docker diff 容器ID
:顯示容器文件系統的前后變化--link
?同一個宿主機下的不同容器的連接:docker run -it 鏡像ID --link redis-name:myredis /bin/bash
redis-name
?是容器名稱myredis
?是容器別名,其他容器連接它可以用這個別名來寫入到自己的配置文件中
- 容器與宿主機之間文件的拷貝
docker cp /www/runoob 96f7f14e99ab:/www/
?將主機 /www/runoob 目錄拷貝到容器 96f7f14e99ab 的 /www 目錄下docker cp /www/runoob 96f7f14e99ab:/www
?將主機 /www/runoob 目錄拷貝到容器 96f7f14e99ab 中,目錄重命名為 www。docker cp 96f7f14e99ab:/www /tmp/
?將容器96f7f14e99ab的/www目錄拷貝到主機的/tmp目錄中。
docker 網絡模式
- 查看也有網絡:
docker network ls
- 創建網絡:
docker network create --subnet=172.19.0.0/16 net-redis-to-cluster
- 已有容器連接到某個網絡(一個容器可以同時連上多個網絡):
docker network connect net-redis-to-cluster my-redis-container
- 如果是內網提供服務的,可以直接創建一個網絡,其服務使用該網絡。然后另外一個需要調用該服務的,并且是對外網提供服務的可以使用 host 模式
--network XXXXXX
?常見幾種模式- bridge 默認模式,在 docker0 的網橋上創建新網絡棧,確保獨立的網絡環境,實現網絡隔離:
docker run -it 鏡像ID --network=bridge /bin/bash
- none 不適用網卡,不會有 IP,無法聯網:
docker run -it 鏡像ID --network=none /bin/bash
- host 使用宿主機網絡 IP、端口聯網(在容器里面輸入:ip a,看到的結果和在宿主機看到的一樣):
docker run -it 鏡像ID --network=host /bin/bash
- 自定義-使用自己命名的網絡棧,但是需要手動配置網卡、IP 信息:
docker run -it 鏡像ID --network=自定義名稱 /bin/bash
- bridge 默認模式,在 docker0 的網橋上創建新網絡棧,確保獨立的網絡環境,實現網絡隔離:
容器管理操作
docker ps
:列出當前所有?正在運行?的容器docker ps -a
:列出所有的容器(包含歷史,即運行過的容器)docker ps -l
:列出最近一次啟動的containerdocker ps -q
:列出最近一次運行的container IDdocker ps -a -l
:列出最后一次運行的容器docker ps -n x
:顯示最后 x 個容器,不管是正在運行或是已經停止的
docker top 容器ID
:顯示容器的進程信息docker events
:得到 docker 服務器的實時的事件docker logs -f 容器ID
:查看容器日志(如果一些容器不斷重啟,或是自動停止,可以這樣看下)docker logs 容器ID
,獲取守護式容器的日志docker logs -f 容器ID
,不斷監控容器日志,類似 tail -fdocker logs -ft 容器ID
,在 -f 的基礎上又增加 -t 表示為每條日志加上時間戳,方便調試docker logs --tail 10 容器ID
,獲取日志最后 10 行docker logs --tail 0 -f 容器ID
,跟蹤某個容器的最新日志而不必讀取日志文件docker logs -f -t --since="2018-05-26" --tail=200 容器ID
?根據某個時間讀取日志docker logs -f -t --since="2018-05-26T11:13:40" --tail=200 容器ID
?根據某個時間讀取日志docker logs -f -t --since="2018-05-25T11:13:40" --until "2018-05-26T11:13:40" --tail=200 容器ID
?根據某個時間讀取日志docker logs --since 10m 容器ID
?查看最近 10 分鐘的日志-f
?: 表示查看實時日志-t
?: 顯示時間戳-since
?: 顯示某個開始時間的所有日志-tail=200
?: 查看最后的 200 條日志
docker wait
,阻塞到一個容器,直到容器停止運行docker export
,將容器整個文件系統導出為一個tar包,不帶layers、tag等信息docker port
,顯示容器的端口映射docker inspect 容器ID
:查看容器的全面信息,用 JSON 格式輸出docker inspect network名稱
:查看 network 信息,用 JSON 格式輸出,包含使用該網絡的容器有哪些docker system df
:類似于 Linux 上的 df 命令,用于查看 Docker 的磁盤使用情況- Images 鏡像
- Containers 容器
- Local Volumes 數據卷
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 6 1.049GB 0B (0%)
Containers 7 4 10.25kB 0B (0%)
Local Volumes 13 5 38.49GB 1.365MB (0%)
Build Cache 0B 0B
獲取容器中的 IP:docker inspect -f {{.NetworkSettings.IPAddress}} 容器ID
獲取容器中的 IP:docker inspect -f {{.Volumes}} 容器ID
查看容器的掛載情況:docker inspect 容器ID | grep Mounts -A 10
- 下面為一個 docker inspect 后的結果示例:
[{"Id": "e1dff77b99d9c8489e0a0ce68a19ec5ffe18cc5d8b8ec17086f7f7bea29aa09b", "Created": "2018-01-18T03:47:16.138180181Z", "Path": "docker-entrypoint.sh", "Args": [ "--auth" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 19952, "ExitCode": 0, "Error": "", "StartedAt": "2018-01-18T03:47:16.348568927Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:42aa46cfbd7a0d1101311defac39872b447b32295b40f9c99104ede5d02e9677", "ResolvConfPath": "/var/lib/docker/containers/e1dff77b99d9c8489e0a0ce68a19ec5ffe18cc5d8b8ec17086f7f7bea29aa09b/resolv.conf", "HostnamePath": "/var/lib/docker/containers/e1dff77b99d9c8489e0a0ce68a19ec5ffe18cc5d8b8ec17086f7f7bea29aa09b/hostname", "HostsPath": "/var/lib/docker/containers/e1dff77b99d9c8489e0a0ce68a19ec5ffe18cc5d8b8ec17086f7f7bea29aa09b/hosts", "LogPath": "/var/lib/docker/containers/e1dff77b99d9c8489e0a0ce68a19ec5ffe18cc5d8b8ec17086f7f7bea29aa09b/e1dff77b99d9c8489e0a0ce68a19ec5ffe18cc5d8b8ec17086f7f7bea29aa09b-json.log", "Name": "/cas-mongo", "RestartCount": 0, "Driver": "overlay", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": [ "/data/mongo/db:/data/db" ], "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": { "27017/tcp": [ { "HostIp": "", "HostPort": "27017" } ] }, "RestartPolicy": { "Name": "always", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions