[TOC]
image鏡像操作
列出已經(jīng)下載下來的鏡像: docker image ls
查看鏡像、容器、數(shù)據(jù)卷所占用的空間: docker system df
查看虛懸鏡像: docker image ls -f dangling=true
虛懸鏡像已經(jīng)失去了存在的價(jià)值,是可以隨意刪除的
刪除虛懸鏡像: docker image prune
查看中間層鏡像: docker image ls -a
部分鏡像的查找:
- 根據(jù)鏡像名查詢:
docker image ls 鏡像名 - 過濾器filter查詢:
docker image ls -f since=mongo:3.2
根據(jù)特定的方式顯示查找結(jié)果:
-
-q: 只顯示 ID; ep:docker image ls -q--filter配合-q產(chǎn)生出指定范圍的 ID 列表,然后送給另一個docker命令作為參數(shù),從而針對這組實(shí)體成批的進(jìn)行某種操作的做法在 Docker 命令行使用過程中非常常見,不僅僅是鏡像,將來我們會在各個命令中看到這類搭配以完成很強(qiáng)大的功能。 -
自定義展示結(jié)果
--format: Go 的模板語法# 只包含鏡像ID和倉庫名: $ docker image ls --format "{{.ID}}: {{.Repository}}" 5f515359c7f8: redis 05a60462f8ba: nginx fe9198c04d62: mongo 00285df0df87: <none> f753707788c5: ubuntu f753707788c5: ubuntu 1e0c3dd64ccd: ubuntu # 以表格等距顯示,并且有標(biāo)題行,和默認(rèn)一樣 $ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" IMAGE ID REPOSITORY TAG 5f515359c7f8 redis latest 05a60462f8ba nginx latest fe9198c04d62 mongo 3.2 00285df0df87 <none> <none> f753707788c5 ubuntu 18.04 f753707788c5 ubuntu latest
刪除本地鏡像: docker image rm
-
根據(jù)ID、鏡像名、摘要刪除鏡像:
# 根據(jù)ID $ docker image rm 501 # 根據(jù)鏡像名 $ docker image rm centos # 根據(jù)鏡像摘要; 先查到摘要再進(jìn)行刪除 $ docker image ls --digests REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE node slim sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228 6e0c4c8e3913 3 weeks ago 214 MB $ docker image rm node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228 -
用 docker image ls 命令來配合:
# 刪除所有倉庫名為 redis 的鏡像 $ docker image rm $(docker image ls -q redis) # 刪除所有在 mongo:3.2 之前的鏡像: $ docker image rm $(docker image ls -q -f before=mongo:3.2)
使用 DockerFile 定制鏡像
詳情:https://yeasy.gitbooks.io/docker_practice/content/image/build.html
Dockerfile 多階段構(gòu)建:
...
其他制作鏡像的方式:
...
container 容器操作
新建并啟動容器: 命令主要為 docker run
# 依靠ubuntu鏡像生成容器后 命令輸出一個 “Hello World”,之后終止容器。
$ docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world
# 啟動一個 bash 終端,允許用戶進(jìn)行交互
# -t 選項(xiàng)讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上
# -i 讓容器的標(biāo)準(zhǔn)輸入保持打開
$ docker run -t -i ubuntu:18.04 /bin/bash
root@af8bae53bdd3:/#
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
利用 docker run 來創(chuàng)建容器時,Docker 在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創(chuàng)建并啟動一個容器
- 分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去
- 從地址池配置一個 ip 地址給容器
- 執(zhí)行用戶指定的應(yīng)用程序
- 執(zhí)行完畢后容器被終止
啟動已終止的容器: docker container start
后臺運(yùn)行: -d
# 容器會在后臺運(yùn)行并不會把輸出的結(jié)果 (STDOUT) 打印到宿主機(jī)上面
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
# 查看后臺運(yùn)行的程序的結(jié)果 docker logs [container ID or NAMES]
docker container logs a211 # a211 為短ID
終止容器: docker container stop [container ID]
查看終止?fàn)顟B(tài)的容器: docker container ls -a (Exited (0))
重新啟動終止?fàn)顟B(tài)的容器: docker container start [container ID]
將一個運(yùn)行態(tài)的容器終止,然后再重新啟動: docker container restart
進(jìn)入在后臺運(yùn)行的容器中:
-
docker attach命令: ( 不推薦使用 )$ docker run -dit ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia $ docker attach 243c root@243c32535da7:/# ####### 注意 ####### # 如果從這個 stdin 中 exit,會導(dǎo)致容器的停止 -
docker exec命令: ( 推薦使用 )# 執(zhí)行 -d 后臺 i 持續(xù) t 終端輸出 的容器 $ docker run -dit ubuntu 69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69d137adef7a ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds zealous_swirles # -i 界面沒有 Linux 命令提示符,但命令執(zhí)行結(jié)果仍然可以返回。 $ docker exec -i 69d1 bash ls bin boot dev ... # 當(dāng) -i -t 參數(shù)一起使用時,則可以看到 Linux 命令提示符 $ docker exec -it 69d1 bash root@69d137adef7a:/# root@69d137adef7a:/# exit # 從這個 stdin 中 exit,不會導(dǎo)致容器的停止
導(dǎo)出本地容器快照到本地: docker export
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:18.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar
從容器快照文件中再導(dǎo)入為鏡像: docker import
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
# 通過指定 URL 或者某個目錄來導(dǎo)入
$ docker import http://example.com/exampleimage.tgz example/imagerepo
刪除容器: docker container rm
# 刪除已終止的容器
$ docker container rm trusting_newton
trusting_newton
# 刪除正在運(yùn)行的容器,需要添加參數(shù) -f
$ docker container rm -f trusting_newton
trusting_newton
# 清理所有處于終止?fàn)顟B(tài)的容器
$ docker container prune
訪問倉庫 Repository
登陸: docker login
退出登錄: docker logout
拉取鏡像:
docker search查找官方的鏡像-
docker pull下載到本地$ docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 465 [OK] tianon/centos CentOS 5 and 6, created using rinse instea... 28 blalor/centos Bare-bones base CentOS 6.5 image 6 [OK] saltstack/centos-6-minimal 6 [OK] tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. ... 5 [OK] # DESCRIPTION 描述; STARS 收藏?cái)?shù); OFFICIAL 是否官方創(chuàng)建; AUTOMATED 是否自動創(chuàng)建 $ docker pull centos
推送鏡像:
# 使用鏡像源創(chuàng)建一個指定鏡像的標(biāo)簽
$ docker tag ubuntu:18.04 username/ubuntu:18.04
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 275d79972a86 6 days ago 94.6MB
username/ubuntu 18.04 275d79972a86 6 days ago 94.6MB
# 推送到 hub 上
$ docker push username/ubuntu:18.04
# 查詢剛剛推上去的鏡像
$ docker search username
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu
自動創(chuàng)建:
- 創(chuàng)建并登錄 Docker Hub,以及目標(biāo)網(wǎng)站;
- 在目標(biāo)網(wǎng)站中連接帳戶到 Docker Hub;
- 在 Docker Hub 中 配置一個自動創(chuàng)建;
- 選取一個目標(biāo)網(wǎng)站中的項(xiàng)目(需要含
Dockerfile)和分支; - 指定
Dockerfile的位置,并提交創(chuàng)建。
私有倉庫的構(gòu)建
...
數(shù)據(jù)管理
...
使用網(wǎng)絡(luò)
外部訪問容器: 通過 -P 或 -p 參數(shù)來指定端口映射。
# -P Docker 會隨機(jī)映射一個 `49000~49900` 的端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口
$ docker run -d -P training/webapp python app.py
# 查看映射關(guān)系
$ docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
# 本地主機(jī)的 49155 被映射到了容器的 5000 端口
# 查看應(yīng)用的信息
$ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
-p 則可以指定要映射的端口,并且,在一個指定端口上只可以綁定一個容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
-
**映射所有接口地址: **
hostPort:containerPort# 將本地的 5000 端口映射到容器的 5000 端口 $ docker run -d -p 5000:5000 training/webapp python app.py -
映射到指定地址的指定端口:
ip:hostPort:containerPort# 指定映射使用一個特定地址,比如 localhost 地址 127.0.0.1 $ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py -
映射到指定地址的任意端口:
ip::containerPort# 綁定 localhost 的任意端口到容器的 5000 端口,本地主機(jī)會自動分配一個端口。 $ docker run -d -p 127.0.0.1::5000 training/webapp python app.py # 使用 udp 標(biāo)記來指定 udp 端口 $ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口的配置: docker port
$ docker port nostalgic_morse 5000
127.0.0.1:49155.
# 注意: 容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個可變的網(wǎng)絡(luò)配置。)
# -p 可以多次使用來綁定多個端口
$ docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py
容器互聯(lián):
新建網(wǎng)絡(luò):
$ docker network create -d bridge my-net
# -d 參數(shù)指定 Docker 網(wǎng)絡(luò)類型,有 bridge overlay; overlay 網(wǎng)絡(luò)類型用于 Swarm mode
**連接容器: **
# 運(yùn)行一個容器并連接到新建的 `my-net` 網(wǎng)絡(luò)
$ docker run -it --rm --name busybox1 --network my-net busybox sh
# 打開新的終端,再運(yùn)行一個容器并加入到 my-net 網(wǎng)絡(luò)
$ docker run -it --rm --name busybox2 --network my-net busybox sh
# 再打開一個新的終端查看容器信息
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2
8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1
# 通過 ping 來證明 busybox1 容器和 busybox2 容器建立了互聯(lián)關(guān)系。
# 在 busybox1 容器輸入以下命令
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
# 用 ping 來測試連接 busybox2 容器,它會解析成 172.19.0.3。
# 在 busybox2 容器執(zhí)行 ping busybox1,也會成功連接到
/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms
配置DNS: 配置全部容器的 DNS ,可以在 /etc/docker/daemon.json 文件中增加以下內(nèi)容來設(shè)置
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
參考https://legacy.gitbook.com/book/yeasy/docker_practice/details
Docker —— 從入門到實(shí)踐 學(xué)習(xí)筆記