一、前言
統稱來說,容器是一種工具, 指的是可以裝下其它物品的工具, 以方便人類歸納 放置 物品 、存儲和異地運輸 具體 來說 比如人類使用的 衣櫃 、行李箱、背包等可以成為容器,但今天我們所說的容器是一種IT技術。
容器技術是虛擬化、雲計算、大數據之后的一門新興的並且是炙手可熱的新技術, 容器 技術提高了硬件資源利用率、 方便了企業 的業務快速橫向擴容、 實現了業務宕機自愈功能 ,
因此未來數年會是一個容器愈發流行的時代這是一個對於IT行業來說非常有影響和價值的技術,而對於IT行業的從業者來說, 熟練掌握容器技術無疑是一個很有前景的行業工作機會。
容器技術最早出現在freebsd叫做 jail。
二、docker 簡介
1、Docker是什么?
- Docker是一個開放源代碼軟件項目,讓應用程序布署在軟件貨櫃下的工作可以自動化進行,借此在Linux操作系統上,提供一個額外的軟件抽象層,以及操作系統層虛擬化的自動管理機制。
- Docker利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心名字空間(namespaces),來創建獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機造成的額外負擔。Linux核心對名字空間的支持完全隔離了工作環境中應用程序的視野,包括進程樹、網絡、用戶ID與掛載文件系統,而核心的cgroup提供資源隔離,包括CPU、存儲器、block I/O與網絡。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供界面的基礎上,開始包括libcontainer庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施,
- 依據行業分析公司“451研究”:“Dockers是有能力打包應用程序及其虛擬容器,可以在任何Linux服務器上運行的依賴性工具,這有助於實現靈活性和便攜性,應用程序在任何地方都可以運行,無論是公有雲、私有雲、單機等。
紅帽官方文檔:https://www.redhat.com/zh/topics/containers/whats-a-linux-container
2、Docker的組成:
官方文檔:https://docs.docker.com/engine/dockeroverview/
Docker主機 (Host):一個物理機或虛擬機,用於運行Docker服務進程和容器。
Docker服務端 (Server): Docker 守護 進程, 運行docker容器。
Docker客戶端 (Client):客戶端 使用docker命令或其他工具調用docker API 。
Docker倉庫 (Registry):保存鏡像的倉庫,類似於git或svn這樣的版本控制系
Docker鏡像 (Images):鏡像可以理解為創建實例使用的模板。
Docker容器 (Container ): 容器是從鏡像生成對外提供服務的一個或一組服務 。
Docker Hub 官方倉庫:https://hub.docker.com/
架構圖:
3、Docker對比虛擬機:
1、資源利用率更高:一台物理機可以運行數百個容器,但是一般只能運行數十個虛擬機 。
2、開銷更小:不需要啟動單獨的虛擬機占用硬件資源。
3、啟動速度更快:可以在數秒內完成啟動。
使用虛擬機是為了更好的實現服務運行環境隔離,每個虛擬機都有獨立的內核,虛擬化可以實現不同操作系統的虛擬機 ,但是通常一個虛擬機只運行一個服務, 很明顯資源利用率比較低且造成不必要的性能損耗,我們創建虛擬機的目的是為了運行應用程序,比如 Nginx、PHP、Tomcat 等 web 程序,使用虛擬機無疑帶來了一些不必要的資源開銷,但是容器技術則基於減少中間運行環節帶來較大的性能提升。
4、 Linux Namespace技術
namespace是Linux系統的底層概念, 在內核層實現,即有一些不同類型的命名空間被部署在核內各個docker容器運行在同一個docker主進程並且共用同一個宿主機系統內核,各docker容器運行在宿主機的用戶空間每個容器都要有類似於虛擬機一樣的相互隔離的運行空間,但是容器技術是在一個進程內實現運行指定服務的運行環境, 並且還可以保護 宿主機內核不受其他進 程的干擾和影響;如:文件系統空間、網絡空間、進程空間等,目前主要通過以下技術實現容器運行空間的相互隔離:
- namespaces 名稱空間
- Control Group(cgroups) 控制組
(1)為什么centos6 版本不能使用容器?
因為centos6 內核版本是2.6;容器需要一個user的名稱空間,直到內核3.8版本才有:
namespace | 系統調用參數 | 隔離內容 | 內核版本 |
UTS | CLONE_NEWUTS | 主機名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信號量、消息隊列和共享內存 | 2.6.19 |
PID | CLONE_NEWPID | 進程編號 | 2.6.24 |
Network | CLONE_NEWNET | 網絡設備、網絡棧、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 掛載點(文件系統) | 2.4.19 |
User | CLONE_NEWUSER | 用戶和用戶組 | 3.8 |
5、MNT Namespace
每個容器都要有獨立的根文件系統有獨立的用戶空間, 以實現 在容器里面啟動服務並且使用容器的運行環境,即一個宿主機是ubuntu的服務器,可以在里面啟動一個centos 運行環境的容器並且在容器里面啟動一個Nginx服務,此 Nginx運行時使用的運行環境就是centos系統目錄的運行環境 但是在容器里面是不能訪問 宿主機 的資源, 宿主機是使用了 chroot 技術把容器鎖定到一個指定的運行目錄里面 。
例如::/var/lib/containerd/io.containerd.runtime.v1.linux/ 容器ID
啟動三個容器用於以下驗證過程:
Server: Docker Engine Community Engine: Version: 18.09.7 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 2d0083d Built: Thu Jun 27 17:26:28 2019 OS/Arch: linux/amd64 Experimental: false # docker run -d name nginx 1 p 80:80 nginx # docker run -d name nginx 2 p 81:80 nginx # docker run -d name nginx 3 p 82:80 nginx
Debian系統安裝基礎命令:
# apt update # apt install procps (top 命令 # apt install iputils ping (ping 命令 # apt install net-tools ( 網絡工具
驗證容器的根文件系統:
6、IPC Namespace
一個容器內的進程間通信允許一個容器內的不同進程的內存、緩存等數據訪問,但是不能誇容器訪問其他容器的數據 。
7、UTS namespace
UNIX Timesharing System包含了運行內核的名稱、版本、底層體系結構類型等信息)用於系統標識,其中包含了hostname和域名domainname,它使得一個容器擁有屬於自己 hostname 標識,這個主機名標識獨立於宿主機系統和其上的其他容器 。
8、PID Namespace
Linux系統中,有一個PID為1的進程 init/systemd是其他所有進程的父進程,那么在每個容器內也要有一個父進程來管理其下屬的子進程,那么多個容器的進程通PID namespace進程隔離(比如PID編號重復、器內的主進程生成與回收子進程等 )。
例如:下圖是在一個容器內使用top命令看到的PID為1的進程是nginx。
容器內的Nginx主進程與工作進程:
那么宿主機的PID究竟與容器內的PID是什么關系?
查看宿主機上的PID信息:
查看容器中的PID信息:
9、Net Namespace
每一個容器都類似於虛擬機一樣有自己的網卡、 監聽 端口、TCP /IP 協議棧等。Docker使用network namespace 啟動一個vethX接口,這樣你的容器將擁有它自己的橋接ip地址,通常是docker0,而docker0實質就是Linux的虛擬網橋,網橋是在OSI七層模型的數據鏈路層的網絡設備,通過mac地址對網絡進行划分,並且在不同網絡直接傳遞數據。
查看宿主機的網卡信息:
查看宿主機橋接設備:
通過brctl show 命令查看橋接設備:
10、實邏輯網絡圖:
11、Linux control groups
在一個容器 ,如果不對其做任何資源限制,則宿主機會允許其占用無限大的內存空間,有時候會因為代碼bug 程序會一直申請內存,直到把宿主機內存占完,為了避免此類的問題出現, 宿主機有必要對容器進行資源分配 限制,比如
CPU 、內存等, Linux Cgroups 的全稱是 Linux Control Groups 它最主要的作用,就是限制一個進程組能夠使用的資源上限,包括 CPU 、內存、磁盤、網絡帶寬等等。此外,還能夠對進程進行優先級設置,以及將進程掛起和恢復等操作。
驗證系統 cgroups
Cgroups 在內核層默認已經開啟,從 centos 和 ubuntu 對比結果來看,顯然 內核較新的ubuntu支持 的功能更多。
Centos 7.6 cgroups
ubuntu cgroups
cgroups 具體實現:
blkio :塊設備 IO 限制。 cpu :使用調度程序為 cgroup 任務提供 cpu 的訪問。 cpuacct :產生 cgroup 任務的 cpu 資源報告。 cpuset :如果是多核心的 cpu ,這個子系統會為 cgroup 任務分配單獨的 cpu 和內存。 devices :允許或拒絕 cgroup 任務對設備的訪問。 freezer :暫停和恢復 cgroup 任務。 memory :設置每個 cgroup 的內存限制以及產生內存資源報告。 net_cls :標記每個網絡包以供 cgroup 方便使用。 ns :命名空間子系統。 perf_event :增加了對每 group 的監測跟蹤的能力,可以監測屬於某個特定的 group 的所有線程以及運行在特定 CPU 上的線程。
Docker優缺點
Docker優勢:
快速部署:短時間內可以部署成百上千個應用 ,更快速交付到線上 。
高效虛擬化:不需要額外的hypervisor支持,直接基於linux實現應用虛擬化,相比虛擬機大幅提高性能和效率。
節省開支:提高服務器利用率,降低IT支出 。
簡化配置:將運行環境打包保存至容器,使用時直接啟動即可。
快速遷移和擴展:可跨平台運行在物理機、虛擬機、公有雲等環境, 良好的兼容性可以方便將應用從A 宿主機遷移到B宿主機甚至是A平台遷移到B平台 。
Docker 的缺點:
隔離性:各應用之間的隔離不如虛擬機徹底 。
docker容器的核心技術:
容器規范:
除了docker之外的docker技術,還有coreOS 的rkt還有阿里的 Pouch 為了保證容器生態的 標准 性和健康可持續發展, 包括 Linux 基金會 、Docker 、微軟、紅帽谷歌和、IBM 、等公司在2015年6月共同成立了一個叫 open container OCI
的組織,其目的就是制定開放的標准的容器規范,目前OCI一共發布了兩個規范,分別是 runtime spec 和 image format spec ,有了這兩個規范 不同 的容器 公司開發的容器只要兼容這兩個規范,就可以保證容器的可移植性和相互可操作性。
容器runtime
runtime是真正運行容器的地方,因此為了運行不同的容器 runtime 需要和操作系統內核緊密合作相互在 支持 ,以便為容器提供相應的運行環境 。
目前主流的三種 runtime:
Lxc:linux上早期的runtime Docker早期就是采用lxc作為runtime 。
runc:目前Docker 默認的 runtime runc 遵守 OCI 規范,因 此可以兼容 lxc 。
rkt:是Core OS開發的容器runtime,也符合OCI規范 ,所以使用rktruntime也可以運行Docker容器。
容器管理工具:
管理工具連接 runtime與用戶,對用戶提供圖形或 命令方式操作,然后管理工具將用戶操作傳遞給runtime執行 。
lxc是lxd的管理工具。
Runc的管理工具是 docker engine,docker engine包含后台deamon和cli兩部分 ,大家經常提到的Docker就是指的docker engine 。
Rkt 的管理工具是rktcli 。
容器定義工具:
容器定義工具允許用戶定義容器的屬性和內容,以方便容器能夠被保存、共享和重建 。
Docker image:是docker容器 的模板,runtime依據docker image創建容器。
Docker file:包含N個命令的文本文件,通過dockerfile創建出 docker image 。
ACI (App container image):與 docker image 類似 是 Core OS開發的rkt容器的鏡像格式。
二、Docker安裝及基礎命令介紹
1、通過yum源安裝docker-ce
阿里雲官網地址:https://mirrors.aliyun.com/docker-ce/linux/centos/
[root@centos-7 ~]# cd /etc/yum.repos.d/ [root@centos-7 yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #下載repo包到/etc/yun.repos.d目錄下,默認安裝最新版本 [root@centos-7 ~]# yum install docker-ce -y #安裝docker
2、CentOS 7(使用 yum 進行安裝制定版本)
# step 1: 安裝必要的一些系統工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加軟件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新並安裝Docker-CE sudo yum makecache fast sudo yum -y install docker-ce # Step 4: 開啟Docker服務 sudo service docker start # 注意: # 官方軟件源默認啟用了最新的軟件,您可以通過編輯軟件源的方式獲取各個版本的軟件包。例如官方並沒有將測試版本的軟件源置為可用,您可以通過以下方式開啟。同理可以開啟各種測試版本等。 # vim /etc/yum.repos.d/docker-ee.repo # 將[docker-ce-test]下方的enabled=0修改為enabled=1 # # 安裝指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # yum list docker-ce.x86_64 --showduplicates | sort -r # Loading mirror speeds from cached hostfile # Loaded plugins: branch, fastestmirror, langpacks # docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable # docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable # docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable # Available Packages # Step2: 安裝指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos) # sudo yum -y install docker-ce-[VERSION] #查看到docker-ce的版本后,可以安裝指定的版本。
啟動docker服務
# systemctl start docker
查看此時docker的版本:
docker存儲引擎:
1、目前docker的默認存儲引擎為overlay2,需要磁盤分區支持d-type文件分層功能 ,因此需要系統磁盤的額外支持。
官方文檔關於存儲引擎的選擇文檔:
https://docs.docker.com/storage
2、Docker官方推薦首選存儲引擎為overlay2其次為devicemapper 但是devicemapper存在使用空間方面的一些限制, 雖然可以通過后期配置解決,
但是官方依然推薦使用overlay2 ,centos7.2版本之前的ftype都是0,以下是網上查到的部分資料:
https://www.cnblogs.com/youruncloud/p/5736718.html
如果docker 數據目錄是一塊單獨的磁盤分區而且是xfs格式的,那么需要在格式化的時候加上參數 -n ftype=1,否則后期在啟動容器的時候會報錯不支持dtype 。
報錯界面:
docker服務進程
通過查看docker進程,了解docker的運行及工作方式
查看containerd進程關系:
有四個 進程:
dockerd:被client直接訪問,其 父進程為宿主機的systemd守護進程 。
docker-proxy:實現容器通信,其父進程為dockerd
containerd:被dockerd進程調用以實現與runc交互
containerd-shim:真正運行容器的載體,其父進程為containerd
容器的創建與管理過程:
通信流程: 1. dockerd通過grpc和containerd模塊通信,dockerd由libcontainerd負責和containerd進行交換,dockerd和containerd通信socket文件::/run/containerd/containerd.sock 。 2. containerd在dockerd啟動時被啟動,然后containerd啟動grpc請求監聽,containerd 處理grpc請求,根據請求做相應動作。 3. 若是start或是exec容器,containerd拉起一個container-shim,並進行相應的操作。 4. container-shim被拉起后,start/exec/create拉起runC進程,通過 exit、control文件和containerd通信,通過父子進程關系和SIGCHLD監控容器中進程狀態。 5. 在整個容器生命周期中,containerd通過epoll監控容器文件,監控容器事件。
配置docker鏡像加速
多種加速方式:
- docker cn
- 阿里雲加速器
- 中國科技大學
- ... ...
(1)docker cn加速
[root@along ~]# mkdir -p /etc/docker [root@along ~]# sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.docker-cn.com"] } EOF
(2)阿里雲加速器
① 注冊阿里雲賬號,專用加速器地址獲得路徑:
https://cr.console.aliyun.com/#/accelerator
② 添加加速器到配置文件
[root@along ~]# sudo tee /etc/docker/daemon.json << 'EOF' { "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"] } EOF
③ 阿里雲頁面有操作步驟
登錄阿里雲賬號--->管理控制台----->左上角搜索:容器鏡像服務----->點擊最下面的鏡像加速器
2.3.3 啟動docker服務
① 重載docker啟動配置
[root@centos7~]# systemctl daemon-reload
② 啟動docker服務
[root@centos7 ~]# systemctl start docker.service
③ 將docker設置為開機啟動
[root@centos7~]# systemctl enable docker.service
三、Docker基礎命令操作
Docker鏡像介紹:
Dokcer鏡像含有啟動容器所需要的文件系統及其內容,因此,其用於創建並啟動docker容器。
采用分層構建機制,最底層為Bootfs,其之為rootfs。
- bootfs:用於系統引導的文件系統,包括bootloader和kernel,容器啟動完成后會被卸載以節約內存資源;
- rootfs:位於bootfs之上,表現為docker容器的根文件系統;
- docker中,rootfs由內核掛載為“只讀”模式,而后通過聯合掛載技術額外掛載在一個"可寫"層;
docker image layer
- 位於下層的鏡像成為父鏡像,最底層的成為基礎鏡像
- 最上層為可讀寫層,其下的均為只讀層;
3.1 鏡像管理
3.1.1 搜索官方倉庫鏡像
[root@centos-7 yum.repos.d]# docker search nginx #不帶版本號默認 latest,也就是最新版本的nginx
3.1.2 下載鏡像
(1)下載需要的鏡像,參見docker hub官網的tag標簽下載:https://hub.docker.com,想要哪個版本直接在此搜索,然后找到對應的版本,以冒號為分隔符進行pull到docker主機上即可。
例如:docker pull nginx:1.14-alpine ,冒號后面跟上自己nginx的版本號,版本號可以在docker hub上查看,如果不跟冒號,就是默認下載最新版本。
[root@centos-7 ~]# docker pull nginx # 下載nginx [root@centos-7 ~]# docker pull centos [root@centos-7 ~]# docker pull alpine
(2)查看已下載的鏡像
[root@centos-7 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest c7460dfcab50 3 days ago 126MB centos latest 0f3e07c0138f 3 months ago 220MB
參數解釋
REPOSITORY # 鏡像所屬的倉庫名稱 TAG # 鏡像版本號(標識符) 默認為 latest IMAGE ID # 鏡像唯一ID標示 CREATED # 鏡像創建時間 VIRTUAL SIZE # 鏡像的大小
3.1.3 鏡像導出
[root@centos-7 ~]# docker save nginx > /opt/nginx.tar.gz [root@centos-7 ~]# docker save centos -o /opt/centos.tar.gz [root@centos-7 ~]# ll /opt total 254248 -rw------- 1 root root 130174464 Jan 13 23:10 centos.tar.gz drwx--x--x 4 root root 28 Jan 13 15:26 containerd -rw------- 1 root root 130174464 Jan 13 23:10 nginx.tar.gz
注:
- -o:指定導出鏡像的位置;
- 可以同時導出多個鏡像;為一個文件;
- 指定.tar.gz 可以導出並壓縮。
3.1.4 鏡像導入
[root@centos-7 ~]# scp /opt/nginx.tar.gz 192.168.7.101: #傳到另一台主機上將鏡像導入 [root@centos-7 ~]# docker load < nginx.tar.gz # 導入鏡像,也可以用-i選項導入 556c5fb0d91b: Loading layer [==================================================>] 72.48MB/72.48MB 17fde96446df: Loading layer [==================================================>] 57.67MB/57.67MB c26e88311e71: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: nginx:latest [root@centos-7 ~]# docker images # 查看導入的鏡像內容 REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest c7460dfcab50 3 days ago 126MB
導入鏡像方法二:
[root@centos-7 ~]# docker load -i nginx.tar.gz # 導入鏡像,也可以用-i選項導入
3.1.5 刪除鏡像
docker rmi 容器名稱/容器ID 或者 使用 docker image rm 容器名稱/容器ID
docker rmi -f 容器名稱/容器ID 強制刪除正在運行的鏡像
[root@centos-7 ~]# docker rmi nginx #刪除nginx鏡像 Untagged: nginx:latest Untagged: nginx@sha256:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce Deleted: sha256:c7460dfcab502275e9c842588df406444069c00a48d9a995619c243079a4c2f7 Deleted: sha256:3e51598e49c550f8b212a07c6ff2ed47a09eeb637f67d1b3c5468e9a8ee646e3 Deleted: sha256:a8b9a5643b3cc8082997d3d2fbaf4b53213ff80aa4169226be8b3768ae6e3605 Deleted: sha256:556c5fb0d91b726083a8ce42e2faaed99f11bc68d3f70e2c7bbce87e7e0b3e10 [root@centos-7 ~]# docker images #查看此時nginx鏡像已經被刪除 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0f3e07c0138f 3 months ago 220MB
3.2 容器操作
3.2.1 啟動容器
(1)格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(2)options 常用命令選項
- -t :打開一個終端,像使用交換機一樣使用容器
- -i:交互式訪問
- --name:容器名字
- --network:指定網絡
- --rm:容器一停,自動刪除
- -d:剝離與當前終端的關系;否則會一直占據着終端
- -p:端口映射,將容器內服務的端口映射在宿主機的指定端口
- -p <container port>
- -p <hostport>:<container port>
- -p <hostip>:<hostport>:<container port>
- 注:容器內的第一個進程必須一直處於運行的狀態,否則這個容器,就會處於退出狀態!
[root@centos-7 ~]# docker run -it -d centos # 運行當前的容器,加上-d在后端運行 48f2d90121f1cd1c71d28050c3400e3884e2e20cb65c9dfd6695182c8925ce25 [root@docker~]#docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 0901fa9da894 7 days ago 132MB centos 7 b5b4d78bc90c 2 months ago 203MB # 查看此時的centos鏡像ID號,也可以運行 centos centos7.7.1908 08d05d1d5859 8 months ago 204MB
[root@docker~]#docker run -it --name test b5b4d78bc90c /bin/bash # 我們也可以直接創建一個centos系統的別名test容器,並進入此容器中 [root@33803226975b /]# ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@33803226975b /]# uname -r 3.10.0-1127.13.1.el7.x86_64 [root@33803226975b /]# cat /etc/redhat-release #我們可以看到此時centos的版本號 CentOS Linux release 7.8.2003 (Core) [root@centos-7 ~]# docker ps #查看當前正在運行的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48f2d90121f1 centos "/bin/bash" 8 seconds ago Up 7 seconds bold_nobel
查看所有的容器,加上-a 選項:
[root@centos-7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48f2d90121f1 centos "/bin/bash" About a minute ago Up About a minute bold_nobel 99eee964898e centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago funny_margulis ba807033b43e centos "/bin/bash" 5 minutes ago Exited (127) 5 minutes ago vibrant_rosalind
激活關閉的容器
docker start
(1)格式
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
(2)Options:
- -a:附加到當前終端
- -i:交互式
(3)示例
[root@along ~]# docker start web1 web1 [root@along ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ced78e522fd7 nginx:1.14-alpine "nginx -g 'daemon ..." 9 minutes ago Up 8 seconds 0.0.0.0:8888->80/tcp web1
查看哪些容器退出的狀態
[root@centos-7 ~]# docker ps -f status=exited CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 753bc5b8528f nginx "nginx -g 'daemon of…" 10 hours ago Exited (255) 9 minutes ago 192.168.7.100:8080->80/tcp elastic_yonath 896ba395f88a nginx "nginx -g 'daemon of…" 10 hours ago Exited (0) 9 hours ago happy_antonelli 99eee964898e centos "/bin/bash" 10 hours ago Exited (0) 10 hours ago funny_margulis ba807033b43e centos "/bin/bash" 10 hours ago Exited (127) 10 hours ago v
3.2.2 刪除正在運行的容器
[root@centos-7 ~]# docker ps # 查看此時正在運行的容器ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48f2d90121f1 centos "/bin/bash" 3 minutes ago Up 3 minutes bold_nobel [root@centos-7 ~]# docker rm -f 48f2d90121f1 #刪除正在運行的容器ID,直接就刪除了容器 48f2d90121f1
刪除所有的容器,包括正在運行的容器,慎用!!!
[root@centos-7 ~]# docker rm -f `docker ps -a -q`
3.2.3 指定網絡端口映射
[root@centos-7 ~]# docker run -it -p 192.168.7.100:8080:80 nginx # 指定本地的IP地址8080端口映射到80端口上 [root@centos-7 ~]# docker run -it -p 192.168.7.100:80:80 nginx #指定80端口映射到80端口上
3.2.4 定義容器的名稱
[root@centos-7 ~]# docker run -it --name web1 -p 8080:80 centos #定義容器的名稱為web1,並將8080端口映射到容器的80端口上 [root@centos-7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6094b472014e centos "/bin/bash" 15 seconds ago Exited (127) 5 seconds ago web1
3.2.5 定義nginx多個端口映射
[root@centos-7 ~]# docker run -it -d --name web1 -p 80:80/tcp -p 443:443 nginx # 指定nginx多個映射端口,並命名為web1 027e950ea20b98581a78650c2b0dacd12ed689129307cda9d67fc071f8b12bba [root@centos-7 ~]# docker ps -a #查看此時的nginx名稱 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 027e950ea20b nginx "nginx -g 'daemon of…" 16 seconds ago Up 14 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp web1 [root@centos-7 ~]# docker port web1 # 查看指定的容器名稱對應映射的端口號,或者輸入容器的ID,也可以查詢此時的端口映射關系 80/tcp -> 0.0.0.0:80 443/tcp -> 0.0.0.0:443 [root@centos-7 ~]#
3.2.6 查看容器的logs日志
[root@centos-7 ~]# curl 192.168.7.100 # 在應一台主機進行測試 [root@centos-7 ~]# docker ps -a # 查看容器的ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6094b472014e centos "/bin/bash" 5 minutes ago Exited (127) 5 minutes ago web1 6acc34edcc9e nginx "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp xenodochial_turing [root@centos-7 ~]# docker logs 6acc34edcc9e #針對容器的ID進行分析log日志 192.168.7.101 - - [14/Jan/2020:01:35:44 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
3.2.7 創建容器並進入容器中
進去之后可以測試容器的環境變量是否正確,然后按exit退出
[root@centos-7 ~]# docker run -it --name test -p 8181:80/tcp nginx bash root@8e77653b9e56:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@8e77653b9e56:/# exit exit
3.2.8 單次測試容器環境
[root@centos-7 ~]# docker run -it --rm --name web2 -p 89:80 nginx bash # 單次運行,可以查看容器內部環境,退出后就會刪除web2名稱的容器 root@7394be55faca:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@7394be55faca:/# exit exit [root@centos-7 ~]# docker ps -a #查看此時沒有web2名稱的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b1593b435c7 nginx "bash" About a minute ago Up About a minute 0.0.0.0:88->80/tcp web1
3.2.9 重啟容器
[root@centos-7 ~]# docker ps -a #查看容器ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a9e5785999d nginx "bash" 17 seconds ago Exited (0) 6 seconds ago web442 f79459ede1da nginx "nginx -g 'daemon of…" 45 seconds ago Exited (0) 30 seconds ago web22 6b1593b435c7 nginx "bash" 4 minutes ago Up 4 minutes 0.0.0.0:88->80/tcp web1 [root@centos-7 ~]# docker stop 9a9e5785999d #停止容器ID 9a9e5785999d [root@centos-7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a9e5785999d nginx "bash" 29 seconds ago Exited (0) 18 seconds ago web442 f79459ede1da nginx "nginx -g 'daemon of…" 57 seconds ago Exited (0) 42 seconds ago web22 6b1593b435c7 nginx "bash" 4 minutes ago Up 4 minutes 0.0.0.0:88->80/tcp web1 [root@centos-7 ~]# docker start 9a9e5785999d #啟動容器ID 9a9e5785999d
3.2.10 使用exec命令進入正在運行的docker容器
[root@centos-7 ~]# docker ps -a # 查詢此時的ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a9e5785999d nginx "bash" 10 minutes ago Up 9 minutes 0.0.0.0:8111->80/tcp web442 f79459ede1da nginx "nginx -g 'daemon of…" 10 minutes ago Exited (0) 10 minutes ago web22 6b1593b435c7 nginx "bash" 14 minutes ago Up 14 minutes 0.0.0.0:88->80/tcp web1 [root@centos-7 ~]# docker exec -it 9a9e5785999d bash # 通過exec命令進入正在運行的容器 root@9a9e5785999d:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.2.11 使用nsenter和inspect命令對容器IP過濾(推薦使用)
[root@centos-7 ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" 9a9e5785999d 172.17.0.3 [root@centos-7 ~]# docker inspect -f "{{.NetworkSettings.Gateway}}" 9a9e5785999d 172.17.0.1
使用nsenter命令,需要安裝yum install util-linux -y
[root@centos-7 ~]# docker inspect -f "{{.State.Pid}}" 9a9e5785999d #需要先查詢PID號 8000 [root@centos-7 ~]# nsenter -t 8000 -m -u -i -n -p # 根據查詢的PID號進入到容器中 root@9a9e5785999d:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
創建一個腳本直接進入到容器中,k8s中比較常用
vim docker_in.sh
#!/bin/bash docker_in(){ NAME_ID=$1 PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID}) nsenter -t ${PID} -m -u -i -n -p } docker_in $1
執行腳本
[root@centos-7 ~]# docker ps -a #查看容器ID號 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14fa729e9d46 centos "centos -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp admiring_ritchie [root@centos-7 ~]# bash docker_in.sh 14fa729e9d46 #根據容器ID號進入到容器中 root@14fa729e9d46:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.2.11 查看容器內部的hosts文件
[root@centos-7 ~]# bash docker_in.sh ecb05e2a7543 [root@ecb05e2a7543 /]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 ecb05e2a7543 [root@ecb05e2a7543 /]# ping ecb05e2a7543 PING ecb05e2a7543 (172.17.0.3) 56(84) bytes of data. 64 bytes from ecb05e2a7543 (172.17.0.3): icmp_seq=1 ttl=64 time=0.048 ms ^C --- ecb05e2a7543 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
3.2.12 停止和開啟所有的容器
[root@centos-7 ~]# docker stop `docker ps -a -q` #停止所有容器 ecb05e2a7543 d75fe26c9cf5 14fa729e9d46 [root@centos-7 ~]# docker start `docker ps -a -q` #開啟所有容器 ecb05e2a7543 d75fe26c9cf5 14fa729e9d46
3.2.13 批量強制停止docker所有容器
[root@centos-7 ~]# docker kill `docker ps -a -q ` ecb05e2a7543 d75fe26c9cf5 14fa729e9d46
3.2.14 批量刪除已經退出狀態的容器
[root@centos-7 ~]# docker rm -fv `docker ps -aq -f status=exited` ecb05e2a7543 d75fe26c9cf5 14fa729e9d46 [root@centos-7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.2.15 指定容器的DNS
[root@centos-7 ~]# docker run -it --dns 223.6.6.6 centos bash #指定容器的阿里雲的dns地址 [root@d404a9217e8c /]# cat /etc/resolv.conf #查看dns的IP地址 nameserver 223.6.6.6 [root@d404a9217e8c /]# ping 223.6.6.6 # ping通dns地址 PING 223.6.6.6 (223.6.6.6) 56(84) bytes of data. 64 bytes from 223.6.6.6: icmp_seq=1 ttl=127 time=84.9 ms 64 bytes from 223.6.6.6: icmp_seq=2 ttl=127 time=36.3 ms ^C --- 223.6.6.6 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 2ms