1. 程式人生 > 實用技巧 >四、docker容器的操作

四、docker容器的操作

一、容器的啟動

方法一:不推薦使用
      先建立一個容器
      docker create 映象名稱
      在啟動容器
      docker start 映象名稱
方法二:推薦的
      docker run -d -p 宿主機埠:映象埠 映象名稱:version
      run:建立並執行一個容器
       -d:在後臺執行
       -p:埠對映,把宿主機的埠對映為容器系統的埠
       最後接要啟動的容器的映象的名稱:映象版本
       docker run == docker create + docker start

注意:容器內的第一個程序必須一直處於執行的狀態,否則這個容器,就會處於退出狀態!

二、容器的常用命令選項

docker的命令格式

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
options的引數
   -t :開啟一個終端,像使用交換機一樣使用容器
   -i:互動式訪問
 --name:容器名字
 --network:指定網路
 --rm:容器一停,自動刪除
   -d:剝離與當前終端的關係;否則會一直佔據著終端
   -p:埠對映,將容器內服務的埠對映在宿主機的指定埠
      -p <container port>
      -p <hostport>:<container port>
      -p <hostip>:<hostport>:<container port>
   ps
: 檢視執行著的容器 docker ps == docker container ls ps -a: 檢視所有容器

例子1:

啟動一個web1的nginx的容器

docker run -d --name web1 -p 80:80 nginx:latest
[root@inode3 ~]# docker run --name web1 -d -p 80:80 nginx:latest
03fcdd23c2ad9a9d81551ce3fd3bcf4f3a410c648a895fa6db5b497936515da1

檢視執行容器的狀態

docker ps 
[root@inode3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 03fcdd23c2ad nginx:latest "nginx -g 'daemon of…" 12 minutes ago Up 12 minutes 0.0.0.0:80->80/tcp web1 [root@inode3 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 03fcdd23c2ad nginx:latest "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp web1

檢視容器的埠對映及容器

[root@inode3 ~]# docker port web1
80/tcp -> 0.0.0.0:80

例子2:

啟動容器時,進入容器裡面

docker run --name ywx -it busybox:latest /bin/sh
[root@inode3 ~]# docker run --name ywx -it busybox:latest /bin/sh
 / # ls
 bin   dev   etc   home  proc  root  sys   tmp   usr   var
 / # 

另外啟動一個xshell的視窗,檢視docker 容器

[root@inode3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
b1840dcc4a4d        busybox:latest      "/bin/sh"                About a minute ago   Up About a minute                        ywx
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago    Up About an hour    0.0.0.0:80->80/tcp   web1

可以發現ywx容器在執行

[root@inode3 ~]# docker run --name ywx -it busybox:latest /bin/sh
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # exit
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                NAMES
b1840dcc4a4d        busybox:latest      "/bin/sh"                3 minutes ago       Exited (0) 7 seconds ago                        ywx

當我們退出ywx容器時,ywx容器也停止了。因此,在啟動容器時,容器內的第一個程序必須一直處於執行的狀態,否則這個容器,就會處於退出狀態!

三、停止容器

停止容器有2中方法

第一種:關閉執行的容器
docker stop 容器名或CONTAINER ID
第二種:殺死執行的容器(不建議使用)
docker kill 容器名或CONTAINER ID
           -s 指定訊號; -9強制停止容器

例子1:

關閉一個容器

[root@inode3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   4 seconds ago       Up 3 seconds        0.0.0.0:81->80/tcp   web2
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp   web1

有we1和we2兩個執行的容器

使用docker stop來關閉執行的容器web1
docker stop web1
[root@inode3 ~]# docker stop web1
web1
[root@inode3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:81->80/tcp   web2
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes                    0.0.0.0:81->80/tcp   web2
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Exited (0) About a minute ago                        web1

容器web1已經停止,容器web2還在執行

使用docker kill來關閉容器
docker kill web2
[root@inode3 ~]# docker kill web2
web2
[root@inode3 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   5 minutes ago       Exited (137) 8 seconds ago                       web2
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Exited (0) 3 minutes ago                         web1

容器web2已經停止執行

四、重啟關閉的容器

命令格式:

docker start [option] 容器名稱或容器的CONTAINER ID
option
   -a 在當前終端啟動
   -i 互動式

使用容器名稱來啟動web1
[root@inode3 ~]# docker start web1
web1
[root@inode3 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up 3 seconds        0.0.0.0:80->80/tcp   web1
使用容器的容器的CONTAINER ID來啟動web2
[root@inode3 ~]# docker start 71dd5dd51ae4
71dd5dd51ae4
[root@inode3 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   9 minutes ago       Up 2 seconds        0.0.0.0:81->80/tcp   web2
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up About a minute   0.0.0.0:80->80/tcp   web1

容器web1和web2已經重新啟動

五、檢視容器的資訊

docker inspect 容器名稱或容器的CONTAINER ID
檢視web1的ip資訊
[root@inode3 ~]# docker inspect web1|grep -i "ipaddr"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",
[root@inode3 ~]# docker inspect web1
可以檢視容器web1的所有資訊

六、刪除容器

刪除容器的步驟:

命令格式: docker rm 容器名稱或容器的CONTAINER ID

1、停止容器

2、刪除容器

刪除容器web1
[root@inode3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   15 minutes ago      Up 6 minutes        0.0.0.0:81->80/tcp   web2
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up 7 minutes        0.0.0.0:80->80/tcp   web1
第一步:先停止web1容器
[root@inode3 ~]# docker stop web1
web1
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   16 minutes ago      Up 7 minutes               0.0.0.0:81->80/tcp   web2
03fcdd23c2ad        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Exited (0) 5 seconds ago                        web1
第二部:刪除已停止執行的web1容器
[root@inode3 ~]# docker rm web1
web1
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
71dd5dd51ae4        nginx:latest        "nginx -g 'daemon of…"   18 minutes ago      Up 8 minutes        0.0.0.0:81->80/tcp   web2

強制刪除執行中的容器web2
[root@inode3 ~]# docker rm -f web2
web2
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

強制刪除所有容器(包含執行和沒有執行的容器)
環境說明:容器web1停止執行,web2執行正常
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS                NAMES
615daf3e3c9d        nginx:latest        "nginx -g 'daemon of…"   12 seconds ago       Exited (0) 3 seconds ago                        web1
4dbf642e55c0        nginx:latest        "nginx -g 'daemon of…"   About a minute ago   Up About a minute          0.0.0.0:81->80/tcp   web2

強制刪除所有容器web1和web2
[root@inode3 ~]# docker rm -f `docker ps -a -q`
615daf3e3c9d
4dbf642e55c0
[root@inode3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

七、對執行的容器執行指定命令exec

命令格式:

docker exec [options] 容器名稱或容器的CONTAINER ID Command [Ages]

options

-d:在後臺執行

-e:設定環境變數

-i:互動式

-t:開啟一個終端

-u:使用者名稱或UID

例子:

[root@inode3 ~]# docker run --name web1 -d -p 80:80 nginx:latest
7c5d1590be345fffab80385e76ff04a8f5d565962e03e6753ebef5112ad34087
[root@inode3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
7c5d1590be34        nginx:latest        "nginx -g 'daemon of…"   21 seconds ago      Up 20 seconds       0.0.0.0:80->80/tcp   web1

1、互動式進入容器
   [root@inode3 ~]# docker exec -it web1 /bin/bash
   root@7c5d1590be34:/# ls
   bin  boot  dev    etc  home  lib    lib64  media  mnt  opt    proc  root  run  sbin  srv  sys  tmp  usr  var

2、檢視/目錄資訊
   [root@inode3 ~]# docker exec web1 ls -l
   total 8
   drwxr-xr-x   2 root root 4096 Feb 24 00:00 bin
   drwxr-xr-x   2 root root    6 Feb  1 17:09 boot
   drwxr-xr-x   5 root root  340 Mar  5 15:36 dev
   drwxr-xr-x   1 root root   66 Mar  5 15:36 etc
   drwxr-xr-x   2 root root    6 Feb  1 17:09 home
   drwxr-xr-x   1 root root   56 Feb 26 20:02 lib
   drwxr-xr-x   2 root root   34 Feb 24 00:00 lib64
   drwxr-xr-x   2 root root    6 Feb 24 00:00 media
   drwxr-xr-x   2 root root    6 Feb 24 00:00 mnt
   drwxr-xr-x   2 root root    6 Feb 24 00:00 opt
   dr-xr-xr-x 111 root root    0 Mar  5 15:36 proc
   drwx------   1 root root   27 Mar  5 15:39 root
   drwxr-xr-x   1 root root   23 Mar  5 15:36 run
   drwxr-xr-x   2 root root 4096 Feb 24 00:00 sbin
   drwxr-xr-x   2 root root    6 Feb 24 00:00 srv
   dr-xr-xr-x  13 root root    0 Mar  5 15:36 sys
   drwxrwxrwt   1 root root    6 Feb 26 20:02 tmp
   drwxr-xr-x   1 root root   66 Feb 24 00:00 usr
   drwxr-xr-x   1 root root   19 Feb 24 00:00 var

八、查詢容器內部日誌

命令格式:

docker logs 容器名稱或容器的CONTAINER ID

查詢容器web1中日誌資訊

直接訪問容器的logs
[root@inode3 ~]# docker logs web1
沒有任何日誌的

先訪問下容器web1
[root@inode3 ~]# curl 192.168.32.103
再查詢容器的logs
[root@inode3 ~]# docker logs web1
 192.168.32.103 - - [05/Mar/2020:15:42:41 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

查詢容器的內部日誌,需要先訪問該容器的功能,再查詢該容器的日誌

九、docker重啟時,容器自動執行

在執行docker容器時可以加如下引數來保證每次docker服務重啟後容器也自動重啟:

--restart=always
–restart具體引數值詳細資訊:
       no –  容器退出時,不重啟容器;
       on-failure – 只有在非0狀態退出時才從新啟動容器;
       always – 無論退出狀態是如何,都重啟容器;

如果已經啟動了則可以使用如下命令:

docker update --restart=always <CONTAINER ID>

十、把容器中的檔案拷到宿主機或宿主機的檔案拷到容器中

從容器中拷貝檔案到宿主機
docker cp 容器id:檔案路徑  宿主機檔案路徑

從宿主機拷貝檔案到容器
docker cp  宿主機檔案路徑  容器id:檔案路徑

十一、docker容器的操作命令圖及總結

docker的本質是:在隔離的環境執行的一個程序,所以docker容器內的第一個程序必須一直處於前臺執行的狀態(必須夯住),否則這個容器,就會處於退出狀態!