2020-03-02
使用幫助,每個命令后加入--help即可加入幫助。例如:
docker image --help
docker ps --help
CentOS下安裝Docker
Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker。
- 通過
uname -r命令查看你當(dāng)前的內(nèi)核版本
[root@VM_0_7_centos ~]# uname -r
3.10.0-957.5.1.el7.x86_64
- 卸載舊版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 使用
yum安裝依賴包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
鑒于國內(nèi)網(wǎng)絡(luò)問題,強烈建議使用國內(nèi)源,官方源請在注釋中查看。
sudo yum-config-manager \
--add-repo \
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 官方源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
如果需要最新版本的 Docker CE 請使用以下命令:
sudo yum-config-manager --enable docker-ce-edge
如果需要測試版本的 Docker CE 請使用以下命令:
sudo yum-config-manager --enable docker-ce-test
- 安裝 Docker CE
sudo yum install docker-ce
- 也可以使用
yum源直接安裝 Docker
sudo yum -y install docker
- 啟動 Docker 后臺服務(wù)
[root@VM_0_7_centos ~]# service docker start
Ubuntu 下安裝Docker
- 卸載舊版本
sudo apt-get remove docker docker-engine docker.io containerd runc
- 卸載 docker 引擎
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
- 使用腳本安裝
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
建立 Docker 用戶組
默認(rèn)情況下, docker 命令會使用 Unix socket 與 Docker 引擎通訊。而只有 root 用戶和 docker 組的用戶才可以訪問 Docker 引擎的 Unix socket。出于安全考慮,一般 Linux 系統(tǒng)上不會直接使用 root 用戶。因此,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組。
建立 docker 組:
sudo groupadd docker
將當(dāng)前用戶加入 docker 組:
sudo usermod -aG docker $USER
配置鏡像加速器
- 創(chuàng)建或修改
/etc/docker/daemon.json文件,并寫入以下內(nèi)容:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
- 依次執(zhí)行以下命令,重新啟動 Docker 服務(wù)。
sudo systemctl daemon-reload
sudo systemctl restart docker
# Ubuntu16.04 請執(zhí)行 sudo systemctl restart dockerd 命令
檢查加速器是否生效:
執(zhí)行 docker info 命令,返回結(jié)果中包含以下內(nèi)容,則說明配置成功。
Registry Mirrors:
https://mirror.ccs.tencentyun.com
Docker的生命周期管理常用命令:
docker image ls列表中的鏡像體積總和并非是所有鏡像實際硬盤消耗。由于 Docker 鏡像是多層存儲結(jié)構(gòu),并且可以繼承、復(fù)用,因此不同鏡像可能會因為使用相同的基礎(chǔ)鏡像,從而擁有共同的層。由于 Docker 使用 Union FS,相同的層只需要保存一份即可,因此實際鏡像硬盤占用空間很可能要比這個列表鏡像大小的總和要小的多。
- 查看鏡像、容器、數(shù)據(jù)卷占用實際存儲空間
docker system df
- 啟動Docker
systemctl start docker
- 停止Docker
systemctl stop docker
- 重啟Docker
systemctl restart docker
- 查看Docker服務(wù)狀態(tài)
systemctl status docker
- 設(shè)置開機啟動Docker服務(wù)
systemctl enable docker
鏡像
鏡像是構(gòu)建 Docker 世界的基石。用戶基于鏡像來運行自己的容器。鏡像也是 Docker 聲明周期中的“構(gòu)建”部分。鏡像是基于聯(lián)合(Union)文件系統(tǒng)的一種層式的結(jié)構(gòu),由一系列指令一步一步構(gòu)建出來。
本地鏡像都保存在 Docker 宿主機的
var/lib/docker目錄下。每個鏡像都保存在 Docker 是采用的存儲驅(qū)動目錄下面,如aufs或devicemapper。也可以在var/lib/docker/containers目錄下面看到所有的容器。
- 查看本地所有鏡像
docker images
docker images -q # 查看本地所有鏡像id
- 查看部分鏡像
docker images 鏡像名
- 搜索鏡像(也可在docker hub上查找)
docker search 鏡像名稱
- 拉取鏡像
docker pull 鏡像名稱[:版本]
- 刪除本地鏡像
docker rmi 鏡像 id 或名稱
docker rmi `docker images -a -q` # 刪除本地所有鏡像
- 虛懸鏡像(dangling)
無倉庫名和標(biāo)簽,均為<None> - 顯示虛懸鏡像
docker images -f dangling=true
- 刪除虛懸鏡像
docker image prune
- 查看鏡像內(nèi)的歷史記錄
可以看到鏡像是如何構(gòu)建出來的,及docker build命令的執(zhí)行輸出過程。
docker history 鏡像名
- 中間層鏡像
docker images只會顯示頂層鏡像;docker images -a顯示包括中間層鏡像在內(nèi)的所有鏡像,這樣會看到許多無標(biāo)簽鏡像,這些不是虛懸鏡像,而是中間層鏡像,是其他鏡像的依賴,不應(yīng)該刪除,否則會出錯。
容器
鏡像是多層存儲,每一層是在前一層的基礎(chǔ)上進(jìn)行的修改;而容器同樣也是多層存儲,是在以鏡像為基礎(chǔ)層,在其基礎(chǔ)上加一層作為容器運行時的存儲層。容器是基于鏡像啟動起來的,容器中可以運行一個或多個進(jìn)程??梢哉J(rèn)為,鏡像是 Docker 聲明周期中的構(gòu)建或打包階段,而容器則是啟動或執(zhí)行階段。
- 查看容器
docker ps # 查看正在運行的容器
docker ps -a # 查看所有容器
docker ps -qa # 查看所有容器 ID
- 創(chuàng)建并啟動容器
docker run 參數(shù)
docker run --name webserver -d -p 80:80 nginx
這條命令會用 nginx 鏡像啟動一個容器,命名為 webserver ,并且映射了 80 端口,這樣我們可以用瀏覽器去訪問這個 nginx 服務(wù)器。
| 參數(shù)說明 | |
|---|---|
| -i | 保持容器標(biāo)準(zhǔn)輸入打開(interactive),通常與 -t 同時使用 |
| -t | 為容器重新分配一個偽輸入終端(pseudo-tty) |
| -d | 以守護(hù)(后臺)模式運行容器;需要使用docker exec命令進(jìn)入容器,退出后,容器不會關(guān)閉 |
| --name | 為創(chuàng)建的容器命名 |
| --rm | 容器退出后立即將其刪除 |
- 查看容器改動情況
docker diff 容器名
- 將容器保存為鏡像
當(dāng)我們運行一個容器的時候(如果不使用卷的話),我們做的任何文件修改都會被記錄于容器存儲層里。而 Docker 提供了一個docker commit命令,可以將容器的存儲層保存下來成為鏡像。換句話說,就是在原有鏡像的基礎(chǔ)上,再疊加上容器的存儲層,并構(gòu)成新的鏡像。以后我們運行這個新鏡像的時候,就會擁有原有容器最后的文件變化。
docker commit 的語法格式為:
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標(biāo)簽>]]
docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默認(rèn)網(wǎng)頁" \
webserver \
nginx:v2
其中 --author 是指定修改的作者,而 --message 則是記錄本次修改的內(nèi)容。這點和 git 版本控制相似,不過這里這些信息可以省略留空。
- 進(jìn)入容器
docker attach 容器名稱 # 退出容器后,容器會關(guān)閉
docker exec 容器名稱 # 退出容器后,容器不會關(guān)閉
- 停止容器
docker stop 容器名稱
- 啟動容器
docker start 容器名稱
- 重新啟動容器
docker restart 容器名稱
- 暫停容器
docker pause 容器名稱
- 繼續(xù)已經(jīng)暫停的容器
docker unpause 容器名稱
- 刪除容器(若容器為運行狀態(tài)則無法刪除,需先停止容器;但是可加入
-f參數(shù)強制刪除容器)
docker rm 容器名稱
# 刪除所有容器
docker rm $(docker ps -qa) # -a 會列出所有容器,-q 表示只需要返回容器的 ID
- 查看容器信息
docker inspect命令會對容器進(jìn)行詳細(xì)的檢查,然后返回其配置信息,包括名稱、命令、網(wǎng)絡(luò)配置以及很多有用的數(shù)據(jù)。
docker inspect 容器名稱
除了查看容器,還可以通過瀏覽
/var/lib/docker目錄來深入了解Docker的工作原理。該目錄存放著Docker鏡像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers目錄下。
- 查看容器日志
docker logs 容器名稱 # 輸出最后幾條日志項并返回
docker logs -f 容器名稱 # 監(jiān)控Docker 日志
docker logs -tf 容器名稱 # 監(jiān)控Docker 日志并打印時間戳
- 查看容器內(nèi)部運行的進(jìn)程
docker top 容器名
- 查看一個或多個容器的統(tǒng)計信息(類似
top命令,實時監(jiān)控)
docker stats 容器名[可以有多個容器名]
我們能看到一個守護(hù)式容器的列表,以及它們的 CPU,內(nèi)存,網(wǎng)絡(luò)IO及存儲 IO 的性能和指標(biāo)。這對快速監(jiān)控一臺主機上的一組容器非常有用。
- 自動重啟容器
如果由于某種錯誤而導(dǎo)致容器停止運行,還可以通過--restart標(biāo)
志,讓Docker自動重新啟動該容器。--restart標(biāo)志會檢查容器的
退出代碼,并據(jù)此來決定是否要重啟容器。默認(rèn)的行為是Docker不會
重啟容器。
docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
在本例中,--restart 標(biāo)志被設(shè)置為 always 。無論容器的退出代碼是什么,Docker都會自動重啟該容器。除了always ,還可以將這個標(biāo)志設(shè)為 on-failure ,這樣,只有當(dāng)容器的退出代碼為非 0 值的時候,才會自動重啟。另外,on-failure 還接受一個可選的重啟次數(shù)參數(shù):
--restart=on-failure:5
這樣,當(dāng)容器退出代碼為非0時,Docker會嘗試自動重啟該容器,最多重啟5次。
- 清理所有處于中止?fàn)顟B(tài)的容器
docker container prune
- 導(dǎo)出容器
docker export 容器名
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited
(0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar
這樣將導(dǎo)出容器快照到本地文件。
- 導(dǎo)入容器快照
可以使用docker import從容器快照文件中再導(dǎo)入為鏡像。
docker import 容器名
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3MB
此外,也可以通過指定 URL 或者某個目錄來導(dǎo)入,例如
$ docker import http://example.com/exampleimage.tgz example/imagerepo
注:用戶既可以使用
docker load來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用docker import來導(dǎo)入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時可以重新指定標(biāo)簽等元數(shù)據(jù)信息。
容器和宿主的文件復(fù)制(雙向)
docker cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
- 把容器做成鏡像(不推薦此種方式)
docker commit
數(shù)據(jù)卷
數(shù)據(jù)卷是用來持久化數(shù)據(jù)的,其生命周期獨立于容器,容器刪除后,不會刪除數(shù)據(jù)卷,也不存在垃圾回收。
- 創(chuàng)建數(shù)據(jù)卷
docker volume create 名稱
- 查看所有數(shù)據(jù)卷
docker volume ls
- 主機中查看指定數(shù)據(jù)卷信息
docker volume inspect 名稱
- 刪除數(shù)據(jù)卷
docker volume rm 名稱
docker rm -v 容器名稱 # 刪除容器時,使用 -v 參數(shù)可以同時移除數(shù)據(jù)卷
- 清理無主數(shù)據(jù)卷
docker volume prune
- 配置數(shù)據(jù)卷
創(chuàng)建啟動容器時,使用-v參數(shù)設(shè)置數(shù)據(jù)卷,多次使用-v標(biāo)記可以創(chuàng)建多個數(shù)據(jù)卷
使用
-v時,若本地目錄不存在則自動創(chuàng)建
使用--mount(推薦),若本地目錄不存在則報錯。使用--mount標(biāo)記可以指定掛載一個本地主機的目錄到容器中去
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
使用 --mount 標(biāo)記可以指定掛載一個本地主機的目錄到容器中去。--mount 標(biāo)記也可以從主機掛載單個文件到容器中。上面的命令加載主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄。本地目錄的路徑必須是絕對路徑,以前使用 -v 參數(shù)時如果本地目錄不存在 Docker 會自動為你創(chuàng)建一個文件夾,現(xiàn)在使用 --mount 參數(shù)時如果本地目錄不存在,Docker 會報錯。