- docker.io(官網(wǎng))
- 輕量把还、高效的虛擬化
Docker 公司位于舊金山,原名dotCloud实蓬,底層利用了Linux容器技術(在操作系統(tǒng)中實現(xiàn)資源隔離與限制)。為了方便創(chuàng)建和管理這些容器吊履,dotCloud 開發(fā)了一套內部工具安皱,之后被命名為“Docker”。Docker就是這樣誕生的率翅。
什么是docker练俐?
Docker是Docker.Inc公司開源的一個基于輕量級虛擬化急速的容器引擎項目,整個項目基于Go語言開發(fā)冕臭,遵從Apache 2.0協(xié)議腺晾。通過分出鏡像標準化和內核虛擬化技術燕锥,Docker使得應用開發(fā)者和運維工程師可以以統(tǒng)一的方式跨平臺發(fā)布應用,并且以幾乎沒有額外開銷的情況下提供資源隔離的應用運行環(huán)境悯蝉。
- 是一個開源工具归形,它可以讓創(chuàng)建和管理Linux容器變得簡單。容器就像是輕量級的虛擬機鼻由,并且可以以毫秒級的速度來啟動或停止暇榴。可以打包成鏡像任意移動
Hypervisor: 一種運行在基礎物理服務器和操作系統(tǒng)之間的中間軟件層蕉世,可允許多個操作系統(tǒng)和應用共享硬件 蔼紧。常見的VMware的 Workstation 、ESXi狠轻、微軟的Hyper-V或者思杰的XenServer奸例。
Container Runtime:通過Linux內核虛擬化能力管理多個容器,多個容器共享一套操作系統(tǒng)內核向楼。秒級啟動查吊;基于進程隔離(早期使用LXC,后期衍升libcontainer湖蜕、OCI)
優(yōu)點
- 1.標準化應用發(fā)布逻卖,docker容器包含了運行環(huán)境和可執(zhí)行程序,可以跨平臺和主機使用
- 2.節(jié)約時間昭抒,快速部署和啟動评也,秒級
- 3.方便構建基于SOA架構或微服務架構的系統(tǒng),通過服務編排灭返,更好的松耦合
- 4.節(jié)約成本仇参,以前一個虛擬機至少需要幾個G的磁盤空間,docker容器可以減少到MB
- 5.方便持續(xù)集成婆殿,通過與代碼進行關聯(lián)使持續(xù)集成非常方便
- 6.可以作為集群系統(tǒng)的輕量級主機或節(jié)點,在Iaas平臺上罩扇,已經出現(xiàn)了Caas婆芦,通過容器代替原理的主機
- 7.交付物標準化
- 8.一次構建,多次交付
Docker與虛擬機的區(qū)別
不同點 | container(容器) | VM(虛擬機) |
---|---|---|
啟動速度 | 秒級(進程控制) | 分鐘級(來賓操作系統(tǒng)管理) |
運行性能 | 接近原生(共享內核)(直接在內核中運行90% ) | 50%左右損失 |
磁盤占用 | MB | GB(操作系統(tǒng)鏡像2G) |
數(shù)量 | 成百上千 | 一般幾十臺 |
隔離性 | 進程級別 | 系統(tǒng)級別(更徹底) |
操作系統(tǒng) | 主要支持Linux系統(tǒng) | 幾乎所有 |
安全性 (因為隔離性) | 低(使用原系統(tǒng)內核) | 高 |
封裝程度 | 只打包項目代碼和依賴關系喂饥,共享宿主機內核 | 完整的操作系統(tǒng)消约,與宿主機隔離 |
版本管理
- Docker 引擎主要有兩個版本:企業(yè)版(EE)和社區(qū)版(CE)
- 每個季度(1-3,4-6,7-9,10-12),企業(yè)版和社區(qū)版都會發(fā)布一個穩(wěn)定版本(Stable)员帮。社區(qū)版本會提供 4 個月的支持或粮,而企業(yè)版本會提供 12 個月的支持
- 每個月社區(qū)版還會通過 Edge 方式發(fā)布月度版
- 從 2017 年第一季度開始,Docker 版本號遵循 YY.MM-xx 格式捞高,類似于 Ubuntu 等項目氯材。例如渣锦,2018 年 6 月第一次發(fā)布的社區(qū)版本為 18.06.0-ce
發(fā)展史
13年成立,15年開始氢哮,迎來了飛速發(fā)展袋毙。
Docker 1.8之前,使用LXC冗尤,Docker在上層做了封裝听盖, 把LXC復雜的容器創(chuàng)建與使用方式簡化為自己的一套命令體系。
之后裂七,為了實現(xiàn)跨平臺等復雜的場景皆看,Docker抽出了libcontainer項目,把對namespace背零、cgroup的操作封裝在libcontainer項目里腰吟,支持不同的平臺類型。
2015年6月捉兴,Docker牽頭成立了 OCI(Open Container Initiative開放容器計劃)組織蝎困,這個組織的目的是建立起一個圍繞容器的通用標準 。 容器格式標準是一種不受上層結構綁定的協(xié)議倍啥,即不限于某種特定操作系統(tǒng)禾乘、硬件、CPU架構虽缕、公有云等 始藕, 允許任何人在遵循該標準的情況下開發(fā)應用容器技術,這使得容器技術有了一個更廣闊的發(fā)展空間氮趋。
OCI成立后伍派,libcontainer 交給OCI組織來維護,但是libcontainer中只包含了與kernel交互的庫剩胁,因此基于libcontainer項目诉植,后面又加入了一個CLI工具,并且項目改名為runC (https://github.com/opencontainers/runc )昵观, 目前runC已經成為一個功能強大的runtime工具晾腔。
Docker也做了架構調整。將容器運行時相關的程序從docker daemon剝離出來啊犬,形成了containerd灼擂。containerd向上為Docker Daemon提供了gRPC接口
,使得Docker Daemon屏蔽下面的結構變化觉至,確保原有接口向下兼容剔应。向下通過containerd-shim
結合runC
,使得引擎可以獨立升級,避免之前Docker Daemon升級會導致所有容器不可用的問題峻贮。
也就是說
- runC(libcontainer)是符合OCI標準的一個實現(xiàn)席怪,與底層系統(tǒng)交互
- containerd是實現(xiàn)了OCI之上的容器的高級功能,比如鏡像管理月洛、容器執(zhí)行的調用等
- Dockerd目前是最上層與CLI交互的進程何恶,接收cli的請求并與containerd協(xié)作
- docker-ce,每季度發(fā)布stable版本嚼黔。18.06细层,18.09,19.03
- 發(fā)展至今唬涧,docker已經通過制定OCI標準對最初的項目做了拆分疫赎,其中runC和containerd是docker的核心項目,理解docker整個請求的流程碎节,對我們深入理解docker有很大的幫助
Docker名稱上的調整
- 最初維護兩個版本:docker-ce(社區(qū)版)和docker-ee(企業(yè)版)
- 隨后將docker-ce更名為moby捧搞,轉由社區(qū)進行維護
Centos7安裝Docker
配置宿主機網(wǎng)卡轉發(fā)
# 配置網(wǎng)卡轉發(fā),看值是否為1
$ sysctl -a |grep -w net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# 若未配置誉己,需要執(zhí)行如下
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sysctl -p /etc/sysctl.d/docker.conf
Yum安裝配置docker
# 卸載舊版已存在的docker(未安裝可忽略)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
## 下載阿里源repo文件窖张、docker的repo文件
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all && yum makecache
## 查看源中可用版本
yum list docker-ce --showduplicates | sort -r
## yum安裝
yum install -y docker-ce docker-ce-cli containerd.io
## 安裝指定版本
## yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
## yum install -y docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
## 配置源加速
## https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"registry-mirrors": [ # 鏡像加速拂封,后面有講
"http://f1361db2.m.daocloud.io"
],
"insecure-registries": []
}
## 設置開機自啟
systemctl enable docker
## 啟動docker
systemctl start docker
## 查看docker信息
docker info
## 運行hello world鏡像檢驗
$ docker run hello-world
打印了一堆信息其中有一條寫著表明成功的話
Hello from Docker! This message shows that your installation appears to be working correctly.
## docker-client
which docker
## docker daemon
ps aux |grep docker
Docker加速器
Docker 加速器:國內的定義嘿般;官方沒有
就是國內的docker源、aliyun 晨缴、 網(wǎng)易蜂巢灸拍、daocloud等
弊端是不能知道都有哪些版本崇堵,只能下載最新版雅采,除非去國內源網(wǎng)站登陸去查看
國內鏡像:使用官方源因為在國外速度特別慢爵憎,所以有了國內源,每個國內源都可以配置加速器婚瓜,還可以監(jiān)控
國內可以用阿里的加速源宝鼓、daocloud、華為等等巴刻,這里以daocloud為例
$ vim /etc/docker/daemon.json
{
"registry-mirrors": [
"http://f1361db2xx.m.daocloud.io"
],
"insecure-registries": []
}
上述registry-mirrors地址在daocloud官網(wǎng)中愚铡,所有人的都不一致。
登錄登出官網(wǎng)docker hub倉庫
需要注冊自己的用戶名密碼胡陪,拉取鏡像不需要登錄茂附,上傳需要
[root@docker ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: wzp
Password:
[root@docker ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
核心要素及常用操作詳解
三大核心要素:鏡像(Image)、容器(Container)督弓、倉庫(Registry)
鏡像(Image)
是一個只讀的文件和文件夾組合,是Docker容器運行時的只讀模板乒验,包含啟動容器所需的所有文件系統(tǒng)結構和內容愚隧。即鏡像不包含任何動態(tài)數(shù)據(jù),鏡像內容在構建后不會改變,是靜態(tài)的文件狂塘,不能直接對外提供服務录煤。
容器(Container)
鏡像的運行時,可以對外提供服務荞胡。本質上講是利用namespace和cgroup等技術在宿主機中創(chuàng)建的獨立的虛擬空間妈踊。
倉庫(Registry)
- 公有倉庫,Docker Hub泪漂,阿里廊营,網(wǎng)易...
- 私有倉庫,企業(yè)內部搭建
- Docker Registry萝勤,Docker官方提供的鏡像倉庫存儲服務
- Harbor, 是Docker Registry的更高級封裝露筒,它除了提供友好的Web UI界面,角色和用戶權限管理敌卓,用戶操作審計等功能
- 鏡像訪問地址形式 registry.harbor.com/demo/hello:latest,若沒有前面的url地址慎式,則默認尋找Docker Hub中的鏡像,若沒有tag標簽趟径,則使用latest作為標簽
- 公有的倉庫中瘪吏,一般存在這么幾類鏡像
- 操作系統(tǒng)基礎鏡像(centos,ubuntu蜗巧,suse掌眠,alpine)
- 中間件(nginx,redis惧蛹,mysql扇救,tomcat)
- 語言編譯環(huán)境base鏡像(python,java香嗓,golang)
- 業(yè)務鏡像(django-demo...)
操作演示
docker本身的簡單操作
# 查看docker版本
$ docker version
# 查看docker的詳細信息
$ docker info
# 查看docker的運行事件
$ docker events
- 搜索鏡像
#查詢的內容只能查詢官方庫上的鏡像
# - NAME:名稱 - DESCRIPTION:描述 - STARS: star收藏數(shù)量 - OFFICIAL:是否是官方鏡像 - AUTOMATED: 是否是自動構建的
[root@jgs-global-master2 nfs]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos DEPRECATED; The official build of CentOS. 7528 [OK]
kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 33
couchbase/centos7-systemd centos7-systemd images with additional debug… 7 [OK]
dokken/centos-7 CentOS 7 image for kitchen-dokken 6
dokken/centos-8 CentOS 8 image for kitchen-dokken 3
eclipse/centos_jdk8 CentOS, JDK8, Maven 3, git, curl, nmap, mc, … 3 [OK]
- 增加參數(shù)
# 顯示完整描述而不是省略
docker search busybox --no-trunc
# 搜索結果僅展示10個
docker search busybox --limit=10
# 搜索結果過濾star收藏數(shù)量大于等于3個
docker search busybox --filter stars=3
# 搜索結果只列出自動構建的鏡像
docker search busybox --filter is-automated=true
# 搜索結果只列出官方鏡像 并且star收藏數(shù)量大于等于3個
docker search busybox --filter is-official=true --filter stars=3
- 查看所有本地鏡像
$ docker images
# 僅查看所有鏡像的ID
$ docker images -q
- 拉取鏡像
如何唯一確認一個鏡像迅腔?
- image_id
- repository:tag
# 不寫路徑默認去官網(wǎng)(docker hub)拉取,不寫Tag默認是latest
$ docker pull nginx:latest
- 刪除本地鏡像
- 注意:如果存在容器正在使用鏡像時無法刪除
# 通過路徑方式刪除(REPOSITORY:TAG)
docker rmi docker.io/ubuntu:latest
# 通過鏡像ID刪除(ID可以簡寫)
docker rmi 7753
# 刪除所有本地鏡像(shell方式)
docker rmi `docker images | awk 'NR!=1{print $3}'`
# 刪除所有本地鏡像(docker方式)
docker rmi `docker images -q`
- 啟動一個docker容器
- 注意docker的特性靠娱,決定了每次使用同一個鏡像運行的容器都是一個新的容器且互相不影響
# 1.啟動一個容器并放入后臺運行
docker run --name nginx -d nginx:latest
# 2.啟動一個容器并放入后臺運行沧烈,且保持狀態(tài)一直運行(在docker是running時,會一直嘗試容器處于運行狀態(tài))
docker run --name nginx --restart=always -d nginx:latest
# 3.啟動一個容器并進入bash終端(退出容器時容器終止運行)
# -it 與/bin/sh 或 /bin/bash連用像云,表示分配一個tty終端執(zhí)行bash
docker run --name nginx -it nginx:latest /bin/bash
# 4.映射容器80端口到宿主機8080端口
docker run --name nginx -p 8080:80 -d nginx:latest
# 5.啟動一個容器并進入bash終端锌雀,在退出時自動刪除容器(相當于臨時容器)
docker run --name nginx --rm -it nginx:latest /bin/bash
# 6.創(chuàng)建一個容器但是不啟動
docker create --name "wzp-nginx" -d nginx:latest
## ## 注意示例
# 這里跟了/bin/sh 表示將鏡像中的啟動命令替換成了/bin/sh
$ docker run --name nginx -ti nginx:latest /bin/sh
(注意:退出容器后,該容器會變成退出狀態(tài)迅诬,因為容器內部的1號進程退出)
## 實際上腋逆,在運行容器的時候,鏡像地址后面跟的命令等于是覆蓋了原有的容器的CMD命令侈贷,因此惩歉,執(zhí)行的這些命令在容器內部就是1號進程,若該進程不存在了,那么容器就會處于退出的狀態(tài)撑蚌,比如上遥,宿主機中執(zhí)行
1. echo 1,執(zhí)行完后,該命令立馬就結束了
2. ping www.baidu.com,執(zhí)行完后争涌,命令的進程會持續(xù)運行
$ docker run --name test_echo nginx:alpine echo 1,容器會立馬退出
$ docker run --name test_ping nginx:alpine ping www.baidu.com,容器不會退出粉楚,但是因為沒有加-d參數(shù),因此一直在前臺運行亮垫,若ctrl+C終止模软,則容器退出,因為1號進程被終止了
- 查看本地容器
# 查看運行中的容器
$ docker ps
# 查看所有容器(運行包警、退出狀態(tài))
$ docker ps -a
- 查看某一 容器/鏡像/volume/network 詳細信息
docker inspect 容器名稱/容器ID(ID可以簡寫)
$ docker ps | grep nginx
a4d4fa71f329 nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 80/tcp nginx
3d70d5257b75 192.168.183.144:11443/acp/alb-nginx
$ docker inspect a4d4f | head
[
{
"Id": "a4d4fa71f3293d00a1f83466c9758527139e5d60fd949e08eeb6efa2f08ccb35",
"Created": "2023-03-13T04:46:20.820415327Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
# 通過format 獲取指定字段
# inspect輸出的內容為Json格式撵摆,可以通過.xxx.yyy 的層級關系來指定要查看的字段,多個字段逗號隔開
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' a4d4f
172.17.0.2
# 抓取容器的Pid害晦、名稱特铝、工作目錄存在位置
docker inspect --format '{{.State.Pid}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' a4d4f
- 管理已存在的容器的狀態(tài)(啟動/停止/重啟/暫停...)
# 啟動一個停止狀態(tài)的容器
$ docker start <container_id_or_name>
# 停止一個運行中的容器
$ docker stop <container_id_or_name>
# 重啟一個容器
$ docker restart <container_id_or_name>
# 強制關閉一個容器
$ docker kill <container_id_or_name>
# 暫停一個運行中容器的所有進程
$ docker pause <container_id_or_name>
# 恢復處于暫停中的容器的所有進程
$ docker unpause <container_id_or_name>
停止和暫停容器的區(qū)別?
- stop命令用于停止一個運行中的容器
- 使用stop命令容器內主進程會在指定時間內被殺死(殺死后進程就不存在了)壹瘟,默認為十秒
- pause命令用于暫停容器中的所有進程
- 使用pause命令會掛起指定容器中的所有進程(還可以被喚醒)
- 容器內進程狀態(tài)變?yōu)镈
- 刪除容器
docker rm 容器名
# 刪除一個停止狀態(tài)的容器
$ docker rm a4d4f
# 刪除一個運行中的容器
$ docker rm -f a4d4f
# 刪除所有容器exited狀態(tài)的容器
$ docker rm `docker ps -qf status=exited`
# 刪除所有容器
docker rm `docker ps -a -q`
- 容器數(shù)據(jù)持久化
## 掛載主機目錄
$ docker run --name nginx -d -v /opt:/opt -v /var/log:/var/log nginx:latest
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v /opt/mysql/:/var/lib/mysql mysql:5.7
## 使用volumes卷
$ docker volume ls
$ docker volume create test
$ docker run --name nginx -d -v test:/opt/test nginx:latest
$ docker exec -ti nginx touch /opt/test/a.txt
# volumes卷鲫剿,默認存儲在/var/lib/docker/volumes/卷名稱/_data/
$ ls /var/lib/docker/volumes/test/_data/
a.txt
## 多容器共享同一個卷
$ docker run --name nginx2 -d -v test:/opt/test nginx:latest
$ docker exec -ti nginx2 ls /opt/test/
a.txt
- 運行中容器的使用狀態(tài)
# cpu、內存稻轨、網(wǎng)絡io使用情況,不寫具體容器表示所有灵莲,
# 默認實時更新,--no-stream 表示僅打印一次后退出
$ docker stats [container_name]
# 查看容器中運行的進程信息殴俱,支持 ps 命令參數(shù)政冻。
$ docker top CONTAINER [ps OPTIONS]
$ docker top registry
UID PID PPID C STIME TTY TIME CMD
root 3367 3348 0 06:55 ? 00:00:00 registry serve /etc/docker/registry/config.yml
- 連接運行中的容器
# exec交互型,即進入到容器中并停留在終端线欲,可以在容器的環(huán)境中執(zhí)行
$ docker exec -it <container_id_or_name> /bin/bash
# exec后臺型明场,即進入容器中不停留,僅執(zhí)行命令并返回結果
$ docker exec <container_id_or_name> ls
# attach 了解即可李丰,不建議使用
# 使用attach會連接到容器的主經常上苦锨,不像exec會在容器中新開一個進程
# ** 這意味著attch連接到容器,一旦給了CTRL+C或停止信號后容器本身也會退出
# ** 雖然有參數(shù)可以避免此現(xiàn)象
$ docker attach <container_id_or_name>
# 不轉發(fā)sig信號
$ docker attach --sig-proxy=false <container_id_or_name>
# 示例
# * exec交互型
[root@docker ~]# docker exec -it nginx bash
root@98a54056b185:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@98a54056b185:/# pwd
/
root@98a54056b185:/# exit
exit
# * exec后臺型
[root@docker ~]# docker exec nginx hostname
98a54056b185
# * attch ,這里連接nginx后趴泌,訪問一下nginx看效果
[root@docker ~]# docker attch nginx
172.17.0.1 - - [13/Mar/2023:05:26:41 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
172.17.0.1 - - [13/Mar/2023:05:26:41 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
^C 2023/03/13 05:26:45 [notice] 1#1: signal 2 (SIGINT) received, exiting
2023/03/13 05:26:45 [notice] 1#1: exit
# 由于接收了^C 舟舒,所以容器也退出了
[root@docker ~]# docker ps -a | grep nginx
98a54056b185 nginx:latest "/docker-entrypoint.…" 17 minutes ago Exited (0) 50 seconds ago nginx
# * 啟動容器后,設置不接收sig信號
[root@docker ~]# docker start nginx
nginx
[root@docker ~]# docker attach --sig-proxy=false nginx
172.17.0.1 - - [13/Mar/2023:05:28:52 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
172.17.0.1 - - [13/Mar/2023:05:28:52 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
^C
[root@docker ~]# docker ps -a| grep nginx
98a54056b185 nginx:latest "/docker-entrypoint.…" 18 minutes ago Up 31 seconds 80/tcp nginx
- 容器與宿主機之間數(shù)據(jù)拷貝
docker cp 源路徑 目的路徑
# 如果直接寫路徑表示宿主機路徑嗜憔,如果加上 容器名稱:路徑 或容器ID:路徑 表示容器路徑
# 示例秃励,將etcd中/usr/bin/etcdctl 拷貝至宿主機的/usr/local/bin下
docker cp etcd:/usr/bin/etcdctl /usr/local/bin
- 查看日志
# 查看全部日志
$ docker logs nginx
# 實時查看最新日志
$ docker logs -f nginx
# 從最新的100條開始查看
$ docker logs -f --tail=100 nginx
- 查看鏡像構建的歷史
docker history image_name
$ docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
904b8cb13b93 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 11 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 11 days ago /bin/sh -c #(nop) COPY file:e57eef017a414ca7… 4.62kB
<missing> 11 days ago /bin/sh -c #(nop) COPY file:abbcbf84dc17ee44… 1.27kB
<missing> 11 days ago /bin/sh -c #(nop) COPY file:5c18272734349488… 2.12kB
<missing> 11 days ago /bin/sh -c #(nop) COPY file:7b307b62e82255f0… 1.62kB
<missing> 11 days ago /bin/sh -c set -x && addgroup --system -… 61.3MB
<missing> 11 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 11 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.9 0B
<missing> 11 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.23.3 0B
<missing> 11 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 12 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 12 days ago /bin/sh -c #(nop) ADD file:493a5b0c8d2d63a13… 80.5MB
鏡像的導入導出
- 將本地鏡像打包成文件(推薦)
# 方式一
$ docker save <repository>:<tag> -o <repository>.tar
# 方式二
$ docker save <repository>:<tag> > <repository>.tar
# 注意 也可以使用 docker save image_id -o image.tar的方式打包
# 但是不要使用此方式去做,因為用image_id打包的文件導入時沒有鏡像名稱和tag導致無法區(qū)分
- 將打包后的文件導入到本地
# 方式一
$ docker load < <repository>.tar
# 方式二
$ docker load -i <repository>.tar
- 將本地的容器打包成鏡像文件的導入導出
- 不推薦的方式
- 此方式打包的鏡像構建歷史不明確吉捶,多人維護很麻煩
- 導入時沒有提示repository和tag莺治,只有sha256的id
- 制作新的鏡像建議通過Dockerfile的方式
# 將本地容器打包成文件
docker export <container_name> -o <repository>.tar
docker export <container_name> > <repository>.tar
# 示例
$ docker export nginx -o nginx-`date +%Y%m%d`.tar
# 將打包后的文件導入到本地
docker import nginx-`date +%Y%m%d`.tar
鏡像的推送和私有鏡像倉庫
部署一個私有倉庫
https://docs.docker.com/registry/
私有倉庫的作用就是在本地啟動一個可以上傳(push)和下載(pull)的存儲倉庫
## 使用docker鏡像啟動鏡像倉庫服務
$ mkdir /opt/registry
$ docker run -d -p 5000:5000 --restart always -v /opt/registry:/var/lib/registry --name registry registry:2
# 倉庫運行在5000端口廓鞠,通過宿主機IP:5000端口來上傳下載
# 默認倉庫不帶認證,若需要認證谣旁,參考
https://docs.docker.com/registry/deploying/#restricting-access
由于默認部署的倉庫不帶認證,所以需要使用http協(xié)議傳輸
默認情況下滋早,docker程序認為所有倉庫都使用https協(xié)議榄审,所有需要配置一下docker才能使用http協(xié)議的私有倉庫
# #修改https請求方式為http;
$ vim /etc/docker/daemon.json
{
"registry-mirrors": [
"http://f1361db2xx.m.daocloud.io"
],
"insecure-registries": [
"192.168.200.50:5000"
]
}
$ systemctl restart docker
# 下在一個公網(wǎng)鏡像驗證 私有倉庫的上傳下載
$ docker pull busybox
# 上傳前需要修改tag杆麸,通過repository:tag唯一確定一個鏡像
# repository:表示倉庫源搁进,包含ip、端口昔头、項目饼问、鏡像名
# tag:鏡像具體版本的標識
$ docker tag busybox:latest 192.168.200.50:5000/library/busybox:latest
$ docker push 192.168.200.50:5000/library/busybox:latest
查看私有倉庫內的鏡像
# 查看倉庫中有哪些鏡像
$ curl 192.168.200.50:5000/v2/_catalog
{"repositories":["busybox"]}
# 查看某個鏡像下有哪些tag
$ curl 192.168.200.50:5000/v2/busybox/tags/list
{"name":"busybox","tags":["latest"]}
部署一個ui用來管理docker hub
- 基本沒人維護的鏡像了,感興趣可以自己開發(fā)一個難度不大
$ docker run -itd -p 8080:8080 --name registry-web \
-e REGISTRY_URL=http://192.168.200.50:5000/v2 \
-e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web
# 訪問地址: http://192.168.200.50:8080
部署一個ui用來管理docker
- 基本沒人維護的鏡像了揭斧,感興趣可以自己開發(fā)一個難度不大
$ docker run -it -d --name docker-web -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker
# 訪問地址: http://192.168.200.50:9000
Docker核心操作命令總結
- docker version
- docker info
容器生命周期管理
- docker run
- docker start/stop/restart
- docker kill
- docker rm
- docker pause
- docker unpause
- docker create
- docker exec
容器操作
- docker ps
- docker inspect
- docker top
- docker attach
- docker events
- docker logs
- docker wait
- docker export
- docker port
- docker stats
容器rootfs命令
- docker commit
- docker cp
- docker diff
鏡像倉庫相關
- docker login
- docker pull
- docker push
- docker search
- docker logout
本地鏡像管理
- docker images
- docker tag
- docker build
- docker history
- docker rmi
- docker save
- docker load
- docker import