Docker 入門

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

配置鏡像加速器

騰訊云鏡像加速器

  1. 創(chuàng)建或修改 /etc/docker/daemon.json 文件,并寫入以下內(nèi)容:
{
   "registry-mirrors": [
       "https://mirror.ccs.tencentyun.com"
  ]
}
  1. 依次執(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ū)動目錄下面,如 aufsdevicemapper 。也可以在 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 會報錯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Docker從入門到實踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,641評論 1 39
  • 不管是作為開發(fā)還是架構(gòu),都有必要了解容器技術(shù),它不僅可以幫助我們了解程序運行時的情況,也能在平時給我們軟件安裝方面...
    佐藍(lán)Gogoing閱讀 630評論 0 0
  • Docker入門 Docker命令官方示例 [toc] 1. Docker架構(gòu) 1.1 Docker鏡像與Dock...
    CaiGuangyin閱讀 1,956評論 2 6
  • 《Docker技術(shù)入門與實踐》筆記 2 核心概念 Docker的三個核心概念分別為:鏡像、容器和倉庫。 2.1 鏡...
    涵仔睡覺閱讀 443評論 0 0
  • 基本概念 鏡像Docker 鏡像就是一個只讀的模板,鏡像可以用來創(chuàng)建 Docker 容器 容器容器是從鏡像創(chuàng)建的運...
    巨子聯(lián)盟閱讀 7,800評論 0 3

友情鏈接更多精彩內(nèi)容