1. docker服務的啓動、停止、重啓
[root@localhost ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@localhost ~]# service docker stop
Redirecting to /bin/systemctl stop docker.service
[root@localhost ~]# service docker start
Redirecting to /bin/systemctl start docker.service
2. 查看docker鏡像
獲取本地倉庫中的所有docker鏡像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.4.1708 295a0b2bd8ea 5 weeks ago 197MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
3. 運行容器
docker run命令語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
部分常用options說明:
-d: 後臺運行容器,並返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-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=[]: 開放一個端口或一組端口;
3.1 以交互方式運行容器
[root@localhost ~]# docker run -it --name centos-test centos:7.4.1708
[root@ebd974405f42 /]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebd974405f42 centos:7.4.1708 "/bin/bash" 10 seconds ago Up 10 seconds centos-test
--name: 指定容器的名稱
以交互方式運行容器後,docker引擎會隨機分配一個的容器名,並分配一個短ID爲容器ID。另外,容器運行後,將會執行Dockerfile中的CMD命令,centos中的CMD命令是/bin/bash命令,所以上面運行了centos容器後,將進入它的bash中。
通過下面的命令運行一個例子,驗證下。例子中的echo命令替代了原來centos中指定的CMD命令,當centos容器啓動後,將會運行echo命令,然後就退出了。運行ps命令查看正在運行的容器,發現是沒有任何運行的容器。
[root@localhost ~]# docker run -it centos:7.4.1708 echo hello,docker
hello,docker
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.2 後臺運行容器
[root@localhost ~]# docker run --name centos-deamon -d centos:7.4.1708 tail -f /dev/null
63e5555c9ed35deb7e32c2a16896e0f806dbcf471d0484bdd904724a3cce542d
[root@localhost ~]# docker run -d --name centos-deamon centos:7.4.1708 /bin/bash -c "while true; do sleep 1; echo hello; done"
badd8b49482f9a2ad47e45cc595574ad4633086fcfd01329033190821937996b
後臺運行容器的命令執行後,會返回一個長ID,我們在ps命令看到的容器短ID其實是長ID的前面12位。
命令行中的參數解析:
--name: 指定容器的名稱
-d:參數容器以後臺的方式運行
/bin/bash -c "while true; do sleep 1; echo hello; done":參考dockerfile的CMD指令,這裏的意思是在啓動容器後,運行這個命令,這個命令是運行一段shell腳本,每個1秒輸出 hello 。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
badd8b49482f centos:7.4.1708 "/bin/bash -c 'while…" 33 seconds ago Up 32 seconds centos-deamon
此時,我們已經在後臺運行了centos容器。但是,有時我們要進入容器中做一些工作,那麼怎麼進入後臺運行的容器中呢?有兩種方式可以進入到運行中的容器中:attach和exec
3.2.1 attach方式進入後臺運行的容器
attach是進入到容器啓動命令的終端,不會啓動新的進程,下面通過實例體驗下。
[root@localhost ~]# docker attach badd8b49482f
通過attach進入容器後,在窗口中會一直打印hello(那麼怎麼退出attach呢?我也不知道怎麼退出,囧)
[root@localhost ~]# docker attach badd8b49482f
hello
hello
hello
hello
attach的方式退出不了,那麼怎麼監控啓動springboot後的日誌呢?
可以用 logs命令 查看容器的輸出
[root@localhost ~]# docker logs -f badd8b49482f
logs命令可以通過ctrl+c結束。
3.2.2 exec方式進入後臺運行的容器
有些時候,我們不止需要監控程序的運行輸出,還需要進入容器中進行相應操作。docker exec命令可以通過交互的方式進入到容器中。此時,容器中會打開新的終端,啓動新的進程。
[root@localhost ~]# docker exec -it badd8b49482f bash
[root@badd8b49482f /]#
進入容器後,通過linux命令ps查看運行的進程
[root@badd8b49482f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:58 ? 00:00:00 /bin/bash -c while true; do sl
root 912 0 0 15:13 pts/0 00:00:00 bash
root 954 912 0 15:13 pts/0 00:00:00 ps -ef
root 955 1 0 15:13 ? 00:00:00 sleep 1
確實多了一個 bash 命令的進程。第一個進程是前面後臺運行容器。
3.3 停止和重啓容器
docker 容器有幾種狀態,分別是Created、Up、Exited、Paused狀態,我們通過run命令運行容器時,其實是一個從created到up狀態的過程。
當通過run命令啓動容器時,容器進入up狀態
[root@localhost ~]# docker run -it centos:7.4.1708
[root@e83cf32fbc22 /]#
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e83cf32fbc22 centos:7.4.1708 "/bin/bash" About a minute ago Up 59 seconds
當通過stop命令停止容器時,容器進入exited狀態
[root@localhost ~]# docker stop e83cf32fbc22
e83cf32fbc22
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e83cf32fbc22 centos:7.4.1708 "/bin/bash" 13 minutes ago Exited (137) 2 minutes ago naughty_wescoff
容器退出後,系統仍然保存該容器實例,即退出的容器仍然會佔用系統的硬盤資源,需要 rm 刪除該容器才能完全清除容器的資源佔用。
重新啓動退出後的容器
處於exited狀態的容器,可以通過start命令重新啓動
[root@localhost ~]# docker start e83cf32fbc22
e83cf32fbc22
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e83cf32fbc22 centos:7.4.1708 "/bin/bash" 40 minutes ago Up 7 seconds naughty_wescoff
[root@localhost ~]# docker attach e83cf32fbc22
[root@e83cf32fbc22 /]#
重啓容器
[root@localhost ~]# docker restart e83cf32fbc22
e83cf32fbc22
4. 查看容器列表
查看正在運行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcb11caf4b66 centos:7.4.1708 "/bin/bash" 23 seconds ago Up 22 seconds confident_wilson
查看所有的容器,包括創建;運行、退出狀態的容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcb11caf4b66 centos:7.4.1708 "/bin/bash" 6 seconds ago Up 5 seconds confident_wilson
672547edfd3a centos:7.4.1708 "/bin/bash" 3 minutes ago Exited (137) About a minute ago compassionate_mclean
36e5c6849c38 centos:7.4.1708 "echo hello,docker" 17 hours ago Exited (0) 17 hours ago hungry_hopper
ebd974405f42 centos:7.4.1708 "/bin/bash" 17 hours ago Exited (0) 17 hours ago angry_elbakyan
0cacf3d0dc27 centos:7.4.1708 "/bin/bash" 17 hours ago Exited (137) 17 hours ago centos-dev
f7ee82c0b61f centos:7.4.1708 "--names centos-dev" 17 hours ago Created hardcore_payne
a77abc526852 centos:7.4.1708 "-names centos-dev" 17 hours ago Created zealous_noyce
c20907175e16 centos:7.4.1708 "-name aaa" 17 hours ago Created priceless_ardinghelli
a72d7f6bd143 centos:7.4.1708 "/bin/bash" 17 hours ago Exited (0) 17 hours ago optimistic_kilby
f13cc3b911ee centos:7.4.1708 "--name centos-dev" 17 hours ago Created nostalgic_keller
7fbb05792f59 centos:7.4.1708 "/bin/bash" 6 days ago Exited (137) 6 days ago clever_roentgen
6ca38b403431 centos:7.4.1708 "/bin/bash" 6 days ago Exited (1) 6 days ago elegant_stonebraker
74c83be9fd78 centos:7.4.1708 "/bin/bash" 7 days ago Exited (137) 7 days ago goofy_bassi
d3148328c95d hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago cocky_hugle
前面啓動了一個ID爲fcb11caf4b66的容器,在列表中它是處理up狀態的。
5. 刪除容器
從上面的啓動小節可以看到,如果通過stop停止容器,容器的相關文件仍然存留在宿主主機中,爲了釋放這部分存儲空間,需要刪除這些容器。
docker rm id1 id2
可以刪除對應ID的容器。
如果希望批量刪除所有除了運行狀態的容器,可以通過下面的命令完成
docker rm $(docker ps -a -q)
如果要批量刪除指定狀態的容器
docker rm $(docker ps -a -q status=exited)
6. 構建新鏡像
通過Dockerfile構建一個新的鏡像
docker build -t centos7-vim-by-dockerfile:1.0.0 .
-t參數將新鏡像命名爲centos7-vim-by-dockerfile,tag是1.0.0
命令中最後的 . ,指明當前目錄爲build context,默認情況下從build context中查找Dockerfile文件
7. 刪除鏡像
docker rmi {docker_name}
或者
docker rmi {docker_id}
有時,已經存在該鏡像的容器,我們需要強行刪除該鏡像,需要加個 -f 參數
8. 查看容器的信息
有時,需要查看容器的信息,比如掛載,網絡情況,等
docker inspect {container_id}
或者
docker inspect {container_name}
例如,現在查看容器名springboot-docker的網絡情況
docker inspect springboot-docker
省略很多信息
[
{
"Id": "68b08ef3eb123c131a4e0222bf4bf555a40df35223be7a80e1ff548a169337de",
"Created": "2018-11-29T14:32:38.185441309Z",
"Path": "java",
"Args": [
"-Djava.security.egd=file:/dev/./urandom",
"-jar",
"/app/springboot-docker/app.jar"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1605,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-11-29T14:32:39.48342234Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Mounts": [
{
"Type": "volume",
"Name": "9c72087d2940aae775e82004fbf0b28da5c83e9a53ef8de8f9c262f0b7a340ef",
"Source": "/var/lib/docker/volumes/9c72087d2940aae775e82004fbf0b28da5c83e9a53ef8de8f9c262f0b7a340ef/_data",
"Destination": "/tmp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"NetworkSettings": {
"Bridge": "",
"SandboxID": "0eed3f8ec96b408fcd42636788e8c50d3d9ee391540709fa3c9345ad39fd1c73",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"8080/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
},
"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": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "9d46a34bc875d407dd074e36bb716a8d497e7636e7bf6390124bdadb9b50f8f0",
"EndpointID": "d1f0f3b28c22def17f20032fa8715da5f49c4047cd5115eb9599cf80f89a550c",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
從上面我們可以看到 容器的ID,容器當前的狀態是running,容器的IP地址是172.17.0.2,容器的/tmp目錄掛載在宿主機的 /var/lib/docker/volumes/9c72087d2940aae775e82004fbf0b28da5c83e9a53ef8de8f9c262f0b7a340ef/_data 目錄