啟動(dòng)docker
docker run
查看版本
docker version
查看本地鏡像
docker images
直接列出鏡像結(jié)果鸟廓,并且只包含鏡像ID和倉庫名:
image ls 就是 images
docker image ls --format "{{.ID}}: {{.Repository}}"
以表格等距顯示拘央,并且有標(biāo)題行,和默認(rèn)一樣,不過自己定義列:
不要打錯(cuò)單詞了
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
下載鏡像
docker pull <$images>
例如: docker pull busybox
docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/] 倉庫名[:標(biāo)簽]
具體的選項(xiàng)可以通過 docker pull --help 命令看到采驻,這里我們說一下鏡像名稱的格式岩喷。
- Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號(hào)]。默認(rèn)地址是 Docker Hub强重。
- 倉庫名:如之前所說绞呈,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名>间景。對(duì)于 Docker Hub佃声,如果不給出用戶名,則默認(rèn)為 library倘要,也就是官方鏡像秉溉。
比如: docker pull ubuntu:16.04
進(jìn)入shell命令
docker run -i -t $IMAGE /bin/bash
$IMAGE是鏡像的名字,不能是容器的名字或者ID
-t:在新容器內(nèi)指定一個(gè)偽終端或終端碗誉。
-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互召嘶。
docker run -it --rm ubuntu bash
- -it:這是兩個(gè)參數(shù),一個(gè)是 -i:交互式操作哮缺,一個(gè)是 -t 終端弄跌。我們這里打算進(jìn)入 bash 執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端尝苇。
- --rm:這個(gè)參數(shù)是說容器退出后隨之將其刪除铛只。默認(rèn)情況下,為了排障需求糠溜,退出的容器并不會(huì)立即刪除淳玩,除非手動(dòng) docker rm。我們這里只是隨便執(zhí)行個(gè)命令非竿,看看結(jié)果蜕着,不需要排障和保留結(jié)果,因此使用 --rm 可以避免浪費(fèi)空間红柱。
- ubuntu::這是指用 ubuntu 鏡像為基礎(chǔ)來啟動(dòng)容器承匣。
- bash:放在鏡像名后的是命令,這里我們希望有個(gè)交互式 Shell锤悄,因此用的是 bash韧骗。
列出所有的容器
docker ps -a[-l]
如果只是docker ps
則是列出當(dāng)前運(yùn)行的容器
列出容器的配置
docker inspect IMAGE_ID
IMAGE_ID可以通過docker ps -l
命令查看到。
給容器重命名
docker run --name=container01-i -t ubuntu /bin/bash
ubutun是指的鏡像零聚,container01指的是重命名的名字
重命名后袍暴,使用docker ps -l
列出所有容器時(shí)些侍,在最后一列的NAMES中顯示出來
重新啟動(dòng)停止的命令
docker start [-i] NAMES
NAMES是容器的名字,或者是容器的ID
每次使用鏡像啟動(dòng)時(shí)都會(huì)創(chuàng)建一個(gè)容器政模,使用該命令時(shí)就相當(dāng)于使用之前創(chuàng)建過的容器不會(huì)再次創(chuàng)建了岗宣。
如果需要打開交互終端,需要使用 -i 览徒,但不需要加上 -t
注意的是狈定,可能不會(huì)自動(dòng)顯示命令終端,所以還需要敲擊回車鍵习蓬。
刪除停止的容器
docker rm NAMES
只能用來刪除停止的容器纽什,正在運(yùn)行的容器不可刪除
NAMES可以是名字,也可以是ID
守護(hù)式容器進(jìn)入方式
首先創(chuàng)建一個(gè)容器
docker run -i -t ubuntu /bin/bash
然后使用ctrl + p
和 ctrl + q
的組合鍵躲叼,即按住ctrl鍵然后按P和Q芦缰,而不是直接使用exit
命令來退出了
使用docker ps
可以看到上面的容器還是運(yùn)行著的
重新進(jìn)入運(yùn)行中的容器
docker attach NAMES
NAMES可以是容器的NAMES或者ID
啟動(dòng)守護(hù)式容器(重要方式)
docker run -d 鏡像名
使用這種方式可以替代上面那段中提到的方式。
糾正:如果只是使用docker run -d 鏡像名
命令無法創(chuàng)建守護(hù)式容器枫慷,還是需要使用
docker run -it -d ubuntu /bin/bash
才行让蕾,加上 <strong>-d</strong>
使用docker ps
可以看到剛啟動(dòng)的容器在后臺(tái)運(yùn)行
查看容器日志
docker logs [-f] [-t] [--tail] 容器名
-f --follows=true | false 默認(rèn)為false
-t --timestamp=true | false 默認(rèn)為false
--tail="all"
-f: 一直跟蹤日志的變化并返回結(jié)果
-t: 在返回的結(jié)果上加上時(shí)間戳
--tail: 在結(jié)尾上返回多少數(shù)量的日志,默認(rèn)為all或听,返回所有的日志
例如使用該命令
docker run --name dc01 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
--name表示將該容器命名為dc01
在該容器中探孝,一直打印hello world
(1) docker logs dc01
會(huì)將所有日志打印出來,每一行只會(huì)顯示 hello world誉裆,不會(huì)自動(dòng)更新
(2) docker logs -t dc01
在(1)的基礎(chǔ)上顿颅,在每一行前面加上時(shí)間戳
(3) docker logs -tf dc01
在(2)的基礎(chǔ)上,會(huì)隔一秒自動(dòng)多打印一句 hello world足丢,自動(dòng)更新
(4) docker logs -tf --tail 10 dc01
會(huì)從底部開始粱腻,取出10條log,并且會(huì)自動(dòng)更新log斩跌,如果--tail的值為0绍些,就只會(huì)打印最新的日志
查看容器內(nèi)的進(jìn)程
docker top 容器名
在運(yùn)行中的容器中啟動(dòng)新的進(jìn)程
docker exec [-d] [-i] [-t] 容器名 [COMMAND][ARGS]
之前的dc01容器沒有停止,在后臺(tái)運(yùn)行
執(zhí)行這條命令
docker exec -i -t dc01 /bin/bash
耀鸦,使用ctrl+ p 和 ctr + q 讓容器稱為守護(hù)式容器
然后通過docker top dc01
可以看到容器中多了一個(gè)進(jìn)程
停止守護(hù)式容器
docker stop 容器名
docker kill 容器名
stop命令是發(fā)送一條命令給容器柬批,等待容器的停止
kill命令直接停止容器
查看端口映射
docker post 容器名
查看鏡像詳細(xì)信息
docker inspect 鏡像名
刪除鏡像
docker rmi [OPTIONS] 鏡像名 [IMAGE...]
如果使用docker rmi ubuntu:14.04
刪除鏡像的話,可能只是刪除對(duì)應(yīng)標(biāo)簽揭糕,可以使用
docker rmi 鏡像ID
來刪除鏡像
搜索鏡像
docker search [OPTIONS] TERM
--automated=false # 只會(huì)顯示自動(dòng)化構(gòu)建的鏡像
--no-trunc=false # 如果為True萝快,將會(huì)顯示完整的信息
-s, --stars=0 # 限定最小星級(jí)
一次最多返回25個(gè)結(jié)果。
例如著角,docker search ubuntu -s 3
拉取鏡像
docker pull [OPTIONS] NAME[:TAG]
-a, --all-tags=false # 是否下載所有搜索到的版本
設(shè)置使用國內(nèi)的鏡像加速網(wǎng)站
http://624869e7.m.daocloud.io
修改文件vim /etc/default/docker
,加入語句
DOCKER_OPTS = "--registry-mirror=http://624869e7.m.daocloud.io"
重啟docker
sudo service docker restart
推送鏡像
docker push 鏡像名
刪除所有的image
docker rmi -f $(docker images -qa)
后臺(tái)程序機(jī)制
docker run -d centos
問題旋恼,使用上面的命令后吏口, 會(huì)發(fā)現(xiàn)啟動(dòng)后的容器已經(jīng)退出了奄容。
這個(gè)問題很需要,需要說明一下:Docker容器后臺(tái)運(yùn)行产徊,就必須要有一個(gè)前臺(tái)進(jìn)程昂勒。
容器運(yùn)行的命令如果不是那些一直掛起的命令,例如top舟铜,tail等戈盈,是會(huì)自動(dòng)退出的。
這是docker的機(jī)制問題谆刨,比如web容器塘娶,已nginx為例,正常情況下痊夭,配置啟動(dòng)服務(wù)只需要響應(yīng)的service即可刁岸,例如service nginx start。但是這樣做的話她我,nginx為后臺(tái)模式運(yùn)行虹曙,就導(dǎo)致docker前臺(tái)沒有運(yùn)行的應(yīng)用,這樣的容器后臺(tái)啟動(dòng)后悔立即自殺番舆,因?yàn)樗X得無事可做酝碳。
最佳的解決方案是,將要運(yùn)行的程序以前臺(tái)進(jìn)程的形式運(yùn)行恨狈。
進(jìn)入正在運(yùn)行的容器并以命令行交互
docker exec -it 容器ID /bin/bash
-
docker attach 容器ID
這兩個(gè)命令的不同疏哗,attach是直接進(jìn)入容器,不會(huì)啟動(dòng)新的進(jìn)程拴事;exec打開新的終端沃斤,并可以啟動(dòng)新的進(jìn)程。
例如刃宵,使用exec可以執(zhí)行這種命令:
docker exec -t mycentos ls -l /tmp
會(huì)在mycentos容器內(nèi)部使用ls -l /tmp
命令衡瓶,并將結(jié)果返回到docker上,而不需要到容器內(nèi)部去執(zhí)行命令了牲证。
docker啟動(dòng)容器幾個(gè)重要的命令
-
docker run --name=mycentos centos
會(huì)創(chuàng)建一個(gè)叫mycentos的centos容器哮针,該命令只會(huì)創(chuàng)建容器不會(huì)運(yùn)行 -
docker run -d --name=mycentos2 centos
會(huì)創(chuàng)建一個(gè)在后臺(tái)運(yùn)行的容器,但由于docker機(jī)制(見上面解釋)坦袍,會(huì)立即殺死十厢,所以當(dāng)使用docker ps
查看時(shí),也沒有在后臺(tái)運(yùn)行 -
docker run -it --name=mycentos3
和docker run -it --name=mycentos4 /bin/bash
都創(chuàng)建一個(gè)容器后捂齐,會(huì)打開容器的shell界面蛮放,可以使用ctrl + p
和ctrl + q
將容器放到后臺(tái)進(jìn)程去 -
docker run --name=mycentos5 /bin/bash
跟docker run --name=mycentos centos
命令效果一樣,后面的/bin/bash不生效
進(jìn)入運(yùn)行中的容器
-
docker start mycentos3
不會(huì)進(jìn)入shell界面 -
docker start -i mycentos3
會(huì)進(jìn)入容器的shell界面 -
docker attach mycentos3
會(huì)進(jìn)入容器的shell界面 -
docker exec -it mycentos3 /bin/bash
可以進(jìn)入容器的shell界面奠宜,會(huì)創(chuàng)建一個(gè)新的進(jìn)程(即打開一個(gè)新的shell終端) -
docker exec -it mycentos3
不會(huì)進(jìn)入
啟動(dòng)已創(chuàng)建但未運(yùn)行的容器
docker start mycentos
包颁,需要注意一個(gè)很讓人困惑的問題瞻想,mycentos從來沒有啟動(dòng)過后者進(jìn)入后臺(tái)進(jìn)程過,無法使用該命令啟動(dòng)娩嚼;但mycentos3已經(jīng)啟動(dòng)過但使用exit退出后(或者使用stop蘑险,kill命令殺死容器進(jìn)程),都是可以使用該命令正常啟動(dòng)的岳悟,很困惑的一個(gè)問題佃迄,待解。
從docker容器復(fù)制文件到linux系統(tǒng)
docker cp 容器名(容器ID):/tmp/yum.log(文件具體路徑) /home/flynngod(目的路徑)
從宿主機(jī)復(fù)制文件到docker容器
docker cp cp.txt(系統(tǒng)文件路徑) 容器名(容器ID):/tmp(容器文件路徑)