1.docker基本命令
- 查看版本:
docker version
- 查看詳細(xì)信息:
docker info
- 獲取幫助:
docker --help
2.鏡像命令
2.1 查看鏡像
docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.37 42f82e150ec2 20 months ago 448MB
說明:
- REPOSITORY:表示鏡像的倉庫源
- TAG:鏡像的標(biāo)簽
- IMAGE ID:鏡像ID
- CREATED:鏡像創(chuàng)建時(shí)間
- SIZE:鏡像大小
`docker images --help``
$ docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
REPOSITORY[:TAG]說明:
同一個(gè)倉庫源可以有多個(gè)TAG,代表這個(gè)倉庫源的不同版本,我們使用REPOSITORY:TAG來定義不同的鏡像。如果你不指定一個(gè)鏡像的版本標(biāo)簽,例如你只使用ubuntu,docker將默認(rèn)使用ubuntu:latest鏡像
Options說明:
- -a:列出本地所有鏡像(含中間映像層)
- -q:只顯示鏡像ID
- --digests:顯示鏡像的摘要信息
- --no-trunc:顯示完整的鏡像信息-
$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.37 42f82e150ec2 20 months ago 448MB
$ docker images -q
0886915a6dee
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
mysql 5.7.37 sha256:66480693e 42f82e150ec2 20 months ago 448MB
$ docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.37 sha256:42f82e150ec 20 months ago 448MB
2.2 鏡像搜索
docker search
都是從https://hub.docker.com/進(jìn)行搜索,如果配置了鏡像加速器,拉取時(shí)候才從鏡像加速網(wǎng)址下拉取 docker search tomcat
和官網(wǎng)上對(duì)應(yīng)
docker search --help
$ docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
Options說明
- --no-trunc:顯示完整的鏡像描述
- -f:過濾信息
- --limit:查詢返回的最大數(shù)量,默認(rèn)25
docker search --no-trunc tomcat
過濾stars > 50的
老版本:docker search -s 50 tomcat
(新版本已棄用)
新版本:docker search -f stars=50 tomcat
(注意不包含50)
格式寫錯(cuò)例如:docker search -f st 30 tomcat 會(huì)報(bào)錯(cuò)誤信息:
invalid argument "st" for "-f, --filter" flag: bad format of filter (expected name=value)
2.3 下載鏡像
docker pull NAME[:TAG|
不指定tag默認(rèn)latest,鏡像是分層的
$ docker pull tomcat
$ docker pull redis:6.2.4
2.4 刪除鏡像
docker rmi [OPTIONS] IMAGE [IMAGE...]
$ docker rmi hello-world
加上-f
表示強(qiáng)制刪除
- 刪除單個(gè)鏡像:
docker rmi -f 鏡像ID或鏡像名
- 刪除多個(gè)鏡像:
docker rmi -f 鏡像1_ID/鏡像名1[:TAG] 鏡像2_ID/鏡像名2[:TAG]
- 刪除所有鏡像:
docker rmi -f $(docker images -qa)
3.容器命令
3.1 run流程
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS說明
--name="容器新名字“:為容器指定一個(gè)名稱(中間=可有可無)
-d:后臺(tái)運(yùn)行容器,并返回容器ID,也即啟動(dòng)守護(hù)式容器
-i:以交互模式運(yùn)行容器,通常與-t同時(shí)使用
-t:為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用 (如果運(yùn)行centos,進(jìn)入偽centos終端)
-P:(大寫)隨機(jī)端口映射
-
-p:(小寫)指定端口映射,有以下四種格式:
ip:hostPort:containerPort ip::containerPort hostPort:containerPort 主要使用這種 containerPort
3.2 啟動(dòng)交互式容器
docker run -it 鏡像ID/鏡像名稱
上圖執(zhí)行命令類似:docker run -it centos /bin/base
默認(rèn)添加/bin/base表示:使用鏡像centos:latest以交互模式啟動(dòng)一個(gè)容器,在容器內(nèi)執(zhí)行/bin/bash命令
為容器指定名稱
$ docker run -it --name myCentos centos # --name和新名稱之間有無=都可以
3.3 啟動(dòng)守護(hù)式容器
docker run -d 鏡像ID/鏡像名稱
使用鏡像centos:latest以后臺(tái)模式啟動(dòng)一個(gè)容器
$ docker run -d centos
問題:然后docker ps -a 進(jìn)行查看, 會(huì)發(fā)現(xiàn)容器已經(jīng)退出
很重要的要說明的一點(diǎn): Docker容器后臺(tái)運(yùn)行,就必須有一個(gè)前臺(tái)進(jìn)程.
容器運(yùn)行的命令如果不是那些 一直掛起的命令 (比如運(yùn)行top,tail),就是會(huì)自動(dòng)退出的。這個(gè)是docker的機(jī)制問題,比如你的web容器,我們以nginx為例,正常情況下,我們配置啟動(dòng)服務(wù)只需要啟動(dòng)響應(yīng)的service即可。例如 service nginx start
但是這樣做,nginx為后臺(tái)進(jìn)程模式運(yùn)行,就導(dǎo)致docker前臺(tái)沒有運(yùn)行的應(yīng)用,這樣的容器后臺(tái)啟動(dòng)后,會(huì)立即自殺因?yàn)樗X得他沒事可做了,所以,最佳的解決方案是,將你要運(yùn)行的程序以前臺(tái)進(jìn)程的形式運(yùn)行
實(shí)現(xiàn)后臺(tái)運(yùn)行
當(dāng)執(zhí)行一個(gè)不停止的進(jìn)程時(shí)候,如:docker run -d centos /bin/sh -c "while true;do echo hello;sleep 2;done"
就不會(huì)自動(dòng)退出
3.4 查看正在運(yùn)行的容器
docker ps [OPTIONS]
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
列表說明
- CONTAINER ID:容器ID
- IMAGE:鏡像
- COMMAND:執(zhí)行命令,
- CREATED:創(chuàng)建日期
- STATUS:容器狀態(tài),Up正在運(yùn)行,Exited已退出
- PORTS:端口
- NAMES:啟動(dòng)容器指定的名字,沒指定隨機(jī)生成一個(gè)
OPTIONS說明
- -a:列出當(dāng)前所有正在運(yùn)行的容器+歷史上運(yùn)行過的
- -l:顯示最近(上一次)創(chuàng)建的容器
- -n:顯示最近n個(gè)創(chuàng)建的容器
- -s:顯示文件大小
- -q:靜默模式,只顯示容器編號(hào)
- --no-trunc:不截?cái)噍敵?/li>
3.5 退出容器
exit
:容器停止退出
ctrl+P+Q
:容器不停止退出
3.6 進(jìn)入容器
執(zhí)行以下命令需要容器正在運(yùn)行
docker attach 容器id或容器名稱
直接進(jìn)入容器啟動(dòng)命令的終端,不會(huì)啟動(dòng)新的進(jìn)程
docker exec -it 容器id或容器名稱 命令bashShell
在容器中打開新的終端,并且可以啟動(dòng)新的進(jìn)程
$ docker exec -it 5d0ecb033cac /bin/bash # 進(jìn)入容器內(nèi)部
$ docker exec -it 5d0ecb033cac ls -l # 不進(jìn)入容器內(nèi)部,直接在外部輸出信息
注意:當(dāng)docker容器在 “-d”守護(hù)態(tài)運(yùn)行的時(shí)候,比如通過supervisord控制兩個(gè)程序非守護(hù)態(tài)運(yùn)行:ssh -D tomcat那么這個(gè)時(shí)候,用戶就無法直接進(jìn)入到容器中去,docker attach 容器id 就會(huì)一直卡著。
因?yàn)榇藭r(shí)容器運(yùn)行的進(jìn)程是ssh,而不是/bin/bash 也沒有虛擬終端(-it)參數(shù),所以是進(jìn)入不到的,通過exec進(jìn)去
3.7 啟動(dòng)、重啟、停止容器
docker start 【容器id或容器名稱】
--啟動(dòng)
docker stop 【容器id或容器名稱】
--停止
docker restart 【容器id或容器名稱】
--重啟
docker kill 【容器id或容器名稱】
--強(qiáng)制停止
docker update 【容器id或容器名稱】 --restart=always
--應(yīng)用開機(jī)自啟
3.8 刪除容器
docker rm [-f] 【容器id或容器名稱】
--刪除(-f 強(qiáng)制刪除)容器
docker rm -f $(docker ps -a -q)
或者docker ps -a -q | xargs docker rm
--刪除所有容器
3.9 查看容器日志
docker logs [OPTIONS] 容器id或容器名
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
- -t:是加入時(shí)間戳
- -f:跟隨最新的日志打印
- --tail(或-n) 數(shù)字:顯示最后多少條
3.10 查看容器內(nèi)運(yùn)行的進(jìn)程
docker top 容器id或容器名稱
3.11 查看容器內(nèi)部細(xì)節(jié)
inspect: 檢查; 查看; 審視; 視察
docker inspect 容器id或容器名稱
3.12 容器和主機(jī)間拷貝文件
docker cp 容器ID或名稱:容器內(nèi)路徑 目的主機(jī)路徑
從容器拷貝文件到主機(jī)
docker cp 主機(jī)路徑 容器ID或名稱:容器內(nèi)路徑
從主機(jī)拷貝文件到容器
docker cp xxxx:/usr/local/a.txt /root
3.13 容器啟動(dòng)端口映射
-it前端啟動(dòng)打印tomcat啟動(dòng)的信息,-d 后端啟動(dòng)不打印tomcat啟動(dòng)的信息
-
-p 主機(jī)端口:docker容器端口
$ docker run -it -p 8090:8080 tomcat #本機(jī)8090映射tomcat8080端口
-P 隨機(jī)分配端口
3.14 掛載數(shù)據(jù)卷
docker run -it/-d -v 宿主機(jī)目錄:/容器內(nèi)目錄[:ro] 鏡像名或鏡像ID
-v (volume:[?vɑ?lju?m] 體積; 容積; 容量; 量; 額; 音量; 響度)有創(chuàng)建文件功能,沒有文件就創(chuàng)建文件
ro
只讀,read-only,容器只能進(jìn)行讀操作,主機(jī)可以進(jìn)行讀寫操作,數(shù)據(jù)共享
rw
讀寫,默認(rèn)
# 單個(gè)目錄掛載
docker run -it -v /myDataVolume:/containerDataVolume centos
# 多個(gè)目錄掛載
docker run -it -v /myDataVolume1:/containerDataVolume1 -v /myDataVolume2:/containerDataVolume2 centos
完整啟動(dòng)命令
# nginx啟動(dòng)
$ docker run \
-d --restart=always -p 81:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name=mynginx \
nginx
# --restart=always: 開機(jī)自啟
# 修改頁面只能去 主機(jī)的 /data/html,容器內(nèi)ro(只讀)
# redis啟動(dòng)
$ docker run \
-v /data/redis/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
-d --name myredis \
-p 6379:6379 \
redis:latest redis-server /etc/redis/redis.conf
4.提交發(fā)布
4.1 容器提交成新的映像
docker commit -m="提交的描述信息" -a="作者" 容器id或名稱 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]
(等號(hào)可有可無)
$ docker commit -a zy -m "del docs from tomcat" dazzling_darwin tomcat1.0
4.2 鏡像傳輸
離線安裝
# 將鏡像保存成壓縮包,-o output 輸出文件目錄
$ docker save -o abc.tar guignginx:v1.0
# 別的機(jī)器加載這個(gè)鏡像
$ docker load -i abc.tar
4.3 推送遠(yuǎn)程倉庫
$ docker tag local-image:tagname new-repo:tagname
$ docker push new-repo:tagname
4.3.1 發(fā)布到阿里云
阿里云開放平臺(tái):https://promotion.aliyun.com/ntms/act/kubernetes.html
在阿里云創(chuàng)建倉庫鏡像
- 創(chuàng)建命名空間
- 創(chuàng)建倉庫名稱
將鏡像推送到阿里云
# 1. 登錄阿里云Docker Registry
$ sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/custom_docker_test/custom_docker:[鏡像版本號(hào)]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/custom_docker_test/custom_docker:[鏡像版本號(hào)]
# 請(qǐng)根據(jù)實(shí)際鏡像信息替換示例中的[ImageId]和[鏡像版本號(hào)]參數(shù)
4.3.2 發(fā)布到docker hub
# 把舊鏡像的名字,改成倉庫要求的新版名字
docker tag nginx:v1.0 xxxx/nginx:v1.0
# 登錄到docker hub
docker login
docker logout(推送完成鏡像后退出)
# 推送
docker push xxxx/nginx:v1.0
# 別的機(jī)器下載
docker pull xxxx/nginx:v1.0