主頁 > 作業系統 > Docker基礎和常用命令

Docker基礎和常用命令

2022-11-04 06:15:30 作業系統

Docker基礎和常用命令

一,Docker 簡介

1.1,什么是 Docker

Docker 使用 Google 公司推出的 Go 語言 進行開發實作,基于 Linux 內核的 cgroup,namespace,以及 OverlayFS 類的 Union FS 等技術,對行程進行封裝隔離,屬于作業系統層面的虛擬化技術,由于隔離的行程獨立于宿主和其它的隔離的行程,因此也稱其為容器,Docker容器與虛擬機類似,但二者在原理上不同,容器是將作業系統層虛擬化,虛擬機則是虛擬化硬體,因此容器更具有便攜性、能更高效地利用服務器,

專業名詞 Docker 有兩個意思:

  • 代指整個 Docker 專案,
  • 代指 Docker 引擎,

Docker 引擎(Docker Engine)是指一個服務端-客戶端結構的應用,主要有這些部分:Docker 守護行程、Docker Engine API(頁面存檔備份,存于互聯網檔案館)、Docker 客戶端,

1.2,Docker 與虛擬機的區別

  • 傳統虛擬機技術是虛擬出一套硬體后,在其上運行一個完整作業系統,在該系統上再運行所需應用行程,
  • Docker 容器內的應用行程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬體虛擬,因此容器要比傳統虛擬機更為輕便,
特性 Docker 虛擬機
啟動 秒級 分鐘級
硬碟使用 一般為 MB 一般為 GB
性能 接近原生 弱于
系統支持量 單機支持上千個容器 一般幾十個

1.3,Docker 架構

image

runc 是一個 Linux 命令列工具,用于根據 OCI容器運行時規范 創建和運行容器,
containerd 是一個守護程式,它管理容器生命周期,提供了在一個節點上執行容器和管理鏡像的最小功能集,

1.4,為什么用 Docker

Docker 作為一種新的虛擬化技術,跟傳統的虛擬化技術相比具有眾多的優勢:

  1. 更高效的利用系統資源:不需要進行硬體虛擬以及運行完整作業系統等額外開銷,Docker 對系統資源的利用率更高,
  2. 更快速的啟動時間:Docker 容器應用直接運行于宿主內核,不需要啟動完整的作業系統,所以啟動時間可做到秒級的啟動時間,
  3. 一致的運行環境:Docker 鏡像提供了除內核外完整的運行時環境,確保開發環境、測驗環境、生產環境的一致性,
  4. 持續交付和部署:開發人員可以通過 Dockerfile 來進行鏡像構建,并結合持續集成(Continuous Integration) 系統進行集成測驗,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署,
  5. 更輕松的遷移:Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的,
  6. 更輕松的維護和擴展,

二,Docker 基本概念

Docker 三個基本概念:

  • 鏡像(Image)
  • 容器(Container)
  • 倉庫(Repository)

2.1,鏡像

作業系統分為內核和用戶空間,對于 Linux 而言,內核啟動后,會掛載 root 檔案系統為其提供用戶空間支持,而 Docker 鏡像(Image),就相當于是一個 root 檔案系統,比如官方鏡像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系統的 root 檔案系統,

Docker 鏡像 是一個特殊的檔案系統,除了提供容器運行時所需的程式、庫、資源、配置等檔案外,還包含了一些為運行時準備的一些配置引數(如匿名卷、環境變數、用戶等),鏡像 不包含 任何動態資料,其內容在構建之后也不會被改變,

Docker 鏡像并非是像一個 ISO 那樣的打包檔案,鏡像只是一個虛擬的概念,其實際體現并非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成,其被設計為分層存盤的架構,鏡像構建時,會一層層構建,前一層是后一層的基礎,每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層,分層存盤的特征還使得鏡像的復用、定制變的更為容易,甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像,

2.2,容器

鏡像(Image)和容器(Container)的關系,類似面向物件程式設計中的類和實體的關系,可以把 Docker容器(Container) 看做是一個簡易版的 Linux 環境(包括 root 用戶權限、行程空間、用戶空間和網路空間等)和運行在其中的應用程式,它可以被啟動、開始、停止、 洗掉,

容器的實質是行程,但與直接在宿主執行的行程不同,容器行程運行于屬于自己的獨立的 命名空間,因此容器可以擁有自己的 root 檔案系統、自己的網路配置、自己的行程空間,甚至自己的用戶 ID 空間,容器內的行程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣,

容器和鏡像一樣都是使用分層存盤,每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存盤層,我們可以稱這個為容器運行時讀寫而準備的存盤層為容器存盤層

2.3,倉庫

鏡像構建完成后,可以很容器的在當前宿主主機上運行,但是如果需要在其他服務器上使用這個鏡像,我們就需要一個集中的存盤、分發鏡像的服務,Docker Registry 就是這樣的服務,

一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標簽(Tag);每個標簽對應一個鏡像,

通常,一個倉庫會包含同一個軟體不同版本的鏡像,而標簽就常用于對應該軟體的各個版本,我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟體哪個版本的鏡像,如下所示:

registry.sensetime.com/kestrel_tatraffic/kestrel_tatraffic:kestrel_cuda11_1.2.21_opencv3.4.13_with_ffmpeg

Docker倉庫(Registry) 分為公開倉庫(Public)和私有倉庫(Private)兩種形式,最大的公開倉庫是 Docker Hub, 存放了數量龐大的鏡像供用戶下載,國內的公開倉庫包括 Docker Pool 等,可以提供大陸用戶更穩定快速的訪問,私有倉庫是指用戶在本地搭建的私有 Docker Registry,

三,Docker 使用

3.1,Docker 服務

安裝 Docker 這里不做介紹,以下是 Linux 系統下,一些 docker 使用命令:

1,查看 Docker 服務狀態:使用 systemctl status docker 命令查看 Docker 服務的狀態,其中 Active: active (running) 即表示 Docker 服務為正在運行狀態,

image

2,停止 Docker 服務:使用 systemctl stop docker 命令,

3,啟動 Docker 服務:使用 systemctl start docker 命令,

4,重啟 Docker 服務:使用 systemctl restart docker 命令,

5,測驗 Docker 是否安裝正確

$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
7050e35b49f5: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
 
Hello 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.
    (arm64v8)
 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://hub.docker.com/
 
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

3.2,下載與使用Docker公共鏡像(Images)

1,使用 docker search 命令從 Docker Repo 搜索 Dokcer 可用的鏡像,示例命令:docker search ubuntu18.04

image

2,使用 docker image pull 命令從 Docker Repo 獲取指定的 Dokcer鏡像(Images),示例命令: docker image pull docker.io/hello-world,拉取名為 docker.io/hello-world 的鏡像,

image

3,使用 docker image ls 命令查看本地的 Dokcer 鏡像(Images),

4,使用 docker run 命令運行 Dokcer 鏡像(Images),示例命令:docker run hello-world

image

5,使用 docker info 命令,查看當前 docker容器 的所有的資訊,

image

6,使用 docker version 查看容器的版本資訊,

$ dockerd --versio # 這個命令查看 docker 版本更簡單
Docker version 19.03.13, build 4484c46d9d

image

四,Docker 鏡像命令

Docker鏡像(Images) 也可以理解為是一個用于創建 Docker容器(Container) 的靜態模板,一個 Docker鏡像(Images) 可以創建很多 Docker容器(Container),

Docker 鏡像常用命令如下:

命令 描述
docker commit 創建鏡像,
docker images 查看鏡像資訊,
docker load 匯入鏡像,
docker pull 拉取 Docker 鏡像,
docker push 上傳鏡像,
docker rmi 洗掉鏡像,
docker save 匯出鏡像,
docker search 在 Docker Hub 搜索鏡像,
docker tag 為鏡像打標簽,

五,Docker 容器命令

5.1,docker run 命令

通過 docker run 命令可以基于鏡像新建一個容器并啟動,語法如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

其他常用容器管理命令如下:

# 新建容器并啟動
$ docker run [鏡像名/鏡像ID]
# 啟動已終止容器
$ docker start [容器ID]
# 列出本機運行的容器
$ docker ps
# 停止運行的容器
$ docker stop [容器ID]
# 殺死容器行程
$ docker kill [容器ID]
# 重啟容器
$ docker restart [容器ID]

docker run命令語法

1, docker run 命令常用選項:可通過 docker run --help 命令查看全部內容,

選項 說明
-d, --detach=false 指定容器運行于前臺還是后臺,默認為 false,
-i, --interactive=false 打開 STDIN,用于控制臺互動,
-t, --tty=false 分配 tty 設備,該可以支持終端登錄,默認為 false,
-u, --user="" 指定容器的用戶,
-a, --attach=[] 登錄容器(必須是以 docker run -d 啟動的容器),
-w, --workdir="" 指定容器的作業目錄,
-c, --cpu-shares=0 設定容器 CPU 權重,在 CPU 共享場景使用,
-e, --env=[] 指定環境變數,容器中可以使用該環境變數,
-m, --memory="" 指定容器的記憶體上限,
-P, --publish-all=false 指定容器暴露的埠,
-p, --publish=[] 指定容器暴露的埠,
-h, --hostname="" 指定容器的主機名,
-v, --volume=[] 給容器掛載存盤卷,掛載到容器的某個目錄,
–volumes-from=[] 給容器掛載其他容器上的卷,掛載到容器的某個目錄,
–cap-add=[] 添加權限,
–cap-drop=[] 洗掉權限,
–cidfile="" 運行容器后,在指定檔案中寫入容器 PID 值,一種典型的監控系統用法,
–cpuset="" 設定容器可以使用哪些 CPU,此引數可以用來容器獨占 CPU,
–device=[] 添加主機設備給容器,相當于設備直通,
–dns=[] 指定容器的 dns 服務器,
–dns-search=[] 指定容器的 dns 搜索域名,寫入到容器的 /etc/resolv.conf 檔案,
–entrypoint="" 覆寫 image 的入口點,
–env-file=[] 指定環境變數檔案,檔案格式為每行一個環境變數,
–expose=[] 指定容器暴露的埠,即修改鏡像的暴露埠,
–link=[] 指定容器間的關聯,使用其他容器的 IP、env 等資訊,
–lxc-conf=[] 指定容器的組態檔,只有在指定 --exec-driver=lxc 時使用,
–name="" 指定容器名字,后續可以通過名字進行容器管理,links 特性需要使用名字,
–net=“bridge” 器網路設定:
1. bridge 使用 docker daemon 指定的網橋,
2. host //容器使用主機的網路,
3. container:NAME_or_ID >//使用其他容器的網路,共享 IP 和 PORT 等網路資源,
4. none 容器使用自己的網路(類似–net=bridge),但是不進行配置,
–privileged=false 指定容器是否為特權容器,特權容器擁有所有的 capabilities,
–restart=“no” 指定容器停止后的重啟策略:
1. no:容器退出時不重啟,
2. on-failure:容器故障退出(回傳值非零)時重啟,
3. always:容器退出時總是重啟,
–rm=false 指定容器停止后自動洗掉容器(不支持以 docker run -d 啟動的容器),
–sig-proxy=true 設定由代理接受并處理信號,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理,

示例:kestrel 人群等 sdk 使用運行容器的腳本如下:

export BUILDER=registry.sensetime.com/kestrel_tatraffic/kestrel_tatraffic:kestrel_cuda11_1.2.21_opencv3.4.13_with_ffmpeg
# -t 選項讓Docker分配一個偽終端(pseudo-tty)并系結到容器的標準輸入上, -i 則讓容器的標準輸入保持打開,
# --rm 指定容器停止后自動洗掉容器
# --net=host 容器使用主機的網路
# --ipc 要使用的 IPC 模式
# --ipc=host
# -e 指定環境變數,容器中可以使用
# --privileged 指定容器是否為特權容器,特權容器擁有所有的 capabilities
# -u 指定容器的用戶為 root
# -entrypoint=bash 覆寫 image 的入口點
# -v 給容器掛載存盤卷,掛載到容器的 /kestrel_baggage
# 指定容器的作業目錄為 /kestrel_baggage
# ${BUILDER} 為運行的鏡像
docker run --gpus '"device=0"' -it --rm --net=host --ipc=host \
                    -e DISPLAY=$DISPLAY \
                    --privileged \
                    -e XAUTHORITY=$XAUTH \
                    -u root \
                    --entrypoint=bash \
                    --ulimit core=-1 \
                    --security-opt seccomp=unconfined \
                    -v ${PWD}:/kestrel_baggage \
                    -w /kestrel_baggage \
                    ${BUILDER}

2,Docker互動式運行的語法為:docker run -i -t IMAGE [COMMAND] [ARG] ,Docker互動式運行,即 Docker 啟動直接進入 Docker 鏡像內部,

image

3,使用 docker ps 命令,查看正在運行的 docker

image

六,參考資料

  • Docker-從入門到實踐
  • Docker教程

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/526754.html

標籤:Linux

上一篇:虛擬機和Ubuntu的安裝

下一篇:UBOOT編譯--- include/config/auto.conf、 include/config/auto.conf.cmd、 include/generated/autoconf.h (二)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more