Docker安装与镜像的使用
大數(shù)據(jù)技術AI
Flink/Spark/Hadoop/數(shù)倉,數(shù)據(jù)分析、面試,源碼解讀等干貨學習資料
102篇原創(chuàng)內(nèi)容
公眾號
1、docker簡介
=============
1.1 什么是docker
docker官網(wǎng)地址:https://docs.docker.com/
Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國期間發(fā)起的一個公司內(nèi)部項目,它是基于 dotCloud 公司多年云服務技術的一次革新,并于 2013 年 3 月以 Apache 2.0 授權協(xié)議開源,主要項目代碼在 GitHub 上進行維護。Docker 項目后來還加入了 Linux 基金會,并成立推動開放容器聯(lián)盟(OCI)。
Docker 使用 Google 公司推出的 Go 語言進行開發(fā)實現(xiàn),基于 Linux 內(nèi)核的 cgroup,namespace,以及 OverlayFS 類的 Union FS 等技術,對進程進行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。最初實現(xiàn)是基于 LXC,從 0.7 版本以后開始去除 LXC,轉而使用自行開發(fā)的 libcontainer,從 1.11 開始,則進一步演進為使用 runC 和 containerd。
Docker 在容器的基礎上,進行了進一步的封裝,從文件系統(tǒng)、網(wǎng)絡互聯(lián)到進程隔離等等,極大的簡化了容器的創(chuàng)建和維護。使得 Docker 技術比虛擬機技術更為輕便、快捷。
1.2 為什么要用docker
1.2.1 docker的優(yōu)勢
- 更高效的利用系統(tǒng)資源
由于容器不需要進行硬件虛擬以及運行完整操作系統(tǒng)等額外開銷,Docker 對系統(tǒng)資源的利用率更高。無論是應用執(zhí)行速度、內(nèi)存損耗或者文件存儲速度,都要比傳統(tǒng)虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數(shù)量的應用。
- 更快速的啟動時間
傳統(tǒng)的虛擬機技術啟動應用服務往往需要數(shù)分鐘,而 Docker 容器應用,由于直接運行于宿主內(nèi)核,無需啟動完整的操作系統(tǒng),因此可以做到秒級、甚至毫秒級的啟動時間。大大的節(jié)約了開發(fā)、測試、部署的時間。
- 一致的運行環(huán)境
開發(fā)過程中一個常見的問題是環(huán)境一致性問題。由于開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境不一致,導致有些 bug 并未在開發(fā)過程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內(nèi)核外完整的運行時環(huán)境,確保了應用運行環(huán)境一致性,從而不會再出現(xiàn) 「這段代碼在我機器上沒問題啊」 這類問題。
- 持續(xù)交付和部署
對開發(fā)和運維(DevOps)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行。
使用 Docker 可以通過定制應用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付、部署。開發(fā)人員可以通過 Dockerfile 來進行鏡像構建,并結合持續(xù)集成(Continuous Integration) 系統(tǒng)進行集成測試,而運維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像,甚至結合 持續(xù)部署(Continuous Delivery/Deployment) 系統(tǒng)進行自動部署。
而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發(fā)團隊可以理解應用運行環(huán)境,也方便運維團隊理解應用運行所需條件,幫助更好的生產(chǎn)環(huán)境中部署該鏡像。
- 更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環(huán)境的變化導致應用無法正常運行的情況。
- 更輕松的維護和擴展
Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接在生產(chǎn)環(huán)境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。
1.2.2 docker與傳統(tǒng)虛擬機的比較
| 啟動 | 秒級 | 分鐘級 |
| 硬盤使用 | 一般為 MB | 一般為 GB |
| 性能 | 接近原生 | 弱于 |
| 系統(tǒng)支持量 | 單機支持上千個容器 | 一般幾十個 |
| 隔離性 | 安全隔離 | 完全隔離 |
2、docker的核心概念
Docker 包括三個基本概念
-
鏡像(Image)
-
容器(Container)
-
倉庫(Repository)
理解了這三個概念,就理解了 Docker 的整個生命周期。
2.0 Docker架構
Docker使用客戶端 - 服務器架構。Docker客戶端與Docker守護程序交談,該守護程序是大量的建筑,運行和分配您的Docker容器。Docker客戶端和守護程序可以在同一系統(tǒng)上運行,或者您可以將Docker客戶端連接到遠程Docker守護程序。Docker客戶端和守護進程使用REST API進行通信,通過UNIX套接字或網(wǎng)絡接口。另一個Docker客戶端是Docker撰寫,可允許您使用由一組容器組成的應用程序。
2.1 鏡像(Image)
Docker鏡像類似于一個虛擬機鏡像(xxx.iso), 可以將它理解為一個只讀的模板!
例如, 一個鏡像可以包含一個基本的操作系統(tǒng)環(huán)境, 里面僅安裝了 Apache應用程序(或用戶需要的其他軟件). 可以把它稱為Apache鏡像.
鏡像是創(chuàng)建Docker容器的基礎.
通過版本管理和增量的文件系統(tǒng), Docker提供了一套十分簡單的機制來創(chuàng)建和更新現(xiàn)有的鏡像, 用戶甚至可以從網(wǎng)上下載一個已經(jīng)做好的應用鏡像, 并直接使用它.
2.2 容器(Container)
Docker 容器類似于一個輕量級的沙箱, Docker 利用容器來運行和隔離應用。
容器是從鏡像創(chuàng)建的應用運行實例。它可以啟動、開始、停止、刪除,而這些容器都是彼此相互隔離、互不可見的。
可以把容器看作一個簡易版的 Linux 系統(tǒng)環(huán)境(包括 root 用戶權限、進程空間、用戶空間和網(wǎng)絡空間等)以及運行在其中的應用程序打包而成的盒子。
注意:
-
鏡像自身是只讀的。
-
容器從鏡像啟動的時候,會在鏡像的最上層創(chuàng)建一個可寫層。
2.3 倉庫(Repository)
Docker 倉庫類似于代碼倉庫,是 Docker 集中存放鏡像文件的場所
根據(jù)所存儲的鏡像公開分享與否, Docker 倉庫可以分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
目前,最大的公開倉庫是官方提供的 Docker Hub ,其中存放著數(shù)量龐大的鏡像供用戶下載。國內(nèi)不少云服務提供商(如騰訊云 、 阿里云等)也提供了倉庫的本地源,可以提供穩(wěn)定的國內(nèi)訪問 。
當然,用戶如果不希望公開分享自己的鏡像文件, Docker 也支持用戶在本地網(wǎng)絡內(nèi)創(chuàng)建一個只能自己訪問的私有倉庫。
當用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到指定的公有或者私有倉庫。這樣用戶下次在另外一臺機器上使用該鏡像時,只需要將其從倉庫上 pull 下來就可以了。
3、Centos安裝Docker引擎
Docker 目前支持 CentOS 7 及以后的版本, 內(nèi)核版本必須是3.10.
查看操作系統(tǒng)版本: cat /etc/redhat-release
[root@hadoop01 root]$ cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)查看內(nèi)核版本: uname -r
[root@hadoop01 root]$ uname -r3.10.0-862.el7.x86_643.1 卸載舊版本
官網(wǎng)說明:https://docs.docker.com/engine/install/centos/
舊版本的 Docker 被叫做 docker 或 docker-engine,如果安裝了舊版本的 Docker ,需要卸載掉它。
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine [root@hadoop01 root]$ sudo yum remove docker \> docker-client \> docker-client-latest \> docker-common \> docker-latest \> docker-latest-logrotate \> docker-logrotate \> docker-engine[sudo] duo 的密碼:已加載插件:fastestmirror, langpacks參數(shù) docker 沒有匹配參數(shù) docker-client 沒有匹配參數(shù) docker-client-latest 沒有匹配參數(shù) docker-common 沒有匹配參數(shù) docker-latest 沒有匹配參數(shù) docker-latest-logrotate 沒有匹配參數(shù) docker-logrotate 沒有匹配參數(shù) docker-engine 沒有匹配不刪除任何軟件包3.2 安裝Docker方法一
官網(wǎng)安裝地址:https://docs.docker.com/engine/install/centos/
3.2.1 安裝依賴的軟件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm23.2.2 添加Docker文檔版本的yum源
官方的yum源安裝docker比較慢, 我們配置國內(nèi)比較快的yum源(阿里云)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.2.3 安裝最新版本的docker引擎(社區(qū)版)
sudo yum -y install docker-ce docker-ce-cli containerd.io3.3 安裝Docker方法二:使用腳本自動安裝
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun注意:自動安裝腳本會自動檢測系統(tǒng)信息并進行相應配置
[root@hadoop01 root]$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun# Executing docker install script, commit: 93d2499759296ac1f9c510605fef85052a2c32be+ sudo -E sh -c 'yum install -y -q yum-utils'+ sudo -E sh -c 'yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docke r-ce.repo'已加載插件:fastestmirror, langpacksadding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repograbbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/doc ker-ce.reporepo saved to /etc/yum.repos.d/docker-ce.repo+ '[' stable '!=' stable ']'+ sudo -E sh -c 'yum makecache'已加載插件:fastestmirror, langpacksLoading mirror speeds from cached hostfile* base: mirrors.ustc.edu.cn* centos-sclo-rh: mirrors.ustc.edu.cn* centos-sclo-sclo: mirrors.ustc.edu.cn* extras: mirrors.ustc.edu.cn* updates: mirrors.ustc.edu.cnbase | 3.6 kB 00:00:00centos-sclo-rh | 3.0 kB 00:00:00centos-sclo-sclo | 3.0 kB 00:00:00docker-ce-stable | 3.5 kB 00:00:00extras | 2.9 kB 00:00:00updates | 2.9 kB 00:00:00(1/12): docker-ce-stable/7/x86_64/filelists_db | 29 kB 00:00:00(2/12): docker-ce-stable/7/x86_64/updateinfo | 55 B 00:00:00(3/12): centos-sclo-sclo/x86_64/filelists_db | 935 kB 00:00:00(4/12): centos-sclo-sclo/x86_64/other_db | 185 kB 00:00:01(5/12): extras/7/x86_64/filelists_db | 259 kB 00:00:00(6/12): docker-ce-stable/7/x86_64/primary_db | 70 kB 00:00:01(7/12): docker-ce-stable/7/x86_64/other_db | 122 kB 00:00:00(8/12): extras/7/x86_64/other_db | 145 kB 00:00:00(9/12): updates/7/x86_64/filelists_db | 7.0 MB 00:00:09(10/12): centos-sclo-rh/x86_64/filelists_db | 12 MB 00:00:13(11/12): updates/7/x86_64/other_db | 904 kB 00:00:13(12/12): centos-sclo-rh/x86_64/other_db | 1.5 MB 00:00:15元數(shù)據(jù)緩存已建立+ '[' -n '' ']'+ sudo -E sh -c 'yum install -y -q docker-ce'warning: /var/cache/yum/x86_64/7/docker-ce-stable/packages/docker-ce-20.10.12-3.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEYdocker-ce-20.10.12-3.el7.x86_64.rpm 的公鑰尚未安裝導入 GPG key 0x621E9F35:用戶ID : "Docker Release (CE rpm) <docker@docker.com>"指紋 : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35來自 : https://mirrors.aliyun.com/docker-ce/linux/centos/gpgsetsebool: SELinux is disabled.+ version_gte 20.10+ '[' -z '' ']'+ return 0+ sudo -E sh -c 'yum install -y -q docker-ce-rootless-extras'軟件包 docker-ce-rootless-extras-20.10.12-3.el7.x86_64 已安裝并且是最新版本================================================================================To run Docker as a non-privileged user, consider setting up theDocker daemon in rootless mode for your user:dockerd-rootless-setuptool.sh installVisit https://docs.docker.com/go/rootless/ to learn about rootless mode.To run the Docker daemon as a fully privileged service, but granting non-rootusers access, refer to https://docs.docker.com/go/daemon-access/WARNING: Access to the remote API on a privileged Docker daemon is equivalentto root access on the host. Refer to the 'Docker daemon attack surface'documentation for details: https://docs.docker.com/go/attack-surface/================================================================================3.4 啟動docker服務
sudo systemctl start docker [duo@hadoop01 hive]$ sudo systemctl start docker[duo@hadoop01 hive]$ ps -ef | grep dockerroot 28682 1 5 15:34 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/conta inerd.sockduo 28821 5782 0 15:35 pts/1 00:00:00 grep --color=auto docker3.5 驗證Docker是否可用
sudo docker run hello-world3.6 把普通用戶添加到docker 組
每次使用docker的時候都需要使用root用戶, 比較麻煩. 可用把普通用戶添加到docker組, 避免每次都添加sudo.
退出當前shell, 重新進入shell, 使剛才的配置生效
sudo usermod -aG docker duo4、鏡像基本操作
鏡像是 Docker 三大核心概念中最重要的,自 Docker 誕生之日起鏡像就是相關社區(qū)最為熱門的關鍵詞。Docker 運行容器前需要本地存在對應的鏡像,如果鏡像不存在Docker 會嘗試先從默認鏡像倉庫下載,用戶也可以通過配置, 使用自定義的鏡像倉庫。
4.1 列出本機鏡像
docker images [duo@hadoop01 ~]$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest feb5d9fea6a5 3 months ago 13.3kB說明:
-
**REPOSITORY:**來源倉庫
-
**TAG:**鏡像的標簽信息, 表示鏡像的版本. 只是標記, 并不能表示鏡像內(nèi)容
-
**IMAGE ID:**鏡像id, 唯一表示一個鏡像. 如果兩個鏡像的 ID 相同, 說明它們實際上指向了同一 個鏡像, 只是具有不同標簽名稱而已;
-
**CREATED:**鏡像的最后更新時間.
-
**SIZE:**鏡像大小
4.2 獲取一個新鏡像
當我們在本地主機上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。如果我們想預先下載這個鏡像,我們可以使用 docker pull 命令來下載它。
docker pull hello-world下載完成后, 可以使用這個鏡像來運行容器
4.3 配置國內(nèi)鏡像源地址
下載鏡像的時候, 默認是從官方地址下載, 服務器在國外, 速度比較慢, 可以換成國內(nèi)鏡像.
4.3.1 國內(nèi)常用加速地址:
網(wǎng)易:http://hub-mirror.c.163.com
中國科技大學:https://docker.mirrors.ustc.edu.cn
阿里云容器服務:https://cr.console.aliyun.com/
4.3.2 配置方法
sudo vim /etc/docker/daemon.json{"registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://123456.mirror.aliyuncs.com"]}4.3.3 說明:
https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.550.469742c75wmmC8
重啟 docker: sudo systemctl restart docker
查看是否配置成功: docker info
4.4 搜索鏡像
docker search hello-world4.5 刪除鏡像
- 使用tag刪除鏡像
注意:
如果刪除的時候報錯: 有容器使用了該鏡像, 則需要先刪除使用過該鏡像的容器, 才能刪除該鏡像.
刪除容器, 再刪鏡像
- 使用id刪除鏡像
- 清理鏡像
使用 Docker 一段時間后,系統(tǒng)中可能會遺留一些臨時的鏡像文件,以及一些沒有被使用的鏡像,可以通過 docker image prune -f 命令來進行清理。
總結
以上是生活随笔為你收集整理的Docker安装与镜像的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超好看的情侣纪念日记录单页HTML自适应
- 下一篇: 网站服务器端口扫描,服务器端口扫描工具