docker - 常用命令

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 目錄

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章