亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

docker常用命令操作方法

2024-09-01 13:53:22
字體:
來源:轉載
供稿:網友

繼續docker的學習之旅,今天練習一些常用的命令:

一、鏡像相關

1.1 列出本機所有鏡像

 

docker常用命令,docker,常用命令詳解

后面的操作,都以ubuntu做為練習的目標。

另外:如果某些鏡像文件不想要了,可以用下面的命令刪除

1.2 刪除鏡像

docker rmi 鏡像Id(即:1.1圖中的IMAGE ID)

有時候刪除會失敗,比如:有一個容器正在使用該鏡像文件。這時可以加參數-f 強制刪除,如果不清楚每個命令可以加哪些參數,可以用

docker 命令 --help

查看幫助,比如:

 bin docker rmi --helpUsage: docker rmi [OPTIONS] IMAGE [IMAGE...]Remove one or more images -f, --force=false Force removal of the image --help=false   Print usage --no-prune=false  Do not delete untagged parents

二、容器相關

2.1 最基本的啟動

docker run -it ubuntu

參數-it的含義,可以用docker run --help查看,就不展開了

2.2 啟動后執行命令

docker run -it ubuntu echo 'hello world'

2.3 啟動時指定容器名稱

docker run -it --name 'myubuntu' ubuntu

容器名稱是一個很有意思的東東,后面馬上會講到。上面的命令運行完以后,先用exit退出,以便后面學習其它命令。

2.4 查看最近運行過的所有容器

docker ps -a  

docker常用命令,docker,常用命令詳解  

從圖上可以看出,如果啟動時未顯示指定容器名稱,docker會自動生成一個好玩的名稱,命令的風格大致是:什么樣的_誰誰,比如圖中的insane_lamarr,字面的意思為"瘋狂的拉馬爾",從這些細節可以感受到,docker的創造者們都是一幫很愛玩的家伙。

除了容器名稱,還有二列非常重要:CONTAINER ID及STATUS,其中STATUS中以Up開頭的,表示容器正在運行(注:容器是否處于運行狀態,排除人為docker stop的因素外,很大程序上是由docker run 最后的命令參數決定的,如果啟動時不指定任何命令參數,默認執行/bin/bash,如果指定了類似echo "hello world"之類瞬間就執行完的命令,run起來,馬上就會轉為關閉,因為命令已經執行完了),而CONTAINER ID在很多場景中都會用到(比如:刪除容器)

docker常用命令,docker,常用命令詳解

另外,對于同一個鏡像(比如ubuntu),默認不指定容器名稱的話,每次容器啟動docker都會生成一個唯一的名稱,這個有點象OOP編程,鏡像相當于Class類定義,是一個只讀的模板,而容器則是類的運行實例,java中每次new出來的實例,其hashcode必然不同,所以每次啟動的docker容器,名稱也不一樣,只不過與OOP不同的是,OOP中實例消亡了,所有關聯的信息全清掉了,而docker容器就算停止掉,docker仍會記住其最后的運行狀態。

可以做一個小試驗,剛才我們已經創建了一個名為myubuntu的容器:

docker run -it --name 'myubuntu' ubuntu

這一行命令再次運行的話,就會報錯:

Error response from daemon: Conflict. The name "myubuntu" is already in use by container d1c261ad0b1e. You have to remove (or rename) that container to be able to reuse that name.

大意是容器名稱mybutun已經被另一個容器(ID為d1c261ad0b1e)占用了,要么把原來的容器刪除,要么換個名字。

這其中的設計思想,可以仔細琢磨一二,想想也十分合理:類比一下,我們寫代碼時,同一個類new出多個實例,每個實例都會有自己不同的應用場景,比如:同樣是一個Order實例,可以用在訂單創建的業務場景中,也可以用在訂單查詢的返回結果中...,docker的鏡像也是如此,同樣一個ubuntu鏡像文件,有人用它創建容器是為了安裝nginx當成web server,有人用它創建容器是為了學習hadoop...,為了能以一種友好的方式來區分,所以名字不能沖突,然后,同一個名字的容器,今天安裝了軟件A,玩事兒后將它關閉,明天可能會繼續在這個容器上折騰其它事情,所以每次容器停止,不可能象OOP中的實例一樣,徹底丟棄實例的所有信息,否則明天就沒辦法接著玩了。

2.5 停止運行中的容器

docker stop 容器名稱

2.6 刪除容器

docker rm 容器ID

如果容器處于運行狀態,上面的操作會失敗,可以加-f參數強制刪除  

2.7 在已運行的容器中,直接執行命令

docker exec 容器名稱 命令

例如:  

docker exec myubuntu apg-get update

2.8 附加到已經運行的容器

docker attach 容器名稱

注:該命令運行后,mac上屏幕沒任何輸出,還以為卡死了,這是假象,直接繼續輸入命令,比如pwd之類的就能看到結果了.

attach這個命令不太好用,進入終端后,沒辦法退出而不停止容器,要退出只能輸入exit,但這樣就將容器停止了,另外一個缺點是,如果多個容器同時attach到相同的容器,在一個窗口中操作的結果,會同步顯示到所有窗口。

建議用下面的命令代替:

docker exec -it 容器名稱 sh

當然進入容器還有其它一些辦法,比如網絡端口22映射本機某個端口,容器里啟動ssh服務,然后ssh連接進入,或者用nsenter結合進程id進入,但個人覺得這些方法操作都太復雜,遠不如上面這行命令簡單

2.9 保存對容器所做的修改

在容器上做了一堆操作后,比如在ubuntu的基礎上安裝了一些軟件、部署了一些應用之類,希望分發到其它機器,最簡單的辦法就是把容器重新生成一個新鏡像,然后其它人直接docker pull你的新鏡像就可以了。

docker commit -a 作者名字 -m 提交原因 -p 容器ID 鏡像名稱:版本號

比如:

docker commit -a 'yjmyzz' -m 'test commit' -p d1c261ad0b1e yjmyzz/ubuntu:V2

提交完成后,可以

docker images 查看

docker常用命令,docker,常用命令詳解

從圖中可以看出,在ubuntu原來的基礎上,生成一個名為yjmyzz/ubuntu的新鏡像,然后用新鏡像創建容器試試看

docker run -it --name 'myubuntu2' yjmyzz/ubuntu:V2 

三、卷(volumn)相關

我們平時在使用電腦的過程中,會經常通過usb插入一些外部存儲設備,比如:u盤之類,插好后,就能象常規硬盤目錄一樣訪問外部存儲設備。卷(volume)的意思其實跟這個差不多,可以把host機上的某個目錄"插入"到容器中,然后容器中就能直接訪問host機上的文件了,即使容器刪除掉,卷里的數據仍然可能持久保存。

3.1 創建卷

docker run -it -v /Users/yjmyzz/docker_volumn:/opt/webapp --name myubuntu ubuntu /bin/bash

這個命令略長,但并不復雜,跟前面提到的啟動容器相比,只是多了一個-v /Users/yjmyzz/docker_volumn:/opt/webapp的部分,意思就是將本機/Users/yjmyzz/docker_volumn這個目錄映射到容器中的/opt/webapp,啟動成功后,保持當前窗口不退出,可以再新開一個terminal容器,進入容器驗證一下

docker常用命令,docker,常用命令詳解

可以嘗試在host本機修改下/Users/yjmyzz/docker_volumn/index.html這個文件,然后在容器中cat看下內容,應該馬上就能看到最新的內容。

三個大坑:

其一:

-v 參數可以只寫前面第一部分,-v /Users/yjmyzz/docker_volumn 這樣啟動也不會報錯,但是這樣做的效果,在最新版本的docker(1.9.1)上,只會把本機目錄掛到容器中,容器中看不到本機的任何文件,所以一定要記得寫:后的部分

其二:

權限問題,mac機上如果從網上down(非apple store官方)了一個文件到本機,該文件甚至保存文件的目錄權限,都會被設置成特殊權限@,見下面的截圖:

docker常用命令,docker,常用命令詳解

這本來是mac 10.5以后做的一項安全改進,有此標識的程序,在首次執行時會提示

docker常用命令,docker,常用命令詳解

但是有這類特殊權限的目錄或文件,被掛到容器中后,docker容器內根本看不到,也就是無權讀取。處理辦法:

ll -l@ -a

先用這個顯示特殊權限的詳細信息:

docker常用命令,docker,常用命令詳解

然后用xattr -r -d 詳細信息 * 去掉這些特殊權限(參考下圖),然后再重新掛到容器中,就能正常使用了

docker常用命令,docker,常用命令詳解

其三:

mac上掛載的本機目錄,必須是在~/(即:當前用戶的目錄)下,類似/opt/www這樣的目錄,就算給它所有權限,掛到容器中后,也只能看到目錄,讀不到任何文件,centOS上沒這問題。

此外,還可以用命令

docker inspect myubuntu

查看此時容器的所有狀態,會看到一段長長的json輸出,類似下面這樣:

[{ "Id": "21d15713166ae83b022eea8806bd466da9917422e487e874cc098a0f1329dd48", "Created": "2016-01-28T02:23:43.91086474Z", "Path": "/bin/bash", "Args": [], "State": {  "Status": "running",  "Running": true,  "Paused": false,  "Restarting": false,  "OOMKilled": false,  "Dead": false,  "Pid": 1843,  "ExitCode": 0,  "Error": "",  "StartedAt": "2016-01-28T02:26:09.414485616Z",  "FinishedAt": "2016-01-28T02:25:43.868883111Z" }, "Image": "8693db7e8a0084b8aacba184cfc4ff9891924ed2270c6dec6a9d99bdcff0d1aa", "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/21d15713166ae83b022eea8806bd466da9917422e487e874cc098a0f1329dd48/resolv.conf", "HostnamePath": "/mnt/sda1/var/lib/docker/containers/21d15713166ae83b022eea8806bd466da9917422e487e874cc098a0f1329dd48/hostname", "HostsPath": "/mnt/sda1/var/lib/docker/containers/21d15713166ae83b022eea8806bd466da9917422e487e874cc098a0f1329dd48/hosts", "LogPath": "/mnt/sda1/var/lib/docker/containers/21d15713166ae83b022eea8806bd466da9917422e487e874cc098a0f1329dd48/21d15713166ae83b022eea8806bd466da9917422e487e874cc098a0f1329dd48-json.log", "Name": "/myubuntu", "RestartCount": 0, "Driver": "aufs", "ExecDriver": "native-0.2", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": {  "Binds": [   "/Users/yjmyzz/docker_volumn:/opt/webapp"  ],  "ContainerIDFile": "",  "LxcConf": [],  "Memory": 0,  "MemoryReservation": 0,  "MemorySwap": 0,  "KernelMemory": 0,  "CpuShares": 0,  "CpuPeriod": 0,  "CpusetCpus": "",  "CpusetMems": "",  "CpuQuota": 0,  "BlkioWeight": 0,  "OomKillDisable": false,  "MemorySwappiness": -1,  "Privileged": false,  "PortBindings": {},  "Links": null,  "PublishAllPorts": false,  "Dns": [],  "DnsOptions": [],  "DnsSearch": [],  "ExtraHosts": null,  "VolumesFrom": null,  "Devices": [],  "NetworkMode": "default",  "IpcMode": "",  "PidMode": "",  "UTSMode": "",  "CapAdd": null,  "CapDrop": null,  "GroupAdd": null,  "RestartPolicy": {   "Name": "no",   "MaximumRetryCount": 0  },  "SecurityOpt": null,  "ReadonlyRootfs": false,  "Ulimits": null,  "LogConfig": {   "Type": "json-file",   "Config": {}  },  "CgroupParent": "",  "ConsoleSize": [   0,   0  ],  "VolumeDriver": "" }, "GraphDriver": {  "Name": "aufs",  "Data": null }, "Mounts": [  {   "Source": "/Users/yjmyzz/docker_volumn",   "Destination": "/opt/webapp",   "Mode": "",   "RW": true  } ], "Config": {  "Hostname": "21d15713166a",  "Domainname": "",  "User": "",  "AttachStdin": true,  "AttachStdout": true,  "AttachStderr": true,  "Tty": true,  "OpenStdin": true,  "StdinOnce": true,  "Env": null,  "Cmd": [   "/bin/bash"  ],  "Image": "ubuntu",  "Volumes": null,  "WorkingDir": "",  "Entrypoint": null,  "OnBuild": null,  "Labels": {},  "StopSignal": "SIGTERM" }, "NetworkSettings": {  "Bridge": "",  "SandboxID": "893c76e283a75e3eebb474bf1b5bce901a37778de3514b526312134fcc858d2c",  "HairpinMode": false,  "LinkLocalIPv6Address": "",  "LinkLocalIPv6PrefixLen": 0,  "Ports": {},  "SandboxKey": "/var/run/docker/netns/893c76e283a7",  "SecondaryIPAddresses": null,  "SecondaryIPv6Addresses": null,  "EndpointID": "a7fee41964177719fbd149df820bf66dbd976ebe7cea0b68497ae2fe4c06efc5",  "Gateway": "172.17.0.1",  "GlobalIPv6Address": "",  "GlobalIPv6PrefixLen": 0,  "IPAddress": "172.17.0.2",  "IPPrefixLen": 16,  "IPv6Gateway": "",  "MacAddress": "02:42:ac:11:00:02",  "Networks": {   "bridge": {    "EndpointID": "a7fee41964177719fbd149df820bf66dbd976ebe7cea0b68497ae2fe4c06efc5",    "Gateway": "172.17.0.1",    "IPAddress": "172.17.0.2",    "IPPrefixLen": 16,    "IPv6Gateway": "",    "GlobalIPv6Address": "",    "GlobalIPv6PrefixLen": 0,    "MacAddress": "02:42:ac:11:00:02"   }  } }}]

90~97行的Mounts節點描述了當前容器掛載的"卷"信息。

最后指出一點:目前docker僅支持在run(創建)容器時使用-v創建卷,對于一個已經start的容器,如果想動態添加卷,是十分困難的。雖然國外有牛人,實現了在容器啟動后動態添加卷,但過程十分曲折,而且并不能能用,有興趣的可以參考下面的文章

http://jpetazzo.github.io/2015/01/13/docker-mount-dynamic-volumes/

3.2 列出所有卷

docker常用命令,docker,常用命令詳解

docker volume ls

3.3 刪除卷

docker volume rm 卷名稱

注:刪除一個容器時,默認不會刪除容器關聯的卷,所以隨著時間的推移,host上可能會存在大量的"僵尸"卷,占用硬盤空間。建議每次docker rm 容器時,加上參數-v,這樣刪除容器時會一并將對應的卷刪除,但是這樣也會有一個副作用,如果多個容器同時關聯到同一個卷,可能會影響到其它容器。所以在使用卷的時候要規劃清楚,最好一個容器只對應一個卷。

tips:如果要批量刪除所有卷,一個一個rm顯然太麻煩了,可以用下面的方式快速搞定

a) 進入docker虛擬機defaut

docker-machine ssh default

b) 查看volume所在的目錄

docker常用命令,docker,常用命令詳解

c)切換到sudo模式

sudo -i

d) 進入volume所在根目錄

cd /var/lib/docker/volumes/ 

docker常用命令,docker,常用命令詳解  

上圖的ls命令已經說明,所謂的數據卷,其實就是一個個目錄,再次印證了linux里的一句名言『一切皆是文件』,剩下的事情,地球人都知道了,邪惡的

rm -rf *

,最后還要重啟虛擬機,退回到mac主機

docker-machine restart default 

3.4 數據卷容器

如果多個容器之間希望共享一份數據,除了上面的方式外,docker還允許定義一個專用的容器,這個容器啥也不干,只用來放數據,這種容器稱為『數據卷容器』

示例:

docker run -it -v /Users/yjmyzz/docker_volumn:/sites --name site_files kitematic/hello-world-nginx echo 'only for nginx web files'

上面的命令跟之前創建卷的完全一樣,現在我們有了一個名為site_files的數據卷容器,注意:創建數據卷容器時,最后的命令通常都是些打醬油的echo之類,反正只是一個存數據的容器,不用執行其它命令,甚至它本身都不需要處于啟動狀態。

然后,其它容器創建時,就可以使用它了:

docker run -d --volumes-from site_files --name nginx1 kitematic/hello-world-nginx sh ./start.sh

注意上面的--volumes-from site_files 這個就是使用數據卷容器的關鍵,其它跟之前的完全相同,多個容器可以掛同一個數據卷容器,一個容器也可以掛多個數據卷容器。

四、網絡相關

4.1 端口映射

-p IP:host_port:container_port

上面的參數表示將本機IP上的hostport映射到容器的container_port,示例:  

docker run -it -v /Users/yjmyzz/Documents/Kitematic/hello-world-nginx/website_files:/website_files -p 0.0.0.0:10080:80 --name my-nginx kitematic/hello-world-nginx sh /start.sh

這個命令更長了,結合了之前所有學習到的參數,注意多出的問題-p 0.0.0.0:10080:80,表示將本機10080端口映射到容器80端口 

注:如果把-p換成大寫的-P,系統會隨機映射到本機一個空閑的端口號 

4.2 指定hostname

默認創建容器時,hostname是一個唯一的隨機字符串,很難記,可以在docker run -h hostname名稱來指定,這個就不演示了

4.3 容器間的網絡連接

假如有二個容器mysql, appserver,通常appserver中要訪問數據庫,所以需要appserver能直接訪問mysql,下面演示了如何實現:

a) 先創建mysql容器

docker run -it -h mysql --name mysql ubuntu /bin/bash

b) 再創建appserver容器  

docker run -it -h appserver --name appserver --link mysql:mysqlserver ubuntu /bin/bash

注意其中的--link mysql:mysqlserver,冒號前的為容器名稱,冒號后的為容器別名,啟動后appserver中就能直接ping通mysql容器了,見下圖:

docker常用命令,docker,常用命令詳解

注:這個連接是單向的,即appserver可以ping通mysql容器,但反過來不行。而且最新版的docker在ps時,Name列也不再象之前網上說的那個顯示成A/B這種格式,要查看一個容器是否有連接,最直接的方式還是docker inspect 容器名稱

docker常用命令,docker,常用命令詳解  

總結

以上所述是小編給大家介紹的docker常用命令操作方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美精品suv| 一本色道久久88亚洲综合88| 97超级碰碰碰久久久| 日日狠狠久久偷偷四色综合免费| 日韩国产高清视频在线| 欧美美女操人视频| 欧美专区国产专区| 中文字幕九色91在线| 亚洲曰本av电影| 中文字幕国内精品| 色多多国产成人永久免费网站| 色综合老司机第九色激情| 欧美裸体男粗大视频在线观看| www.欧美精品| 日韩精品免费看| 色婷婷亚洲mv天堂mv在影片| 久久99青青精品免费观看| 中文日韩电影网站| 日韩欧美在线观看视频| 中文字幕久精品免费视频| 538国产精品视频一区二区| 深夜福利国产精品| 国产日韩av高清| 国产成人综合一区二区三区| 8x海外华人永久免费日韩内陆视频| 精品国产区一区二区三区在线观看| 久久欧美在线电影| 欧美激情一区二区三区高清视频| 国产成人综合一区二区三区| 69**夜色精品国产69乱| 97在线日本国产| 91视频国产一区| 欧美极品美女电影一区| 欧美精品videosex牲欧美| 综合网日日天干夜夜久久| 亚洲国产精品系列| 日韩精品一二三四区| 亚洲成人av资源网| 精品国偷自产在线| 亚洲一二三在线| 91经典在线视频| 亚洲天堂网在线观看| 久久久久久成人精品| 亚洲国产黄色片| 亚洲精品乱码久久久久久金桔影视| 日韩美女视频在线观看| 国产精品久久久久久久美男| 欧美放荡办公室videos4k| 91在线免费网站| 欧美成年人视频| 超碰日本道色综合久久综合| yellow中文字幕久久| 伊人久久五月天| 亚洲影视九九影院在线观看| 欧美午夜电影在线| 91网站免费观看| 91亚洲va在线va天堂va国| 97在线看免费观看视频在线观看| 久久精品最新地址| 日av在线播放中文不卡| 成人免费自拍视频| 国产亚洲激情视频在线| 色av吧综合网| 精品亚洲男同gayvideo网站| 97精品国产97久久久久久春色| 亚洲毛片在线观看| 日本精品一区二区三区在线| 97色伦亚洲国产| 亚洲一区二区国产| 国内精品小视频| 久久99久久99精品免观看粉嫩| 欧美丝袜第一区| 亚洲天堂免费在线| 久久久久久久电影一区| 久久久午夜视频| 视频直播国产精品| 国产亚洲免费的视频看| 欧美一级视频免费在线观看| 热久久免费国产视频| 午夜精品久久久久久久男人的天堂| 国产69精品99久久久久久宅男| 精品少妇v888av| 国内伊人久久久久久网站视频| 日韩在线免费观看视频| 97成人精品区在线播放| 2019中文字幕免费视频| 国产欧美日韩精品丝袜高跟鞋| 日韩精品福利在线| 91av福利视频| 国产欧美日韩精品在线观看| 日韩久久免费电影| 国产一级揄自揄精品视频| 亚洲第一天堂无码专区| 国产精品亚洲欧美导航| 最近2019中文免费高清视频观看www99| 亚洲国产精品久久| 亚洲xxx视频| 欧美日韩国产色| 黄色成人在线播放| 久久久亚洲福利精品午夜| 欧美精品日韩三级| 精品久久久久久国产91| 日本久久久久亚洲中字幕| 亚洲第一av网站| 日韩av影院在线观看| 成人黄色片网站| 久久成人人人人精品欧| 日韩精品视频在线免费观看| 欧美人交a欧美精品| 91福利视频在线观看| 亚洲人午夜精品| 在线观看成人黄色| 海角国产乱辈乱精品视频| 欧美丝袜一区二区| 久久人人爽人人爽人人片亚洲| 欧美午夜宅男影院在线观看| 久久亚洲精品一区二区| 久久欧美在线电影| 8x海外华人永久免费日韩内陆视频| 国产美女扒开尿口久久久| 欧美视频一二三| 久久久久久国产精品久久| 欧美在线视频观看免费网站| 亚洲第一级黄色片| 美乳少妇欧美精品| 日韩av免费在线观看| 精品一区精品二区| 国产精品伦子伦免费视频| 欧美福利视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 中日韩午夜理伦电影免费| 亚洲精品suv精品一区二区| 亚洲91精品在线| 国产一区二区三区久久精品| 成人免费自拍视频| 亚洲精品免费一区二区三区| 亚洲欧美在线免费观看| 日韩国产精品视频| 亚洲变态欧美另类捆绑| 国产精品成av人在线视午夜片| 日韩精品在线观看一区| 亚洲第一网站男人都懂| 欧美成人精品一区二区三区| 亚洲天堂av在线播放| 久久精品视频在线播放| 亚洲区bt下载| 国产精品一区二区久久久| 欧美黄色片在线观看| 亚洲最新视频在线| 亚洲免费成人av电影| 91久久国产精品| 456国产精品| 91精品中文在线| 国产成人精品国内自产拍免费看| 日韩不卡中文字幕| 91色在线视频| 国内揄拍国内精品少妇国语| 欧美精品电影在线| 日韩成人性视频| 日韩禁在线播放| 成人性生交大片免费看视频直播| 国产一区二区三区三区在线观看| 2020欧美日韩在线视频| 国产精品香蕉在线观看|