docker 官網(wǎng)
docker cli reference
windows10 安裝
不要同時(shí)安裝virtual box和window docker , 只需安裝windows docker即可, 否則需要?jiǎng)h除環(huán)境變量里面的docker變量配置國內(nèi)鏡像
推薦使用阿里云鏡像加速器, 方法: 注冊阿里云賬號,=>容器鏡像服務(wù)=>鏡像加速器=>操作文檔=>windows, 將加速器地址復(fù)制后打開docker 的setting=>daemon=>registry mirrors 粘貼復(fù)制的加速器地址 apply即可.-
docker 整體流程
Shared drives 容器可訪問的共享文件夾
需要本地計(jì)算機(jī)的用戶名密碼
如果沒開啟的話,掛載本地volume 會(huì)報(bào)錯(cuò):
docker: Error response from daemon: Drive has not been shared
Docker命令與 Git 和 GitHub比較類似。總的來說分為以下幾種:
容器生命周期管理 — 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]
鏡像倉庫 — docker [login|pull|push|search]
本地鏡像管理 — docker [images|rmi|tag|build|history|save|import]
其他命令 — docker [info|version]
- 展示docker信息
docker version
docker info
docker -D info #The global -D option tells all docker comands to output debug information.
- 執(zhí)行構(gòu)建命令
docker build -t webname .
dockerfile
` [from maintainer run cmd label expose env add copy entrypoint volume user workdir arg onbuild stopsignal healthcheck shell]-
.dockerignore
# comment */temp* */*/temp* temp? ~*
查看鏡像文件
docker images [options] [name]
-a, --all=false Show all images (by default filter out the intermediate image layers)
-f, --filter=[] Provide filter values (i.e. 'dangling=true')
--no-trunc=false Don't truncate output
-q, --quiet=false Only show numeric IDs
- 刪除鏡像
docker rmi image [imageid ...]
docker rmi $(docker images | grep "none" | awk '{print $3}')
- 運(yùn)行容器
docker run [options] [image] [command][agr...]
docker run -d -p 5000:80
-a,--attach=[]Attach to STDIN, STDOUT or STDERR.-c,--cpu-shares=0 CPU shares (relative weight)--cidfile=""Write the container ID to the file
--cpuset=""CPUsin which to allow execution (0-3,0,1)-d,--detach=falseDetached mode: run container in the background andprintnew container ID
--dns=[]Set custom DNS servers
--dns-search=[]Set custom DNS search domains
-e,--env=[]Set environment variables
--entrypoint=""Overwrite the default ENTRYPOINT of the image
--env-file=[]Readin a line delimited file of environment variables
--expose=[]Expose a port from the container without publishing it to your host
-h,--hostname=""Container host name
-i,--interactive=falseKeep STDIN open even ifnot attached
--link=[]Add link to another container in the form of name:alias--lxc-conf=[](lxc exec-driver only)Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"-m,--memory=""Memory limit (format:<number><optional unit>,where unit = b, k, m or g)--name=""Assign a name to the container
--net="bridge"Set the Network mode for the container
'bridge': creates a new network stack for the container on the docker bridge
'none':no networking forthis container
'container:<name|id>': reuses another container network stack
'host':use the host network stack inside the container.Note: the host mode gives the container full access to local system services such as D-bus andis therefore considered insecure.-P,--publish-all=falsePublish all exposed ports to the host interfaces
-p,--publish=[]Publish a container's port to the host
format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
(use 'docker port' to see the actual mapping)
--privileged=false Give extended privileges to this container
--rm=false Automatically remove the container when it exits (incompatible with -d)
--sig-proxy=true Proxy received signals to the process (even in non-TTY mode). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.
-t, --tty=false Allocate a pseudo-TTY
-u, --user="" Username or UID
-v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)
--volumes-from=[] Mount volumes from the specified container(s)
-w, --workdir="" Working directory inside the container
- 查看所有容器
docker ps -a
- 查看運(yùn)行中容器
docker ps
- 查看所有容器ID
docker ps -a -q
- 啟動(dòng)容器(已停止的容器)
docker start [containerid ...]
-a,--attach=false Attach container's STDOUT and STDERR and forward all signals to the process
-i, --interactive=false Attach container's STDIN
- 重啟一個(gè)容器或多個(gè)容器
docker restart [options] [container ...]
-t,--time=10Number of seconds to try to stop for before killing the container.Once killed it will then be restarted.Defaultis10 seconds.
- 停止容器
docker stop [containerid ...]
- 停止所有容器
docker stop $(docker ps -a -q)
- 暫停容器
docker pause [container]
- 取消暫停容器
docker unpause [container]
- 刪除容器
docker rm [options] [containerid ...]
-f,--force=falseForce removal of running container
-l,--link=falseRemove the specified link andnot the underlying container
-v,--volumes=falseRemove the volumes associated with the container
- 刪除所有容器
docker rm $(docker ps -a -q)
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
- 查看所有volume
docker volume ls
- 刪除指定volume (刪除容器時(shí)volume會(huì)保留,不需要時(shí)要?jiǎng)h除)
docker volume rm [volume name]
- 刪除所有未使用的volume
docker volume prune
- 查看volume詳細(xì)
docker volume inspect [volume name]
- 安裝jenkins (-v 后
jenkins
是volume名稱,也可不命名)
docker run -p 8080:8080 -v jenkins:/var/jenkins_home jenkins
- 提交一個(gè)新的image
docker commit [options] [repository[:tag]]
- options:
-a, --author="" Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-m, --message="" Commit message
-p, --pause=true Pause container during commit
- 提交一個(gè)存在的容器
$ docker ps
ID IMAGE COMMAND CREATED STATUS PORTS
c3f279d17e0a ubuntu:12.04/bin/bash 7 days ago Up25 hours
197387f1b436 ubuntu:12.04/bin/bash 7 days ago Up25
$ docker commit c3f279d17e0a SvenDowideit/testimage:version3
f5283438590d
$ docker images | head
REPOSITORY TAG ID CREATED VIRTUAL SIZE
SvenDowideit/testimage version3 f5283438590d 16 s
- 將容器中的文件拷貝到主機(jī)上
docker cp [container:path] [hostpath]
- 進(jìn)入容器并進(jìn)行交互
docker exec -it [container] /bin/bash
- 比較一個(gè)容器不同版本提交的文件差異
docker diff [container]
顯示中的A D C 含義
A-Add
D-Delete
C-Change
- 獲取server中的實(shí)時(shí)事件
docker events [options]
--since=""Show all events created since timestamp
--until=""Stream events untilthis timestamp
- 導(dǎo)入已有的image
docker import url|-[repository[:tag]]
# 支持壓縮包 (.tar, .tar.gz, .tgz, .bzip, .tar.xz, or .txz)
例如:
導(dǎo)入遠(yuǎn)程的包:
docker import http://example.com/exampleimage.tgz
導(dǎo)入本地文件:
$ cat exampleimage.tgz | sudo docker import- exampleimagelocal:new
$ sudo tar -c .| sudo docker import- exampleimagedir
導(dǎo)入本地目錄:
- 導(dǎo)出一個(gè)容器
docker export [container] > latest.tar
- 顯示一個(gè)image的歷史
docker history [options] image
--no-trunc=false Don't truncate output
-q, --quiet=false Only show numeric IDs
- 殺死docker進(jìn)程
docker kill [options] [container ...]
-s,--signal="KILL"Signal to send to the container
- 加載image
docker load
i,--input=""Readfrom a tar archive file, instead of STDIN
例如:加載一個(gè)打包好的鏡像
docker images
docker load < busybox.tar
docker load --input fedora.tar
- 登陸docker注冊服務(wù)器
docker login [options][server]
可以使用自己的注冊服務(wù)器
docker login localhost:8080
- 獲取容器的日志
docker logs [container]
-f,--follow=falseFollow log output
-t,--timestamps=falseShow timestamps
--tail="all"Output the specified number of lines at the end of logs (defaults to all logs)
- 端口轉(zhuǎn)發(fā)
docker port [container] [private_port]
- 從遠(yuǎn)端拉取一個(gè)image
docker pull [name[:tag]]
例如:
$ docker pull debian
# will pull all the images in the debian repository
$ docker pull debian:testing
# will pull only the image named debian:testing and any intermediate layers# it is based on. (Typically the empty `scratch` image, a MAINTAINERs layer,# and the un-tarred base).
$ docker pull registry.hub.docker.com/debian
# manually specifies the path to the default Docker registry. This could# be replaced with the path to a local regis
- 推送image到這側(cè)服務(wù)器
docker push [name[:tag]]
- 打包image
docker save [image]
-o,--output=""Write to an file, instead of STDOUT
例如:
$ sudo docker save busybox > busybox.tar
$ ls -sh busybox.tar
2.7M busybox.tar
$ sudo docker save --output busybox.tar busybox
$ ls -sh busybox.tar
2.7M busybox.tar
$ sudo docker save -o fedora-all.tar fedora
$ sudo docker save -o fedora-latest.tar fedora:latest
- 搜索image
docker search [name]
- 為image打標(biāo)簽
docker tag [options] [image[:tag][registryhost/][username/]name[:tag]
-f,--force=false Force
- docker inspect
檢查鏡像或者容器的參數(shù)屈扎,默認(rèn)返回 JSON 格式禀挫。
-f 指定返回值的模板文件特定值。
docker instpect nginx:latest
docker inspect nginx-container
docker inspect -f {{.Mounts}} nginx-container
- docker attach
docker attach <CONTAINER_ID>
Docker允許使用attach命令與運(yùn)行中的容器交互,并且可以隨時(shí)觀察容器內(nèi)進(jìn)程的運(yùn)行狀況。退出容器可以通過兩種方式來完成:
Ctrl+C 直接退出
Ctrl-\ 退出并顯示堆棧信息(stack trace)
- docker stats
查看和統(tǒng)計(jì)容器所占用的資源情況
root@VM-16-14-ubuntu ~# docker stats --no-stream b06d6fc
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
27811baf9933 lvliang_api 0.14% 94.49MiB / 15.51GiB 0.60% 78.7MB / 73.3MB 0B / 0B 28
b06d6fc
為容器id, 這里傳遞了一個(gè) --no-stream 的參數(shù),是因?yàn)?docker stats 命令默認(rèn)是一個(gè)持續(xù)的動(dòng)態(tài)流式輸出(每秒一次)帜消,給它傳遞 --no-stream 參數(shù)后,它就只輸出一次便會(huì)退出了
接下來我為你介紹下它輸出內(nèi)容的含義:
Container ID:容器的 ID浓体,也是一個(gè)容器生命周期內(nèi)不會(huì)變更的信息泡挺。
Name:容器的名稱,如果沒有手動(dòng)使用 --name 參數(shù)指定命浴,則 Docker 會(huì)隨機(jī)生成一個(gè)娄猫,運(yùn)行過程中也可以通過命令修改。
CPU %:容器正在使用的 CPU 資源的百分比生闲,這里面涉及了比較多細(xì)節(jié)稚新,下面會(huì)詳細(xì)說。
Mem Usage/Limit:當(dāng)前內(nèi)存的使用及容器可用的最大內(nèi)存跪腹,這里我使用了一臺 16G 的電腦進(jìn)行測試褂删。
Mem %:容器正在使用的內(nèi)存資源的百分比。
Net I/O:容器通過其網(wǎng)絡(luò)接口發(fā)送和接受到的數(shù)據(jù)量冲茸。
Block I/O:容器通過塊設(shè)備讀取和寫入的數(shù)據(jù)量屯阀。
Pids:容器創(chuàng)建的進(jìn)程或線程數(shù)。
- docker top
查看容器中的進(jìn)程
root@VM-16-14-ubuntu ~# docker top --help
Usage: docker top CONTAINER [ps OPTIONS]
Display the running processes of a container
root@VM-16-14-ubuntu ~# docker top (docker ps -ql)
UID PID PPID C STIME TTY TIME CMD
root 8085 8059 0 Feb03 ? 00:18:44 dotnet ll.Api.dll
- Dockerfile關(guān)鍵字
- FROM
基于哪個(gè)鏡像 - RUN
安裝軟件用 - MAINTAINER
鏡像創(chuàng)建者 - CMD
container啟動(dòng)時(shí)執(zhí)行的命令轴术,但是一個(gè)Dockerfile中只能有一條CMD命令难衰,多條則只執(zhí)行最后一條CMD。
CMD主要用于container時(shí)啟動(dòng)指定的服務(wù)逗栽,當(dāng)docker run command的命令匹配到CMD command時(shí)盖袭,會(huì)替換CMD執(zhí)行的命令(同時(shí)執(zhí)行)。 - ENTRYPOINT
container啟動(dòng)時(shí)執(zhí)行的命令,但是一個(gè)Dockerfile中只能有一條ENTRYPOINT命令鳄虱,如果多條弟塞,則只執(zhí)行最后一條ENTRYPOINT沒有CMD的可替換特性 - USER
使用哪個(gè)用戶跑container - EXPOSE
container內(nèi)部服務(wù)開啟的端口。主機(jī)上要用還得在啟動(dòng)container時(shí)拙已,做host-container的端口映射:docker run -d -p 127.0.0.1:33301:22 centos6-ssh - ENV
用來設(shè)置環(huán)境變量决记,比如:
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8 - ADD
將文件拷貝到container的文件系統(tǒng)對應(yīng)的路徑
所有拷貝到container中的文件和文件夾權(quán)限為0755,uid和gid為0
如果文件是可識別的壓縮格式,則docker會(huì)幫忙解壓縮倍踪,如果要ADD本地文件系宫,則本地文件必須在 docker build ,指定的目錄下建车,如果要ADD遠(yuǎn)程文件扩借,則遠(yuǎn)程文件必須在 docker build ,指定的目錄下缤至。比如:
docker build github.com/creack/docker-firefox
docker-firefox目錄下必須有Dockerfile和要ADD的文件
注意:使用docker build - < somefile方式進(jìn)行build潮罪,是不能直接將本地文件ADD到container中。只能ADD url file凄杯。ADD只有在build鏡像的時(shí)候運(yùn)行一次,后面運(yùn)行container的時(shí)候不會(huì)再重新加載了秉宿。 - VOLUME
可以將本地文件夾或者其他container的文件夾掛載到container中戒突。 - WORKDIR
切換目錄用,可以多次切換(相當(dāng)于cd命令)描睦,對RUN,CMD,ENTRYPOINT生效 - ONBUILD
ONBUILD 指定的命令在構(gòu)建鏡像時(shí)并不執(zhí)行膊存,而是在它的子鏡像中執(zhí)行
- docker network ls
查看網(wǎng)絡(luò)信息,默認(rèn)為:bridge none host
- 自定義網(wǎng)絡(luò)
docker 允許我們創(chuàng)建3種類型的自定義網(wǎng)絡(luò),bridge忱叭,overlay隔崎,MACVLAN
#1 bridge 模式
docker network create --driver bridge redis-net
#2 overlay模式 attachable
docker network create --driver=overlay --attachable name=myOverlayNet
- docker network inspect
display detailed information on one or more networks
docker network inspect [options] network [network...]
options:
--format ,-f
格式化輸出
-verbose ,-v
診斷詳情
- docker運(yùn)行dotnet示例
//此處用powershell
docker run -it -p 8080:5000 -v ${PWD}:/app --workdir "/app" --name "dotnet_docker" microsoft/dotnet /bin/bash
-it 參數(shù)表示進(jìn)入交互模式
-p 8080:5001 表示把容器里的5001端口映射給宿主的8080端口。
-v 表示創(chuàng)建volume
${PWD}是指宿主當(dāng)前的目錄韵丑。此處也可以用絕對路徑,如/c/work/web/
{PWD}:/app就是把容器里的/app文件夾連接到了宿主系統(tǒng)里的當(dāng)前文件夾爵卒,而容器里的/app目錄就是應(yīng)用程序?qū)⒁\(yùn)行的位置
--workdir "/app"表示容器里當(dāng)前的工作目錄是/app。
--name "dotnet_docker"表示容器名稱是"dotnet_docker"
然后使用microsoft/dotnet這個(gè)鏡像撵彻。
最后使用/bin/bash返回一個(gè)終端钓株,以便讓我與容器里進(jìn)行交互
win10 中安裝的docker的路徑
本質(zhì)上docker安裝到了hype-v虛擬機(jī)中的,該虛擬機(jī)路徑為
C:\Users\Public\Documents\Hyper-V\Virtual hard disks
docker創(chuàng)建網(wǎng)絡(luò)net組,橋接網(wǎng)絡(luò)
在一個(gè)Docker Host里,有許多容器陌僵,他們之間需要相互通信轴合。我們可以使用容器名進(jìn)行通信,尤其是開發(fā)的時(shí)候碗短。
但是當(dāng)容器比較多的時(shí)候受葛,你可能就傾向于對一些容器進(jìn)行隔離,或者叫做分組。
而我們通過Docker客戶端就可以創(chuàng)建這種隔離的網(wǎng)絡(luò)总滩。每一個(gè)隔離網(wǎng)絡(luò)里的容器可以相互通信纲堵,這時(shí)也可以使用容器名進(jìn)行通信。
有了這種隔離的網(wǎng)絡(luò)咳秉,對容器間的通信管理就方便多了
1.創(chuàng)建自定義橋接網(wǎng)絡(luò)
docker network create --driver bridge 網(wǎng)絡(luò)名
2.使容器加入到這個(gè)網(wǎng)絡(luò)
docker run -d --net=網(wǎng)絡(luò)名 --name 網(wǎng)絡(luò)內(nèi)的容器名 鏡像名:tag
3.查看網(wǎng)絡(luò)
docker network ls
PS C:\Users\wweim> docker network ls
NETWORK ID NAME DRIVER SCOPE
cac37f4bf289 bridge bridge local
73740e25ac6e host host local
e5ec0ad83aef my-net bridge local
5d3fbea9181c none null local
其中name為my-net即為自定義創(chuàng)建的bridge橋接網(wǎng)絡(luò)
使用docker insepct my-net
查看網(wǎng)絡(luò)信息
PS C:\Users\wweim> docker inspect my-net
[
{
"Name": "my-net",
"Id": "e5ec0ad83aef0f8be7ef4e1147f28223280ec73a27b5b0b6b31401f9c56185b0",
"Created": "2020-02-03T13:47:36.5422024Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"62e6d09cfd1afb4552dbb75f2b42ee4ccf80529c1e4a369079bca485577fbd8e": {
"Name": "lvliang_api",
"EndpointID": "ba95b83c5f090a67b701a8e6216b9dda553bcbab167f7fd27eab4cfd1313535b",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
可以看到containers中已經(jīng)有一個(gè)容器了,再啟動(dòng)容器時(shí)使用 --net=網(wǎng)絡(luò)名
參數(shù),就會(huì)創(chuàng)建自定義網(wǎng)格內(nèi)的其他容器,同一個(gè)橋接網(wǎng)絡(luò)的容器可以相互通信
并且其他容器就可以使用host=lvliaing_api
作為服務(wù)器名連接了(比較常見的就是數(shù)據(jù)庫的連接字符串)
- 清除內(nèi)容 prune
prune 命令用來刪除不再使用的 docker 對象婉支。
刪除所有未被 tag 標(biāo)記和未被容器使用的鏡像:
docker image prune
刪除所有未被容器使用的鏡像:
docker image prune -a
刪除所有停止運(yùn)行的容器:
docker container prune
刪除所有未被掛載的卷:
docker volume prune
刪除所有網(wǎng)絡(luò):
docker network prune
刪除 docker 所有資源:
docker system prune