docker初探
本文旨在介紹 docker 基本的安裝、常用命令和常見概念的辨析,方便新手入門和筆者日后查閱,大部分內容整理自互聯網,原出處在文中注明。
文章目錄
- docker初探
- docker安裝(mac)
- 版本、信息相關命令
- version/info
- 鏡像倉庫相關命令
- login/logout
- pull/push
- search
- 本地鏡像管理相關命令
- images
- rmi
- tag
- build
- history
- save
- load
- import
- 容器生命周期管理相關命令
- run
- start/stop/restart
- kill
- rm
- pause/unpause
- create
- exec
- 容器操作相關命令
- ps
- inspect
- top
- attach
- events
- logs
- wait
- export
- port
- 容器rootfs相關命令
- commit
- cp
- diff
- 圖示總結
- 關于docker容器和鏡像的區別
docker安裝(mac)
直接使用 homebrew 安裝:
brew install --cask docker
然后運行 docker 應用,它會要求提供權限,確定,然后下一步。最終 docker 的小鯨魚圖標會出現在上方欄中。可以使用用戶界面,也可以用命令,如:
docker ps
注意一定要使用 --cask
選項,而不能只是 brew install docker
,因為 docker 是系統級的包。
版本、信息相關命令
以下 docker 命令相關內容來自:https://www.runoob.com/docker/
version/info
docker version :顯示 Docker 版本信息。
docker info : 顯示 Docker 系統信息,包括鏡像和容器數。
語法
docker version
docker info
鏡像倉庫相關命令
login/logout
docker login: 登陸到一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub
docker logout: 登出一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub
語法
docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]
OPTIONS說明:
- -u:登陸的用戶名
- -p:登陸的密碼
實例
登陸到Docker Hub
docker login -u 用戶名 -p 密碼
登出Docker Hub
docker logout
pull/push
docker pull: 從鏡像倉庫中拉取或者更新指定鏡像
docker push: 將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫
語法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker push [OPTIONS] NAME[:TAG]
OPTIONS說明:
- -a:拉取所有 tagged 鏡像
- –disable-content-trust:忽略鏡像的校驗,默認開啟
實例
從Docker Hub下載java最新版鏡像。
docker pull java
從Docker Hub下載REPOSITORY為java的所有鏡像。
docker pull -a java
上傳本地鏡像myapache:v1到鏡像倉庫中。
docker push myapache:v1
search
docker search: 從Docker Hub查找鏡像
語法
docker search [OPTIONS] TERM
OPTIONS說明:
- –automated:只列出 automated build類型的鏡像;
- –no-trunc:顯示完整的鏡像描述;
- -f <過濾條件>:列出收藏數不小于指定值的鏡像。
實例
從 Docker Hub 查找所有鏡像名包含 java,并且收藏數大于 10 的鏡像
runoob@runoob:~$ docker search -f stars=10 java
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
java Java is a concurrent, class-based... 1037 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC ... 115 [OK]
develar/java 46 [OK]
isuper/java-oracle This repository contains all java... 38 [OK]
lwieske/java-8 Oracle Java 8 Container - Full + ... 27 [OK]
nimmis/java-centos This is docker images of CentOS 7... 13 [OK]
參數說明:
NAME: 鏡像倉庫源的名稱
DESCRIPTION: 鏡像的描述
OFFICIAL: 是否 docker 官方發布
stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。
AUTOMATED: 自動構建。
本地鏡像管理相關命令
images
docker images: 列出本地鏡像。
語法
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS說明:
- -a:列出本地所有的鏡像(含中間映像層,默認情況下,過濾掉中間映像層);
- –digests:顯示鏡像的摘要信息;
- -f:顯示滿足條件的鏡像;
- –format:指定返回值的模板文件;
- –no-trunc:顯示完整的鏡像信息;
- -q:只顯示鏡像ID。
實例
查看本地鏡像列表。
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mymysql v1 37af1236adef 5 minutes ago 329 MB
runoob/ubuntu v4 1c06aa18edee 2 days ago 142.1 MB
<none> <none> 5c6e1090e771 2 days ago 165.9 MB
httpd latest ed38aaffef30 11 days ago 195.1 MB
alpine latest 4e38e38c8ce0 2 weeks ago 4.799 MB
mongo 3.2 282fd552add6 3 weeks ago 336.1 MB
redis latest 4465e4bcad80 3 weeks ago 185.7 MB
php 5.6-fpm 025041cd3aa5 3 weeks ago 456.3 MB
python 3.5 045767ddf24a 3 weeks ago 684.1 MB
...
列出本地鏡像中REPOSITORY為ubuntu的鏡像列表。
root@runoob:~# docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 9 weeks ago 188 MB
ubuntu 15.10 4e3b13c8a266 3 months ago 136.3 MB
rmi
docker rmi: 刪除本地一個或多個鏡像。
語法
docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS說明:
- -f:強制刪除;
- –no-prune:不移除該鏡像的過程鏡像,默認移除;
實例
強制刪除本地鏡像 runoob/ubuntu:v4。
root@runoob:~# docker rmi -f runoob/ubuntu:v4
Untagged: runoob/ubuntu:v4
Deleted: sha256:1c06aa18edee44230f93a90a7d88139235de12cd4c089d41eed8419b503072be
Deleted: sha256:85feb446e89a28d58ee7d80ea5ce367eebb7cec70f0ec18aa4faa874cbd97c73
tag
docker tag: 標記本地鏡像,將其歸入某一倉庫。
語法
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
實例
將鏡像ubuntu:15.10標記為 runoob/ubuntu:v3 鏡像。
root@runoob:~# docker tag ubuntu:15.10 runoob/ubuntu:v3
root@runoob:~# docker images runoob/ubuntu:v3
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v3 4e3b13c8a266 3 months ago 136.3 MB
build
docker build 命令用于使用 Dockerfile 創建鏡像。
語法
docker build [OPTIONS] PATH | URL | -
OPTIONS說明:
- –build-arg=[]:設置鏡像創建時的變量;
- –cpu-shares:設置 cpu 使用權重;
- –cpu-period:限制 CPU CFS周期;
- –cpu-quota:限制 CPU CFS配額;
- –cpuset-cpus:指定使用的CPU id;
- –cpuset-mems:指定使用的內存 id;
- –disable-content-trust:忽略校驗,默認開啟;
- -f:指定要使用的Dockerfile路徑;
- –force-rm:設置鏡像過程中刪除中間容器;
- –isolation:使用容器隔離技術;
- –label=[]:設置鏡像使用的元數據;
- -m:設置內存最大值;
- –memory-swap:設置Swap的最大值為內存+swap,"-1"表示不限swap;
- –no-cache:創建鏡像的過程不使用緩存;
- –pull:嘗試去更新鏡像的新版本;
- –quiet, -q:安靜模式,成功后只輸出鏡像 ID;
- –rm:設置鏡像成功后刪除中間容器;
- –shm-size:設置/dev/shm的大小,默認值是64M;
- –ulimit:Ulimit配置。
- –squash:將 Dockerfile 中所有的操作壓縮為一層。
- –tag, -t: 鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。
- –network: 默認 default。在構建期間設置RUN指令的網絡模式
實例
使用當前目錄的 Dockerfile 創建鏡像,標簽為 runoob/ubuntu:v1。
docker build -t runoob/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像。
docker build github.com/creack/docker-firefox
也可以通過 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
在 Docker 守護進程執行 Dockerfile 中的指令前,首先會對 Dockerfile 進行語法檢查,有語法錯誤時會返回:
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
history
docker history: 查看指定鏡像的創建歷史。
語法
docker history [OPTIONS] IMAGE
OPTIONS說明:
- -H:以可讀的格式打印鏡像大小和日期,默認為true;
- –no-trunc:顯示完整的提交記錄;
- -q:僅列出提交記錄ID。
實例
查看本地鏡像runoob/ubuntu:v3的創建歷史。
root@runoob:~# docker history runoob/ubuntu:v3
IMAGE CREATED CREATED BY SIZE COMMENT
4e3b13c8a266 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 3 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.863 kB
<missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 701 B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:43cb048516c6b80f22 136.3 MB
save
docker save: 將指定鏡像保存成 tar 歸檔文件。
語法
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 說明:
- -o:輸出到的文件。
實例
將鏡像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文檔
runoob@runoob:~$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
runoob@runoob:~$ ll my_ubuntu_v3.tar
-rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.tar
load
docker load: 導入使用 docker save 命令導出的鏡像。
語法
docker load [OPTIONS]
OPTIONS 說明:
- –input , -i: 指定導入的文件,代替 STDIN。
- –quiet , -q: 精簡輸出信息。
實例
導入鏡像:
$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE$ docker load < busybox.tar.gzLoaded image: busybox:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 769b9341d937 7 weeks ago 2.489 MB$ docker load --input fedora.tarLoaded image: fedora:rawhideLoaded image: fedora:20$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 769b9341d937 7 weeks ago 2.489 MB
fedora rawhide 0d20aec6529d 7 weeks ago 387 MB
fedora 20 58394af37342 7 weeks ago 385.5 MB
fedora heisenbug 58394af37342 7 weeks ago 385.5 MB
fedora latest 58394af37342 7 weeks ago 385.5 MB
import
docker import: 從歸檔文件中創建鏡像。
語法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
OPTIONS說明:
- -c:應用docker 指令創建鏡像;
- -m:提交時的說明文字;
實例
從鏡像歸檔文件my_ubuntu_v3.tar創建鏡像,命名為runoob/ubuntu:v4
runoob@runoob:~$ docker import my_ubuntu_v3.tar runoob/ubuntu:v4
sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39
runoob@runoob:~$ docker images runoob/ubuntu:v4
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v4 63ce4a6d6bc3 20 seconds ago 142.1 MB
容器生命周期管理相關命令
run
**docker run :**創建一個新的容器并運行一個命令
語法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS說明:
- -a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項;
- -d: 后臺運行容器,并返回容器ID;
- -i: 以交互模式運行容器,通常與 -t 同時使用;
- -P: 隨機端口映射,容器內部端口隨機映射到主機的端口
- -p: 指定端口映射,格式為:主機(宿主)端口:容器端口
- -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
- –name=“nginx-lb”: 為容器指定一個名稱;
- –dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致;
- –dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致;
- -h “mars”: 指定容器的hostname;
- -e username=“ritchie”: 設置環境變量;
- –env-file=[]: 從指定文件讀入環境變量;
- –cpuset=“0-2” or --cpuset=“0,1,2”: 綁定容器到指定CPU運行;
- -m:設置容器使用內存最大值;
- –net=“bridge”: 指定容器的網絡連接類型,支持 bridge/host/none/container: 四種類型;
- –link=[]: 添加鏈接到另一個容器;
- –expose=[]: 開放一個端口或一組端口;
- –volume , -v: 綁定一個卷
實例
使用docker鏡像nginx:latest以后臺模式啟動一個容器,并將容器命名為mynginx。
docker run --name mynginx -d nginx:latest
使用鏡像nginx:latest以后臺模式啟動一個容器,并將容器的80端口映射到主機隨機端口。
docker run -P -d nginx:latest
使用鏡像 nginx:latest,以后臺模式啟動一個容器,將容器的 80 端口映射到主機的 80 端口,主機的目錄 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
綁定容器的 8080 端口,并將其映射到本地主機 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用鏡像nginx:latest以交互模式啟動一個容器,在容器內執行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#
start/stop/restart
docker start :啟動一個或多個已經被停止的容器
docker stop :停止一個運行中的容器
docker restart :重啟容器
語法
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
實例
啟動已被停止的容器myrunoob
docker start myrunoob
停止運行中的容器myrunoob
docker stop myrunoob
重啟容器myrunoob
docker restart myrunoob
kill
docker kill :殺掉一個運行中的容器。
語法
docker kill [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS說明:
- -s:向容器發送一個信號
實例
殺掉運行中的容器mynginx
runoob@runoob:~$ docker kill -s KILL mynginx
mynginx
rm
**docker rm :**刪除一個或多個容器。
語法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS說明:
- -f:通過 SIGKILL 信號強制刪除一個運行中的容器。
- -l:移除容器間的網絡連接,而非容器本身。
- -v:刪除與容器關聯的卷。
實例
強制刪除容器 db01、db02:
docker rm -f db01 db02
移除容器 nginx01 對容器 db01 的連接,連接名 db:
docker rm -l db
刪除容器 nginx01, 并刪除容器掛載的數據卷:
docker rm -v nginx01
刪除所有已經停止的容器:
docker rm $(docker ps -a -q)
pause/unpause
docker pause :暫停容器中所有的進程。
docker unpause :恢復容器中所有的進程。
語法
docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]
實例
暫停數據庫容器db01提供服務。
docker pause db01
恢復數據庫容器 db01 提供服務。
docker unpause db01
create
**docker create :**創建一個新的容器但不啟動它
用法同 docker run
語法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
語法同 docker run
實例
使用docker鏡像nginx:latest創建一個容器,并將容器命名為myrunoob
runoob@runoob:~$ docker create --name myrunoob nginx:latest
09b93464c2f75b7b69f83d56a9cfc23ceb50a48a9db7652ee4c27e3e2cb1961f
exec
**docker exec :**在運行的容器中執行命令
語法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS說明:
- -d:分離模式: 在后臺運行
- -i:即使沒有附加也保持STDIN 打開
- -t:分配一個偽終端
實例
在容器 mynginx 中以交互模式執行容器內 /root/runoob.sh 腳本:
runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh
http://www.runoob.com/
在容器 mynginx 中開啟一個交互模式的終端:
runoob@runoob:~$ docker exec -i -t mynginx /bin/bash
root@b1a0703e41e7:/#
也可以通過 docker ps -a 命令查看已經在運行的容器,然后使用容器 ID 進入容器。
查看已經在運行的容器 ID:
# docker ps -a
...
9df70f9a0714 openjdk "/usercode/script.sh…"
...
第一列的 9df70f9a0714 就是容器 ID。
通過 exec 命令對指定的容器執行 bash:
# docker exec -it 9df70f9a0714 /bin/bash
容器操作相關命令
ps
docker ps: 列出容器
語法
docker ps [OPTIONS]
OPTIONS說明:
- -a:顯示所有的容器,包括未運行的。
- -f:根據條件過濾顯示的內容。
- –format:指定返回值的模板文件。
- -l:顯示最近創建的容器。
- -n:列出最近創建的n個容器。
- –no-trunc:不截斷輸出。
- -q:靜默模式,只顯示容器編號。
- -s:顯示總的文件大小。
實例
列出所有在運行的容器信息。
runoob@runoob:~$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
09b93464c2f7 nginx:latest "nginx -g 'daemon off" ... 80/tcp, 443/tcp myrunoob
96f7f14e99ab mysql:5.6 "docker-entrypoint.sh" ... 0.0.0.0:3306->3306/tcp mymysql
輸出詳情介紹:
CONTAINER ID: 容器 ID。
IMAGE: 使用的鏡像。
COMMAND: 啟動容器時運行的命令。
CREATED: 容器的創建時間。
STATUS: 容器狀態。
狀態有7種:
- created(已創建)
- restarting(重啟中)
- running(運行中)
- removing(遷移中)
- paused(暫停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的連接類型(tcp\udp)。
NAMES: 自動分配的容器名稱。
列出最近創建的5個容器信息。
runoob@runoob:~$ docker ps -n 5
CONTAINER ID IMAGE COMMAND CREATED
09b93464c2f7 nginx:latest "nginx -g 'daemon off" 2 days ago ...
b8573233d675 nginx:latest "/bin/bash" 2 days ago ...
b1a0703e41e7 nginx:latest "nginx -g 'daemon off" 2 days ago ...
f46fb1dec520 5c6e1090e771 "/bin/sh -c 'set -x \t" 2 days ago ...
a63b4a5597de 860c279d2fec "bash" 2 days ago ...
列出所有創建的容器ID。
runoob@runoob:~$ docker ps -a -q
09b93464c2f7
b8573233d675
b1a0703e41e7
f46fb1dec520
a63b4a5597de
6a4aa42e947b
de7bb36e7968
43a432b73776
664a8ab1a585
ba52eb632bbd
...
inspect
docker inspect: 獲取容器/鏡像的元數據。
語法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS說明:
- -f:指定返回值的模板文件。
- -s:顯示總的文件大小。
- –type:為指定類型返回JSON。
實例
獲取鏡像mysql:5.6的元信息。
runoob@runoob:~$ docker inspect mysql:5.6
[{"Id": "sha256:2c0964ec182ae9a045f866bbc2553087f6e42bfc16074a74fb820af235f070ec","RepoTags": ["mysql:5.6"],"RepoDigests": [],"Parent": "","Comment": "","Created": "2016-05-24T04:01:41.168371815Z","Container": "e0924bc460ff97787f34610115e9363e6363b30b8efa406e28eb495ab199ca54","ContainerConfig": {"Hostname": "b0cf605c7757","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"3306/tcp": {}},
...
獲取正在運行的容器mymysql的 IP。
runoob@runoob:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mymysql
172.17.0.3
top
docker top:查看容器中運行的進程信息,支持 ps 命令參數。
語法
docker top [OPTIONS] CONTAINER [ps OPTIONS]
容器運行時不一定有/bin/bash終端來交互執行top命令,而且容器還不一定有top命令,可以使用docker top來實現查看container中正在運行的進程。
實例
查看容器mymysql的進程信息。
runoob@runoob:~/mysql$ docker top mymysql
UID PID PPID C STIME TTY TIME CMD
999 40347 40331 18 00:58 ? 00:00:02 mysqld
查看所有運行容器的進程信息。
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
attach
docker attach:連接到正在運行中的容器。
語法
docker attach [OPTIONS] CONTAINER
要attach上去的容器必須正在運行,可以同時連接上同一個container來共享屏幕(與screen命令的attach類似)。
官方文檔中說attach后可以通過CTRL-C來detach,但實際上經過我的測試,如果container當前在運行bash,CTRL-C自然是當前行的輸入,沒有退出;如果container當前正在前臺運行進程,如輸出nginx的access.log日志,CTRL-C不僅會導致退出容器,而且還stop了。這不是我們想要的,detach的意思按理應該是脫離容器終端,但容器依然運行。好在attach是可以帶上–sig-proxy=false來確保CTRL-D或CTRL-C不會關閉容器。
實例
容器mynginx將訪問日志指到標準輸出,連接到容器查看訪問信息。
runoob@runoob:~$ docker attach --sig-proxy=false mynginx
192.168.239.1 - - [10/Jul/2016:16:54:26 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
events
docker events: 從服務器獲取實時事件
語法
docker events [OPTIONS]
OPTIONS說明:
- **-f :**根據條件過濾事件;
- **–since :**從指定的時間戳后顯示所有事件;
- **–until :**流水時間顯示到指定的時間為止;
實例
顯示docker 2016年7月1日后的所有事件。
runoob@runoob:~/mysql$ docker events --since="1467302400"
2016-07-08T19:44:54.501277677+08:00 network connect 66f958fd13dc4314ad20034e576d5c5eba72e0849dcc38ad9e8436314a4149d4 (container=b8573233d675705df8c89796a2c2687cd8e36e03646457a15fb51022db440e64, name=bridge, type=bridge)
2016-07-08T19:44:54.723876221+08:00 container start b8573233d675705df8c89796a2c2687cd8e36e03646457a15fb51022db440e64 (image=nginx:latest, name=elegant_albattani)
2016-07-08T19:44:54.726110498+08:00 container resize b8573233d675705df8c89796a2c2687cd8e36e03646457a15fb51022db440e64 (height=39, image=nginx:latest, name=elegant_albattani, width=167)
2016-07-08T19:46:22.137250899+08:00 container die b8573233d675705df8c89796a2c2687cd8e36e03646457a15fb51022db440e64 (exitCode=0, image=nginx:latest, name=elegant_albattani)
...
顯示docker 鏡像為mysql:5.6 2016年7月1日后的相關事件。
runoob@runoob:~/mysql$ docker events -f "image"="mysql:5.6" --since="1467302400"
2016-07-11T00:38:53.975174837+08:00 container start 96f7f14e99ab9d2f60943a50be23035eda1623782cc5f930411bbea407a2bb10 (image=mysql:5.6, name=mymysql)
2016-07-11T00:51:17.022572452+08:00 container kill 96f7f14e99ab9d2f60943a50be23035eda1623782cc5f930411bbea407a2bb10 (image=mysql:5.6, name=mymysql, signal=9)
2016-07-11T00:51:17.132532080+08:00 container die 96f7f14e99ab9d2f60943a50be23035eda1623782cc5f930411bbea407a2bb10 (exitCode=137, image=mysql:5.6, name=mymysql)
2016-07-11T00:51:17.514661357+08:00 container destroy 96f7f14e99ab9d2f60943a50be23035eda1623782cc5f930411bbea407a2bb10 (image=mysql:5.6, name=mymysql)
2016-07-11T00:57:18.551984549+08:00 container create c8f0a32f12f5ec061d286af0b1285601a3e33a90a08ff1706de619ac823c345c (image=mysql:5.6, name=mymysql)
2016-07-11T00:57:18.557405864+08:00 container attach c8f0a32f12f5ec061d286af0b1285601a3e33a90a08ff1706de619ac823c345c (image=mysql:5.6, name=mymysql)
2016-07-11T00:57:18.844134112+08:00 container start c8f0a32f12f5ec061d286af0b1285601a3e33a90a08ff1706de619ac823c345c (image=mysql:5.6, name=mymysql)
2016-07-11T00:57:19.140141428+08:00 container die c8f0a32f12f5ec061d286af0b1285601a3e33a90a08ff1706de619ac823c345c (exitCode=1, image=mysql:5.6, name=mymysql)
2016-07-11T00:58:05.941019136+08:00 container destroy c8f0a32f12f5ec061d286af0b1285601a3e33a90a08ff1706de619ac823c345c (image=mysql:5.6, name=mymysql)
2016-07-11T00:58:07.965128417+08:00 container create a404c6c174a21c52f199cfce476e041074ab020453c7df2a13a7869b48f2f37e (image=mysql:5.6, name=mymysql)
2016-07-11T00:58:08.188734598+08:00 container start a404c6c174a21c52f199cfce476e041074ab020453c7df2a13a7869b48f2f37e (image=mysql:5.6, name=mymysql)
2016-07-11T00:58:20.010876777+08:00 container top a404c6c174a21c52f199cfce476e041074ab020453c7df2a13a7869b48f2f37e (image=mysql:5.6, name=mymysql)
2016-07-11T01:06:01.395365098+08:00 container top a404c6c174a21c52f199cfce476e041074ab020453c7df2a13a7869b48f2f37e (image=mysql:5.6, name=mymysql)
如果指定的時間是到秒級的,需要將時間轉成時間戳。如果時間為日期的話,可以直接使用,如–since=“2016-07-01”。
logs
docker logs: 獲取容器的日志
語法
docker logs [OPTIONS] CONTAINER
OPTIONS說明:
- -f: 跟蹤日志輸出
- –since:顯示某個開始時間的所有日志
- -t: 顯示時間戳
- –tail:僅列出最新N條容器日志
實例
跟蹤查看容器mynginx的日志輸出。
runoob@runoob:~$ docker logs -f mynginx
192.168.239.1 - - [10/Jul/2016:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
2016/07/10 16:53:33 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.239.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.239.130", referrer: "http://192.168.239.130/"
192.168.239.1 - - [10/Jul/2016:16:53:33 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.239.130/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
192.168.239.1 - - [10/Jul/2016:16:53:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
...
查看容器mynginx從2016年7月1日后的最新10條日志。
docker logs --since="2016-07-01" --tail=10 mynginx
wait
docker wait: 阻塞運行直到容器停止,然后打印出它的退出代碼。
語法
docker wait [OPTIONS] CONTAINER [CONTAINER...]
實例
docker wait CONTAINER
export
docker export:將文件系統作為一個tar歸檔文件導出到STDOUT。
語法
docker export [OPTIONS] CONTAINER
OPTIONS說明:
- -o:將輸入內容寫到文件。
實例
將id為a404c6c174a2的容器按日期保存為tar文件。
runoob@runoob:~$ docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
runoob@runoob:~$ ls mysql-`date +%Y%m%d`.tar
mysql-20160711.tar
port
docker port:列出指定的容器的端口映射,或者查找將PRIVATE_PORT NAT到面向公眾的端口。
語法
docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
實例
查看容器mynginx的端口映射情況。
runoob@runoob:~$ docker port mymysql
3306/tcp -> 0.0.0.0:3306
容器rootfs相關命令
commit
docker commit:從容器創建一個新的鏡像。
語法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS說明:
- -a:提交的鏡像作者;
- -c:使用Dockerfile指令來創建鏡像;
- -m:提交時的說明文字;
- -p:在commit時,將容器暫停。
實例
將容器a404c6c174a2 保存為新的鏡像,并添加提交人信息和說明信息。
runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
mymysql v1 37af1236adef 15 seconds ago 329 MB
cp
docker cp:用于容器與主機之間的數據拷貝。
語法
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS說明:
- -L:保持源目標中的鏈接
實例
將主機/www/runoob目錄拷貝到容器96f7f14e99ab的/www目錄下。
docker cp /www/runoob 96f7f14e99ab:/www/
將主機/www/runoob目錄拷貝到容器96f7f14e99ab中,目錄重命名為www。
docker cp /www/runoob 96f7f14e99ab:/www
將容器96f7f14e99ab的/www目錄拷貝到主機的/tmp目錄中。
docker cp 96f7f14e99ab:/www /tmp/
diff
docker diff: 檢查容器里文件結構的更改。
語法
docker diff [OPTIONS] CONTAINER
實例
查看容器mymysql的文件結構更改。
runoob@runoob:~$ docker diff mymysql
A /logs
A /mysql_data
C /run
C /run/mysqld
A /run/mysqld/mysqld.pid
A /run/mysqld/mysqld.sock
C /tmp
圖示總結
本節來自:https://segmentfault.com/a/1190000038921337
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-K9ybbsxY-1644935579572)(docker初探.assets/docker0.png)]
Docker 包括三個基本概念:
- 鏡像(
Image
):Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。 - 容器(
Container
):鏡像(Image
)和容器(Container
)的關系,就像是面向對象程序設計中的類
和實例
一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。 - 倉庫(
Repository
):倉庫(Repository
)類似Git的遠程倉庫,集中存放鏡像文件。
三者關系可以用下圖表示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZuyQoaqH-1644935579573)(docker初探.assets/docker1.png)]
關于docker容器和鏡像的區別
本節來自:https://zhuanlan.zhihu.com/p/120982681
docker的整個生命周期有三部分組成:鏡像(image)+容器(container)+倉庫(repository)。如下圖所示,容器是由鏡像實例化而來,這和我們學習的面向對象的概念十分相似,我們可以把鏡像看作類,把容器看作類實例化后的對象。
也可以說鏡像是文件, 容器是進程。 容器是基于鏡像創建的, 即容器中的進程依賴于鏡像中的文件, 這里的文件包括進程運行所需要的可執行文件, 依賴軟件, 庫文件, 配置文件等等…
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-H7EFUaJc-1644935579574)(docker初探.assets/docker2.jpeg)]
docker 的鏡像概念類似虛擬機的鏡像。是一個只讀的模板,一個獨立的文件系統,包括運行容器所需的數據,可以用來創建新的容器。( docker create <image -id > :為指定的鏡像添加一個可讀寫層,構成一個新的容器;)
例如:一個鏡像可以包含一個完整的ubuntu操作系統環境,里面僅安裝了mysql或用戶需要的其他應用程序。
docker鏡像實際上是由一層一層的系統文件組成,這種層級的文件系統被稱為UnionFS( Union file system 統一文件系統),鏡像可以基于dockerfile構建,dockerfile是一個描述文件,里面包含了若干條密令,每條命令都會對基礎文件系統創建新的層次結構。
docker提供了一個很簡單的機制來創建鏡像或更新現有的鏡像。用戶甚至可以從其他人那里下載一個已經做好的鏡像直接使用。(鏡像是只讀的,可以理解為靜態文件)
docker利用容器來運行應用:docker容器是由docker鏡像創建的運行實例。docker容器類似虛擬機,可以執行包含啟動,停止,刪除等。每個容器間是相互隔離的。容器中會運行特定的運用,包含特定應用的代碼及所需的依賴文件。可以把容器看作一個簡易版的linux環境(包含root用戶權限,進程空間,用戶空間和網絡空間等)和運行在其中的應用程序。
相對于鏡像來說容器是動態的,容器在啟動的時候創建了一層可寫層次作為最上層。( docker create <image -id > :為指定的鏡像添加一個可讀寫層,構成一個新的容器;)
docker倉庫:如果使用了git和github就很容易理解docker的倉庫概念。docker倉庫概念和git類似。
docker倉庫是用來包含鏡像的位置,docker提供了一個注冊服務器(register)來保存多個倉庫,每個倉庫又可以包含多個具備不同tag的鏡像,
docker運作中使用的默認倉庫是docker hub公共倉庫。
倉庫支持的操作類似git,當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到共有或者私有的倉庫。這樣下次再另外一臺機器上使用這個鏡像的時候只需要從倉庫里面pull下來就可以了。
Ref:
https://stackoverflow.com/questions/44084846/cannot-connect-to-the-docker-daemon-on-macos
https://www.runoob.com/docker/
https://segmentfault.com/a/1190000038921337
https://zhuanlan.zhihu.com/p/120982681