一.docker 是什么:
2.安裝docker
系統(tǒng):ubuntu16.04
使用腳本自動(dòng)安裝
Docker 官網(wǎng)為了簡(jiǎn)化安裝流程钟些,提供了一套安裝腳本,Ubuntu系統(tǒng)可以使用這套腳本進(jìn)行安裝
curl -sSL https://get.docker.com/ | sh
執(zhí)行這個(gè)命令后郁副,腳本就會(huì)自動(dòng)的將一切準(zhǔn)備工作做好,并把Docker install 系統(tǒng)中;不過(guò)在國(guó)內(nèi)咱們要考慮的問(wèn)題自然是 墻(翻墻安裝); 如果沒(méi)有翻墻條件的朋友建議使用阿里提供的安裝腳本
curl -sS http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
本人只用第一步就安裝成功了痹筛,所以后面的步驟就沒(méi)有記錄.
相關(guān)參考網(wǎng)站:https://zhuanlan.zhihu.com/p/26549008
更新源
sudo apt-get update
確保apt能使用https方式工作氨肌,已經(jīng)安裝ca證書(shū)
sudo apt-get install apt-transport-https ca-certificates
顯示正確為如下情況:
測(cè)試:
sudo docker run hello-world
使用hello-world進(jìn)行測(cè)試鸿秆,運(yùn)行該命令時(shí)開(kāi)始會(huì)報(bào)錯(cuò),提示image not found怎囚,因?yàn)橄螺d還沒(méi)完成卿叽。耐心等就好了。
參考網(wǎng)站:http://www.reibang.com/p/a12558da034e
3.docker常用命令詳解
根據(jù)自己的理解恳守,總的來(lái)說(shuō)分為以下幾種:
容器生命周本期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操作運(yùn)維 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
容器rootfs命令 — docker [commit|cp|diff]
鏡像倉(cāng)庫(kù) — docker [login|pull|push|search]
本地鏡像管理 — docker [images|rmi|tag|build|history|save|import]
其他命令 — docker [info|version]
- 在docker index中搜索image(search)
Usage: docker search TERM
# docker search seanlo
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
seanloook/centos6 sean's docker repos 0
搜索的范圍是官方鏡像和所有個(gè)人公共鏡像考婴。NAME列的 / 后面是倉(cāng)庫(kù)的名字。
3. 從docker registry server 中下拉image或repository(pull)
Usage: docker pull [OPTIONS] NAME[:TAG]
# docker pull centos
上面的命令需要注意催烘,在docker v1.2版本以前沥阱,會(huì)下載官方鏡像的centos倉(cāng)庫(kù)里的所有鏡像,而從v.13開(kāi)始官方文檔里的說(shuō)明變了:will pull the centos:latest image, its intermediate layers and any aliases of the same id颗圣,也就是只會(huì)下載tag為latest的鏡像(以及同一images id的其他tag)喳钟。
也可以明確指定具體的鏡像:
# docker pull centos:centos6
當(dāng)然也可以從某個(gè)人的公共倉(cāng)庫(kù)(包括自己是私人倉(cāng)庫(kù))拉取,形如docker pull username/repository<:tag_name> :
# docker pull seanlook/centos:centos6
如果你沒(méi)有網(wǎng)絡(luò)在岂,或者從其他私服獲取鏡像奔则,形如docker pull registry.domain.com:5000/repos:<tag_name>
# docker pull dl.dockerpool.com:5000/mongo:latest
4. 推送一個(gè)image或repository到registry(push)
與上面的pull對(duì)應(yīng),可以推送到Docker Hub的Public蔽午、Private以及私服易茬,但不能推送到Top Level Repository。
# docker push seanlook/mongo
# docker push registry.tp-link.net:5000/mongo:2014-10-27
registry.tp-link.net也可以寫(xiě)成IP及老,172.29.88.222抽莱。
在repository不存在的情況下,命令行下push上去的會(huì)為我們創(chuàng)建為私有庫(kù)骄恶,然而通過(guò)瀏覽器創(chuàng)建的默認(rèn)為公共庫(kù)食铐。
5.1 使用image創(chuàng)建container并執(zhí)行相應(yīng)命令,然后停止
# docker run ubuntu echo "hello world"
hello word
這是最簡(jiǎn)單的方式僧鲁,跟在本地直接執(zhí)行echo 'hello world' 幾乎感覺(jué)不出任何區(qū)別虐呻,而實(shí)際上它會(huì)從本地ubuntu:latest鏡像啟動(dòng)到一個(gè)容器象泵,并執(zhí)行打印命令后退出(docker ps -l可查看)。需要注意的是斟叼,默認(rèn)有一個(gè)--rm=true參數(shù)偶惠,即完成操作后停止容器并從文件系統(tǒng)移除。因?yàn)镈ocker的容器實(shí)在太輕量級(jí)了朗涩,很多時(shí)候用戶都是隨時(shí)刪除和新創(chuàng)建容器忽孽。
容器啟動(dòng)后會(huì)自動(dòng)隨機(jī)生成一個(gè)CONTAINER ID,這個(gè)ID在后面commit命令后可以變?yōu)?strong>IMAGE ID
使用image創(chuàng)建container并進(jìn)入交互模式, login shell是/bin/bash
# docker run -i -t --name mytest centos:centos6 /bin/bash
bash-4.1#
上面的--name參數(shù)可以指定啟動(dòng)后的容器名字谢床,如果不指定則docker會(huì)幫我們?nèi)∫粋€(gè)名字兄一。鏡像centos:centos6也可以用***IMAGE ID ***(68edf809afe7) 代替),并且會(huì)啟動(dòng)一個(gè)偽終端萤悴,但通過(guò)ps或top命令我們卻只能看到一兩個(gè)進(jìn)程瘾腰,因?yàn)槿萜鞯暮诵氖撬鶊?zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運(yùn)行所必需的覆履,除此之外蹋盆,并沒(méi)有其它的資源,可見(jiàn)Docker對(duì)資源的利用率極高硝全。此時(shí)使用exit或Ctrl+D退出后栖雾,這個(gè)容器也就消失了(消失后的容器并沒(méi)有完全刪除?)
(那么多個(gè)TAG不同而IMAGE ID相同的的鏡像究竟會(huì)運(yùn)行以哪一個(gè)TAG啟動(dòng)呢
5.2 運(yùn)行出一個(gè)container放到后臺(tái)運(yùn)行
# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done"
ae60c4b642058fefcc61ada85a610914bed9f5df0e2aa147100eab85cea785dc
它將直接把啟動(dòng)的container掛起放在后臺(tái)運(yùn)行(這才叫saas)伟众,并且會(huì)輸出一個(gè)CONTAINER ID析藕,通過(guò)docker ps可以看到這個(gè)容器的信息,可在container外面查看它的輸出docker logs ae60c4b64205凳厢,也可以通過(guò)docker attach ae60c4b64205連接到這個(gè)正在運(yùn)行的終端账胧,此時(shí)在Ctrl+C退出container就消失了,按ctrl-p ctrl-q可以退出到宿主機(jī)先紫,而保持container仍然在運(yùn)行
另外治泥,如果-d啟動(dòng)但后面的命令執(zhí)行完就結(jié)束了,如/bin/bash遮精、echo test居夹,則container做完該做的時(shí)候依然會(huì)終止。而且-d不能與--rm同時(shí)使用
可以通過(guò)這種方式來(lái)運(yùn)行memcached本冲、apache等准脂。
5.3 映射host到container的端口和目錄
映射主機(jī)到容器的端口是很有用的,比如在container中運(yùn)行memcached檬洞,端口為11211狸膏,運(yùn)行容器的host可以連接container的 internel_ip:11211 訪問(wèn),如果有從其他主機(jī)訪問(wèn)memcached需求那就可以通過(guò)-p選項(xiàng)添怔,形如-p <host_port:contain_port>湾戳,存在以下幾種寫(xiě)法:
-p 11211:11211 這個(gè)即是默認(rèn)情況下闷板,綁定主機(jī)所有網(wǎng)卡(0.0.0.0)的11211端口到容器的11211端口上
-p 127.0.0.1:11211:11211 只綁定localhost這個(gè)接口的11211端口
-p 127.0.0.1::5000
-p 127.0.0.1:80:8080
目錄映射其實(shí)是“綁定掛載”host的路徑到container的目錄,這對(duì)于內(nèi)外傳送文件比較方便院塞,在搭建私服那一節(jié),為了避免私服container停止以后保存的images不被刪除性昭,就要把提交的images保存到掛載的主機(jī)目錄下拦止。使用比較簡(jiǎn)單,-v <host_path:container_path>糜颠,綁定多個(gè)目錄時(shí)再加-v汹族。
-v /tmp/docker:/tmp/docker
另外在兩個(gè)container之間建立聯(lián)系可用--link,詳見(jiàn)高級(jí)部分或官方文檔其兴。
下面是一個(gè)例子:
# docker run --name nginx_test \
> -v /tmp/docker:/usr/share/nginx/html:ro \
> -p 80:80 -d \
> nginx:1.7.6
在主機(jī)的/tmp/docker下建立index.html顶瞒,就可以通過(guò)http://localhost:80/
或
http://host-ip:80
訪問(wèn)了。
6. 將一個(gè)container固化為一個(gè)新的image(commit)
當(dāng)我們?cè)谥谱髯约旱溺R像的時(shí)候元旬,會(huì)在container中安裝一些工具榴徐、修改配置,如果不做commit保存起來(lái)匀归,那么container停止以后再啟動(dòng)坑资,這些更改就消失了。
docker commit <container> [repo:tag]
后面的repo:tag可選
只能提交正在運(yùn)行的container穆端,即通過(guò)docker ps可以看見(jiàn)的容器袱贮,
查看剛運(yùn)行過(guò)的容器
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9fdf26326c9 nginx:1 nginx -g.. 3 hours ago Exited (0).. nginx_test
啟動(dòng)一個(gè)已存在的容器(run是從image新建容器后再啟動(dòng)),以下也可以使用docker start nginx_test代替
[root@hostname docker]# docker start c9fdf26326c9
c9fdf26326c9
docker run -i -t --sig-proxy=false 21ffe545748baf /bin/bash
nginx服務(wù)沒(méi)有啟動(dòng)
# docker commit -m "some tools installed" fcbd0a5348ca seanlook/ubuntu:14.10_tutorial
fe022762070b09866eaab47bc943ccb796e53f3f416abf3f2327481b446a9503
-a "seanlook7@gmail.com"
請(qǐng)注意体啰,當(dāng)你反復(fù)去commit一個(gè)容器的時(shí)候攒巍,每次都會(huì)得到一個(gè)新的IMAGE ID
,假如后面的repository:tag
沒(méi)有變荒勇,通過(guò)docker images'可以看到柒莉,之前提交的那份鏡像的
repository:tag'就會(huì)變成<none>:<none>
,所以盡量避免反復(fù)提交枕屉。
另外常柄,觀察以下幾點(diǎn):
<div>
<div>e</div>
<div>e</div>
<div>e</div>
</div>
-
commit container只會(huì)pause住容器,這是為了保證容器文件系統(tǒng)的一致性搀擂,但不會(huì)stop西潘。如果你要對(duì)這個(gè)容器繼續(xù)做其他修改:
- 你可以重新提交得到新image2,刪除次新的image1
- 也可以關(guān)閉容器用新image1啟動(dòng)哨颂,繼續(xù)修改喷市,提交image2后刪除image1
- 當(dāng)然這樣會(huì)很痛苦,所以一般是采用Dockerfile來(lái)build得到最終image威恼,參考[]
雖然產(chǎn)生了一個(gè)新的image品姓,并且你可以看到大小有100MB寝并,但從commit過(guò)程很快就可以知道實(shí)際上它并沒(méi)有獨(dú)立占用100MB的硬盤(pán)空間,而只是在舊鏡像的基礎(chǔ)上修改腹备,它們共享大部分公共的“片”衬潦。
1. 開(kāi)啟/停止/重啟container(start/stop/restart)
容器可以通過(guò)run
新建一個(gè)來(lái)運(yùn)行,也可以重新start
已經(jīng)停止的container
植酥,但start
不能夠再指定容器啟動(dòng)時(shí)運(yùn)行的指令镀岛,因?yàn)閐ocker只能有一個(gè)前臺(tái)進(jìn)程。
容器stop(或Ctrl+D
)時(shí)友驮,會(huì)在保存當(dāng)前容器的狀態(tài)之后退出漂羊,下次start時(shí)保有上次關(guān)閉時(shí)更改。而且每次進(jìn)入attach
進(jìn)去的界面是一樣的卸留,與第一次run啟動(dòng)或commit提交的時(shí)刻相同走越。
CONTAINER_ID=$(docker start <containner_id>)
docker stop $CONTAINER_ID
docker restart $CONTAINER_ID
關(guān)于這幾個(gè)命令可以通過(guò)一個(gè)完整的實(shí)例使用:docker如何創(chuàng)建一個(gè)運(yùn)行后臺(tái)進(jìn)程的容器并同時(shí)提供shell終端。
2. 連接到正在運(yùn)行中的container(attach)
要attach
上去的容器必須正在運(yùn)行耻瑟,可以同時(shí)連接上同一個(gè)container
來(lái)共享屏幕(與screen
命令的attach類(lèi)似)旨指。
官方文檔中說(shuō)attach
后可以通過(guò)CTRL-C
來(lái)detach,但實(shí)際上經(jīng)過(guò)我的測(cè)試喳整,如果container當(dāng)前在運(yùn)行bash淤毛,CTRL-C
自然是當(dāng)前行的輸入,沒(méi)有退出算柳;如果container當(dāng)前正在前臺(tái)運(yùn)行進(jìn)程低淡,如輸出nginx的access.log日志,CTRL-C
不僅會(huì)導(dǎo)致退出容器瞬项,而且還stop了蔗蹋。這不是我們想要的,detach的意思按理應(yīng)該是脫離容器終端囱淋,但容器依然運(yùn)行猪杭。好在attach是可以帶上--sig-proxy=false
來(lái)確保CTRL-D
或CTRL-C
不會(huì)關(guān)閉容器。
# docker attach --sig-proxy=false $CONTAINER_ID
3. 查看image或container的底層信息(inspect)
inspect
的對(duì)象可以是image妥衣、運(yùn)行中的container和停止的container皂吮。
查看容器的內(nèi)部IP
# docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
172.17.42.35
4. 刪除一個(gè)或多個(gè)container、image(rm税手、rmi)
你可能在使用過(guò)程中會(huì)buil
d或commit
許多鏡像蜂筹,無(wú)用的鏡像需要?jiǎng)h除。但刪除這些鏡像是有一些條件的:
同一個(gè)IMAGE ID
可能會(huì)有多個(gè)TAG
(可能還在不同的倉(cāng)庫(kù))芦倒,首先你要根據(jù)這些 image names
來(lái)刪除標(biāo)簽艺挪,當(dāng)刪除最后一個(gè)tag
的時(shí)候就會(huì)自動(dòng)刪除鏡像;
承上兵扬,如果要?jiǎng)h除的多個(gè)IMAGE NAME
在同一個(gè)REPOSITORY
麻裳,可以通過(guò)docker rmi <image_id>
來(lái)同時(shí)刪除剩下的TAG
口蝠;若在不同Repo則還是需要手動(dòng)逐個(gè)刪除TAG
;
還存在由這個(gè)鏡像啟動(dòng)的container時(shí)(即便已經(jīng)停止)津坑,也無(wú)法刪除鏡像妙蔗;
TO-DO
如何查看鏡像與容器的依存關(guān)系
刪除容器
docker rm <container_id/contaner_name>
刪除所有停止的容器
docker rm $(docker ps -a -q)
刪除鏡像
docker rmi <image_id/image_name ...>
下面是一個(gè)完整的示例:
# docker images <==
ubuntu 13.10 195eb90b5349 4 months ago 184.6 MB
ubuntu saucy 195eb90b5349 4 months ago 184.6 MB
seanlook/ubuntu rm_test 195eb90b5349 4 months ago 184.6 MB
使用195eb90b5349啟動(dòng)、停止一個(gè)容器后疆瑰,刪除這個(gè)鏡像
# docker rmi 195eb90b5349
Error response from daemon: Conflict, cannot delete image 195eb90b5349 because it is
tagged in multiple repositories, use -f to force
2014/11/04 14:19:00 Error: failed to remove one or more images
刪除seanlook倉(cāng)庫(kù)中的tag <==
# docker rmi seanlook/ubuntu:rm_test
Untagged: seanlook/ubuntu:rm_test
現(xiàn)在刪除鏡像灭必,還會(huì)由于container的存在不能rmi
# docker rmi 195eb90b5349
Error response from daemon: Conflict, cannot delete 195eb90b5349 because the
container eef3648a6e77 is using it, use -f to force
2014/11/04 14:24:15 Error: failed to remove one or more images
先刪除由這個(gè)鏡像啟動(dòng)的容器 <==
# docker rm eef3648a6e77
刪除鏡像 <==
# docker rmi 195eb90b5349
Deleted: 195eb90b534950d334188c3627f860fbdf898e224d8a0a11ec54ff453175e081
Deleted: 209ea56fda6dc2fb013e4d1e40cb678b2af91d1b54a71529f7df0bd867adc961
Deleted: 0f4aac48388f5d65a725ccf8e7caada42f136026c566528a5ee9b02467dac90a
Deleted: fae16849ebe23b48f2bedcc08aaabd45408c62b531ffd8d3088592043d5e7364
Deleted: f127542f0b6191e99bb015b672f5cf48fa79d974784ac8090b11aeac184eaaff
注意,上面的刪除過(guò)程我所舉的例子比較特殊——鏡像被tag在多個(gè)倉(cāng)庫(kù)乃摹,也有啟動(dòng)過(guò)的容器。按照<==指示的順序進(jìn)行即可跟衅。
Docker 容器鏡像刪除
1.停止所有的container孵睬,這樣才能夠刪除其中的images:
docker stop $(docker ps -a -q)
如果想要?jiǎng)h除所有container的話再加一個(gè)指令:
docker rm $(docker ps -a -q)
2.查看當(dāng)前有些什么images
docker images
3.刪除images,通過(guò)image的id來(lái)指定刪除誰(shuí)
docker rmi <image id>
想要?jiǎng)h除untagged images伶跷,也就是那些id為<None>的image的話可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要?jiǎng)h除全部image的話
docker rmi $(docker images -q)
5. docker build 使用此配置生成新的image
build
命令可以從Dockerfile
和上下文來(lái)創(chuàng)建鏡像:
docker build [OPTIONS] PATH | URL | -
上面的PATH
或URL
中的文件被稱(chēng)作上下文掰读,build image的過(guò)程會(huì)先把這些文件傳送到docker的服務(wù)端來(lái)進(jìn)行的。
如果PATH
直接就是一個(gè)單獨(dú)的Dockerfile
文件則可以不需要上下文叭莫;如果URL
是一個(gè)Git倉(cāng)庫(kù)地址蹈集,那么創(chuàng)建image的過(guò)程中會(huì)自動(dòng)git clone
一份到本機(jī)的臨時(shí)目錄,它就成為了本次build的上下文雇初。無(wú)論指定的PATH是什么拢肆,Dockerfile
是至關(guān)重要的,請(qǐng)參考Dockerfile Reference靖诗。
請(qǐng)看下面的例子:
# cat Dockerfile
FROM seanlook/nginx:bash_vim
EXPOSE 80
ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash
# docker build -t seanlook/nginx:bash_vim_Df .
Sending build context to Docker daemon 73.45 MB
Sending build context to Docker daemon
Step 0 : FROM seanlook/nginx:bash_vim
---> aa8516fa0bb7
Step 1 : EXPOSE 80
---> Using cache
---> fece07e2b515
Step 2 : ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash
---> Running in e08963fd5afb
---> d9bbd13f5066
Removing intermediate container e08963fd5afb
Successfully built d9bbd13f5066
上面的PATH
為.郭怪,所以在當(dāng)前目錄下的所有文件(不包括.dockerignore中的)將會(huì)被tar
打包并傳送到docker daemon
(一般在本機(jī)),從輸出我們可以到Sending build context...
刊橘,最后有個(gè)Removing intermediate container
的過(guò)程鄙才,可以通過(guò)--rm=false來(lái)保留容器。
TO-DO
docker build github.com/creack/docker-firefox
失敗促绵。
- 給鏡像打上標(biāo)簽(tag)
tag的作用主要有兩點(diǎn):一是為鏡像起一個(gè)容易理解的名字攒庵,二是可以通過(guò)docker tag來(lái)重新指定鏡像的倉(cāng)庫(kù),這樣在push
時(shí)自動(dòng)提交到倉(cāng)庫(kù)败晴。
將同一IMAGE_ID的所有tag浓冒,合并為一個(gè)新的
# docker tag 195eb90b5349 seanlook/ubuntu:rm_test
新建一個(gè)tag,保留舊的那條記錄
# docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag
7. 查看容器的信息container(ps)
docker ps
命令可以查看容器的CONTAINER ID尖坤、NAME裆蒸、IMAGE NAME
、端口開(kāi)啟及綁定糖驴、容器啟動(dòng)后執(zhí)行的COMMNAD僚祷。經(jīng)常通過(guò)ps
來(lái)找到CONTAINER_ID
佛致。
docker ps 默認(rèn)顯示當(dāng)前正在運(yùn)行中的container
docker ps -a查看包括已經(jīng)停止的所有容器
docker ps -l顯示最新啟動(dòng)的一個(gè)容器(包括已停止的)
*** -q, --quiet=false Only show numeric IDs#顯示所有鏡像容器的id號(hào)
8. 查看容器中正在運(yùn)行的進(jìn)程(top)
容器運(yùn)行時(shí)不一定有/bin/bash
終端來(lái)交互執(zhí)行top
命令,查看container中正在運(yùn)行的進(jìn)程辙谜,況且還不一定有top
命令俺榆,這是docker top <container_id/container_name>
就很有用了。實(shí)際上在host上使用ps -ef|grep docker
也可以看到一組類(lèi)似的進(jìn)程信息装哆,把container里的進(jìn)程看成是host上啟動(dòng)docker的子進(jìn)程就對(duì)了罐脊。
- 其他命令
docker還有一些如login、cp蜕琴、logs萍桌、export、import凌简、load上炎、kill
等不是很常用的命令。
Docker
我們通過(guò)docker的兩個(gè)參數(shù) -i -t雏搂,讓docker運(yùn)行的容器實(shí)現(xiàn)"對(duì)話"的能力
? -t:在新容器內(nèi)指定一個(gè)偽終端或終端藕施。
-t :指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名
? -i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。
我們還要將其啟動(dòng)在后臺(tái)(Daemonized)凸郑,加上-d參數(shù)裳食。
-d: 后臺(tái)運(yùn)行容器,并返回容器ID
sudo docker rm $(docker ps -a -q):刪除所有容器
刪除seanlook倉(cāng)庫(kù)中的tag <== # docker rmi seanlook/ubuntu:rm_test Untagged: seanlook/ubuntu:rm_test
創(chuàng)建自定義鏡像的文件芙沥。它通常分為四部分:基礎(chǔ)鏡像信息诲祸,維護(hù)者信息,鏡像操作指令和容器啟動(dòng)時(shí)的指令
使用URL github.com/creack/docker-firefox 的 Dockerfile 創(chuàng)建鏡像而昨。
docker build github.com/creack/docker-firefox
git clone https://github.com/sameersbn/docker-gitlab.git
cd docker-gitlab
docker build --tag="$USER/gitlab" .
其它 docker build 的用法
直接用 Git repo 進(jìn)行構(gòu)建
或許你已經(jīng)注意到了烦绳,docker build 還支持從 URL 構(gòu)建,比如可以直接從 Git repo 中構(gòu)建:
docker build http://server/context.tar.gz
如果所給出的 URL 不是個(gè) Git repo植袍,而是個(gè) tar 壓縮包惧眠,那么 Docker 引擎會(huì)下載這個(gè)包,并自動(dòng)解壓縮于个,以其作為上下文氛魁,開(kāi)始構(gòu)建。
從標(biāo)準(zhǔn)輸入中讀取 Dockerfile 進(jìn)行構(gòu)建
docker build - < Dockerfile
或
cat Dockerfile | docker build -
如果標(biāo)準(zhǔn)輸入傳入的是文本文件,則將其視為 Dockerfile秀存,并開(kāi)始構(gòu)建捶码。這種形式由于直接從標(biāo)準(zhǔn)輸入中讀取 Dockerfile 的內(nèi)容,它沒(méi)有上下文或链,因此不可以像其他方法那樣可以將本地文件 COPY 進(jìn)鏡像之類(lèi)的事情惫恼。
從標(biāo)準(zhǔn)輸入中讀取上下文壓縮包進(jìn)行構(gòu)建
$ docker build - < context.tar.gz
如果發(fā)現(xiàn)標(biāo)準(zhǔn)輸入的文件格式是 gzip、bzip2 以及 xz 的話澳盐,將會(huì)使其為上下文壓縮包祈纯,直接將其展開(kāi),將里面視為上下文叼耙,并開(kāi)始構(gòu)建腕窥。
譬如我要啟動(dòng)一個(gè)CentOS容器,宿主機(jī)的/test目錄掛載到容器的/soft目錄筛婉,可通過(guò)以下方式指定:
docker run -it -v /test:/soft centos /bin/bash
這樣在容器啟動(dòng)后簇爆,容器內(nèi)會(huì)自動(dòng)創(chuàng)建/soft的目錄。通過(guò)這種方式倾贰,我們可以明確一點(diǎn),即-v參數(shù)中拦惋,冒號(hào)":"前面的目錄是宿主機(jī)目錄匆浙,后面的目錄是容器內(nèi)目錄。
docker run :
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach=false 指定容器運(yùn)行于前臺(tái)還是后臺(tái)厕妖,默認(rèn)為false
-i, --interactive=false 打開(kāi)STDIN首尼,用于控制臺(tái)交互
-t, --tty=false 分配tty設(shè)備,該可以支持終端登錄言秸,默認(rèn)為false
-u, --user="" 指定容器的用戶
-a, --attach=[] 登錄容器(必須是以docker run -d啟動(dòng)的容器)
-w, --workdir="" 指定容器的工作目錄
-c, --cpu-shares=0 設(shè)置容器CPU權(quán)重软能,在CPU共享場(chǎng)景使用
-e, --env=[] 指定環(huán)境變量,容器中可以使用該環(huán)境變量
-m, --memory="" 指定容器的內(nèi)存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主機(jī)名
-v, --volume=[] 給容器掛載存儲(chǔ)卷举畸,掛載到容器的某個(gè)目錄
--volumes-from=[] 給容器掛載其他容器上的卷查排,掛載到容器的某個(gè)目錄
--cap-add=[] 添加權(quán)限,權(quán)限清單詳見(jiàn):http://linux.die.net/man/7/capabilities
--cap-drop=[] 刪除權(quán)限抄沮,權(quán)限清單詳見(jiàn):http://linux.die.net/man/7/capabilities
--cidfile="" 運(yùn)行容器后跋核,在指定文件中寫(xiě)入容器PID值,一種典型的監(jiān)控系統(tǒng)用法
--cpuset="" 設(shè)置容器可以使用哪些CPU叛买,此參數(shù)可以用來(lái)容器獨(dú)占CPU
--device=[] 添加主機(jī)設(shè)備給容器砂代,相當(dāng)于設(shè)備直通
--dns=[] 指定容器的dns服務(wù)器
--dns-search=[] 指定容器的dns搜索域名,寫(xiě)入到容器的/etc/resolv.conf文件
--entrypoint="" 覆蓋image的入口點(diǎn)
--env-file=[] 指定環(huán)境變量文件率挣,文件格式為每行一個(gè)環(huán)境變量
--expose=[] 指定容器暴露的端口刻伊,即修改鏡像的暴露端口
--link=[] 指定容器間的關(guān)聯(lián),使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件捶箱,只有在指定--exec-driver=lxc時(shí)使用
--name="" 指定容器名字智什,后續(xù)可以通過(guò)名字進(jìn)行容器管理,links特性需要使用名字
--net="bridge" 容器網(wǎng)絡(luò)設(shè)置:
bridge 使用docker daemon指定的網(wǎng)橋
host //容器使用主機(jī)的網(wǎng)絡(luò)
container:NAME_or_ID >//使用其他容器的網(wǎng)路讼呢,共享IP和PORT等網(wǎng)絡(luò)資源
none 容器使用自己的網(wǎng)絡(luò)(類(lèi)似--net=bridge)撩鹿,但是不進(jìn)行配置
--privileged=false 指定容器是否為特權(quán)容器,特權(quán)容器擁有所有的capabilities
--restart="no" 指定容器停止后的重啟策略:
no:容器退出時(shí)不重啟
on-failure:容器故障退出(返回值非零)時(shí)重啟
always:容器退出時(shí)總是重啟
--rm=false 指定容器停止后自動(dòng)刪除容器(不支持以docker run -d啟動(dòng)的容器)
--sig-proxy=true 設(shè)置由代理接受并處理信號(hào)悦屏,但是SIGCHLD节沦、SIGSTOP和SIGKILL不能被代理
-h "mars": 指定容器的hostname;
-p <宿主端口>:<容器端口> 區(qū)分開(kāi)來(lái)础爬。-p甫贯,是映射宿主端口和容器端口
--name="nginx-lb": 為容器指定一個(gè)名稱(chēng)
docker掛載目錄:
Docker容器啟動(dòng)的時(shí)候,如果要掛載宿主機(jī)的一個(gè)目錄看蚜,可以用-v參數(shù)指定叫搁。
譬如我要啟動(dòng)一個(gè)CentOS容器,宿主機(jī)的/test目錄掛載到容器的/soft目錄供炎,可通過(guò)以下方式指定:
docker run -it -v /test:/soft centos /bin/bash
這樣在容器啟動(dòng)后渴逻,容器內(nèi)會(huì)自動(dòng)創(chuàng)建/soft的目錄。通過(guò)這種方式音诫,我們可以明確一點(diǎn)惨奕,即-v參數(shù)中,冒號(hào)":"前面的目錄是宿主機(jī)目錄竭钝,后面的目錄是容器內(nèi)目錄梨撞。
貌似簡(jiǎn)單,其實(shí)不然香罐,下面我們來(lái)驗(yàn)證一下:
一卧波、容器目錄不可以為相對(duì)路徑
[root@localhost ~]# docker run -it -v /test:soft
centos /bin/bash
invalid value "/test:soft" for flag -v: soft is not an absolute path
See 'docker run --help'.
直接報(bào)錯(cuò),提示soft不是一個(gè)絕對(duì)路徑庇茫,所謂的絕對(duì)路徑港粱,必須以下斜線“/”開(kāi)頭。
docker run參數(shù):
-p IP:host_port:container_port 或 -p IP::port
配置網(wǎng)絡(luò)訪問(wèn)域名(ip)和端口轉(zhuǎn)發(fā)容器端口
監(jiān)聽(tīng)主機(jī)的指定域名端口轉(zhuǎn)發(fā)到容器的端口
四.添加到用戶組(可選項(xiàng))
1.添加到用戶組(so easy)
sudo groupadd docker
sudo usermod -aG docker $USER
注銷(xiāo)系統(tǒng)重新進(jìn)入系統(tǒng)旦签,就可以直接使用docker開(kāi)頭了啥容。
2.如果不添加到用戶組會(huì)發(fā)生什么呢?
如果直接運(yùn)行:
docker run hello-world
你會(huì)發(fā)現(xiàn)下面的錯(cuò)誤:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json: dial unix /var/run/docker.sock: connect: permission denied
這是因?yàn)椋?/p>
docker守護(hù)程序綁定到Unix套接字而不是TCP端口顷霹。默認(rèn)情況下咪惠,Unix套接字由用戶root擁有,其他用戶只能使用sudo訪問(wèn)它淋淀。 docker守護(hù)程序始終以root用戶身份運(yùn)行遥昧。 如果您不想在使用docker命令時(shí)使用sudo覆醇,請(qǐng)創(chuàng)建名為docker的Unix組,并將用戶添加到該組炭臭。當(dāng)docker守護(hù)進(jìn)程啟動(dòng)時(shí)永脓,它會(huì)使Docker組的Unix套接字的所有權(quán)讀/寫(xiě)。
3.docker 普通用戶鞋仍,加入docker用戶組
普通用戶竞滓,加入docker用戶組钠龙,去掉sudo
操作順序:
sudo cat /etc/group | grep docker
如果不存在docker組冕茅,可以添加sudo groupadd docker
添加當(dāng)前用戶到docker組析显,sudo gpasswd -a ${USER} docker
重啟docker服務(wù),sudo systemctl restart docker
如果權(quán)限不夠,sudo chmod a+rw /var/run/docker.sock
Docker私有倉(cāng)庫(kù)搭建
http://blog.csdn.net/wangtaoking1/article/details/44180901
參考網(wǎng)站:https://yeasy.gitbooks.io/docker_practice/content/container/enter.html
http://www.sklinux.com/1394
FTP_SVN_DNS_LINUX服務(wù)器維護(hù)_搭建web云服務(wù)器安全配置
-.video-wrap{position:relative;width:100%;padding:0}.video-wrap embed, .video-wrap object, .video-wrap iframe{position:absolute;top:0;left:0;width:100%;height:100%}
jQuery(document).ready(function(("#wrapper").vids();});
如何打開(kāi)多個(gè)終端進(jìn)入Docker容器
Docker容器運(yùn)行后肚豺,如何進(jìn)入容器進(jìn)行操作呢溃斋?起初我是用SSH。如果只啟動(dòng)一個(gè)容器吸申,用SSH還能應(yīng)付梗劫,只需要將容器的22端口映射到本機(jī)的一個(gè)端口即可。當(dāng)我啟動(dòng)了五個(gè)容器后截碴,每個(gè)容器默認(rèn)是沒(méi)有配置SSH Server的梳侨,安裝配置SSHD,映射容器SSH端口日丹,實(shí)在是麻煩走哺。 我發(fā)現(xiàn)很多Docker鏡像都是沒(méi)有安裝SSHD服務(wù)的,難道有其他方法進(jìn)入Docker容器聚凹?有很多種方法割坠,包括使用 docker attach 命令或 nsenter 工具等齐帚。使用 attach 命令有時(shí)候并不方便妒牙。當(dāng)多個(gè)窗口同時(shí) attach 到同一個(gè)容器的時(shí)候,所有窗口都會(huì)同步顯示对妄。nsenter 可以訪問(wèn)另一個(gè)進(jìn)程的名字空間湘今。為了連接到容器,你還需要找到容器的第一個(gè)進(jìn)程的 PID剪菱,可以通過(guò)下面的命令獲取摩瞎。PID= nsenter –target
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
echo
docker-enter <container>
附.bashrc_docker文件內(nèi)容:# Some useful commands to use docker.# Author: yeasy@github# Created:2014-09-25
alias docker-pid=”sudo docker inspect –format ‘{{.State.Pid}}’”alias docker-ip=”sudo docker inspect –format ‘{{ .NetworkSettings.IPAddress }}’”
the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enterfunction docker-enter() {if [ -e
0")/nsenter ]; then# with boot2docker, nsenter is not in the PATH but it is in the same folderNSENTER=
0″)/nsenterelseNSENTER=nsenterfi[ -z "$NSENTER" ] && echo “WARN Cannot find nsenter” && return
if [ -z "0″` CONTAINER [COMMAND [ARG]…]”echo “”echo “Enters the Docker CONTAINER and executes the specified COMMAND.”echo “If COMMAND is not specified, runs an interactive shell in CONTAINER.”elsePID=
1″)if [ -z "
PID –mount –uts –ipc –net –pid”
if [ -z "NSENTER “
NSENTER –target
NSENTER –target
@fifi}
Dockerfile:
RUN命令會(huì)在上面指定的鏡像里執(zhí)行任何命令
RUN apt-get update
RUN apt-get install -y nginx
7.6 ADD
<pre>ADD <src>... <dest></pre>
ADD復(fù)制本地主機(jī)文件、目錄或者遠(yuǎn)程文件 URLS 從 并且添加到容器指定路徑中 稠氮。
支持通過(guò) GO 的正則模糊匹配曹阔,具體規(guī)則可參見(jiàn) Go filepath.Match
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character
- 路徑必須是絕對(duì)路徑,如果 不存在隔披,會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)目錄
- 路徑必須是 Dockerfile 所在路徑的相對(duì)路徑
- 如果是一個(gè)目錄赃份,只會(huì)復(fù)制目錄下的內(nèi)容,而目錄本身則不會(huì)被復(fù)制
1. COPY指令
COPY指令能夠?qū)?gòu)建命令所在的主機(jī)本地的文件或目錄奢米,復(fù)制到鏡像文件系統(tǒng)抓韩。
CMD exec /bin/bash -c "/etc/init.d/xinetd start; trap : TERM INT; sleep infinity & wait"
當(dāng)執(zhí)行系統(tǒng)命令的時(shí)候,才會(huì)加-c
trap 的使用
1恃慧、運(yùn)行格式
trap命令的參數(shù)分為兩部分园蝠,前一部分是接收到指定信號(hào)時(shí)將要采取的行動(dòng),后一部分是要處理的信號(hào)名痢士。
trap command signal
它有三種形式分別對(duì)應(yīng)三種不同的信號(hào)回應(yīng)方式彪薛。
第一種:
trap "commands" signal-list
當(dāng)腳本收到signal-list清單內(nèi)列出的信號(hào)時(shí),trap命令執(zhí)行雙引號(hào)中的命令怠蹂。
第二種:
trap signal-list
trap不指定任何命令善延,接受信號(hào)的默認(rèn)操作,默認(rèn)操作是結(jié)束進(jìn)程的運(yùn)行城侧。
第三種:
trap " " signal-list
trap命令指定一個(gè)空命令串易遣,允許忽視信號(hào),我們用到的就是這一種嫌佑。
CMD exec /bin/bash -c "/etc/init.d/xinetd start; trap : TERM INT; sleep infinity & wait"
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強(qiáng)制終止
CONT 18 繼續(xù)(與STOP相反豆茫, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)
sleep命令常用于在Linux shell腳本中延遲時(shí)間。
永久等待 sleep infinity?
有時(shí)寫(xiě)了一個(gè)sh文件后需要保持這個(gè)sh的運(yùn)行屋摇,就用sleep永久等待好咯
sleep infinity
wait
wait是用來(lái)阻塞當(dāng)前進(jìn)程的執(zhí)行揩魂,直至指定的子進(jìn)程執(zhí)行結(jié)束后,才繼續(xù)執(zhí)行炮温。使用wait可以在bash腳本“多進(jìn)程”執(zhí)行模式下火脉,起到一些特殊控制的作用。
使用格式
wait [進(jìn)程號(hào) 或 作業(yè)號(hào)]
eg:wait 23 or wait %1
備注:
如果wait后面不帶任何的進(jìn)程號(hào)或作業(yè)號(hào)柒啤,那么wait會(huì)阻塞當(dāng)前進(jìn)程的執(zhí)行倦挂,直至當(dāng)前進(jìn)程的所有子進(jìn)程都執(zhí)行結(jié)束后,才繼續(xù)執(zhí)行担巩。
#方援!/bin/sh
echo “1”
sleep 5&
echo “3”
echo “4”
wait #會(huì)等待wait所在bash上的所有子進(jìn)程的執(zhí)行結(jié)束,本例中就是sleep 5這句
echo”5”
EXPOSE
EXPOSE <port> [<port>...]
告訴 Docker 服務(wù)端容器對(duì)外映射的本地端口涛癌,需要在 docker run 的時(shí)候使用-p或者-P選項(xiàng)生效犯戏。
【docker】查看docker容器或鏡像的詳細(xì)信息命令窥浪,查看docker中正在運(yùn)行的容器的掛載位置
命令:
docker inspect f257d69e0035</pre>
格式:
docker inspect 容積或鏡像ID</pre>
首先,docker ps獲取簡(jiǎn)要信息
參考網(wǎng)站:
pwndocker :https://github.com/skysider/pwndocker
Docker —— 從入門(mén)到實(shí)踐:https://yeasy.gitbooks.io/docker_practice/content/install/ubuntu.html
我眼中的 Docker(二)Image:http://blog.csdn.net/jcjc918/article/details/46500031
非常詳細(xì)的資料:https://www.cnblogs.com/LinuxSuDa/p/6408364.html
有貨:https://segmentfault.com/a/1190000007652344
docker /web-docker練習(xí)網(wǎng)站:https://github.com/imagemlt/CTF_web_dockers
git報(bào)錯(cuò)--RPC failed; curl 18 transfer closed with outstanding read data remaining:
https://blog.csdn.net/IT_liuchengli/article/details/77040806
docker ctf環(huán)境詳解:
http://www.k0rz3n.com/2018/05/17/%E6%90%AD%E5%BB%BAdocker%E7%9A%84%20CTF%20getshell%E7%8E%AF%E5%A2%83/
daocker非常實(shí)用網(wǎng)站:
https://yeasy.gitbooks.io/docker_practice/introduction/