docker系列(三):docker容器
1 引言
在前面博文中,我們介紹了映象。如果說映象猶如面向物件中的類,本節要說的容器就是由類例項化出來的物件了,有了類才可以建立容器。
先從拉取一個官方提供的ubuntu最新映象:
$ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5 Status: Downloaded newer image for ubuntu:latest
我們以這個映象建立容器進行展開。
2 建立容器
(1)新建並啟動容器:docker run [OPTION] IMAGE [COMMAND] [ARG…]
這一命令會根據IMAGE容器新建並啟動一個容器,如果該容器在本機中不存在,則先從預設倉庫中下載,然後執行新建及啟動操作。命令中,OPTION的一些常用選項如下:
- --name="容器別名":為即將啟動的容器指定一個別名
- -d:後臺執行容器,並返回容器ID,也就是說,啟動守護式容器。
- -i:以互動模式執行容器,通產與-t同時使用。
- -t:為容器重新分配一個偽輸入終端,通常與-i同時使用。
- -P:隨機埠對映;
- -p:指定埠對映,有以下4種格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
例如,以ubuntu:18.04映象以互動式終端方式啟動一個新容器,指定容器別名為ubuntu_docker:
$ docker run -it --name ubuntu_docker ubuntu:18.04 root@3c087af2e00c:/#(2)啟動已建立好的容器
docker start [OPTIONS] CONTAINER
OPTIONS包含兩個引數:
-
-a:是否繫結到標準輸入輸出
-
-i:保持標準輸入開啟
docker restart [OPTION] CONTAINER
重啟命令只包含一個OPTION選項:
-t :指定多少秒後重啟容器
3 檢視容器
檢視容器通過以下命令:
$ docker ps [OPTIONS]
OPTIONS常用選項如下:
- -a:列出當前所有正在執行的容器和曾經執行過的容器。
- -l:現實最近(上一個)執行過的容器。
- -n:顯示最近n個建立的容器。
- -q:靜默模式,只顯示容器編號。
- --no-trunc:不截斷輸出。
下面通過示例說明:
(1)不加任何引數時,表示列出正在執行的容器:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c087af2e00c ubuntu:18.04 "/bin/bash" About a minute ago Up About a minute ubuntu_docker(2)列出所有容器:
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c087af2e00c ubuntu:18.04 "/bin/bash" 5 minutes ago Up 5 minutes ubuntu_docker 41989e88ecfa ubuntu:18.04 "/bin/bash" 11 minutes ago Exited (0) 6 minutes ago myubuntu 18c03ae954ab ubuntu_dockerfile_git:1.0 "/bin/bash" 2 weeks ago Exited (0) 2 weeks ago amazing_leavitt
可以看到,在STATUS一列,有Up和Exited兩種狀態,分別表示正在執行和已退出的狀態。
(3)列出最近執行的3個容器:
$ docker ps -n 2 $ docker ps -n 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c087af2e00c ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu_docker 41989e88ecfa ubuntu:18.04 "/bin/bash" 2 hours ago Exited (0) 12 minutes ago myubuntu
4 停止、退出容器
(1)互動終端容器退出-
exit:直接輸入exit然後回車,這種方式退出容器後,容器也隨之停止。
- 快捷鍵 ctrl + P + Q(必須是大寫模式下):容器不停止退出。
$ docker stop [OPTIONS]
stop命令只包含一個OPTION選項:
-t :指定多少秒後停止容器
(3)強制停止容器$ docker kill [OPTIONS]
OPTIONS只包含一個選項:
-s :傳送給容器的訊號
docker stop和docker kill雖然都是關閉容器,但是有區別的。docker stop相當於我們電腦關機時,通過開始選單中的關機選項關機,而docker kill就相當於強制拔掉電源關機。
5 刪除容器
docker rm [OPTIONS] CONTAINER(1)刪除已停止容器
docker rm 不使用任何引數時,表示刪除已停止容器,如果容器還在執行狀態,會出錯。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c087af2e00c ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu_docker $ docker rm 3c087af2 Error response from daemon: You cannot remove a running container 3c087af2e00c4f3d11a655edbd6f0acd62396b8489a5722fdfb45de08d5d5af4. Stop the container before attempting removal or force remove $ docker stop 3c087af 3c087af $ docker rm 3c087af 3c087af(2)強制刪除容器
$ docker rm -f myubuntu(3)刪除多個容器
$ docker rm -f 41989e88ecfa 18c03ae954ab # 刪除多個指定容器 41989e88ecfa 18c03ae954ab $ docker rm -f $(docker ps -a -q) # 刪除所有容器
6 進入容器
進入容器操作是對於在後臺執行中的容器而言的,也就是守護式容器。我們先來啟動一個守護式容器:
$ docker run -d ubuntu 406330111f0e68c1df804b37cc2664895043dd4b15ad565141f9844ac9fd7edb
docker run命令配合-d引數我們在上面瞭解過,是啟動守護式容器,執行命令後返回了啟動的容器id,容器則在後臺默默執行。但是,這個時候,如果你用docker ps命令檢視,你會發現,並沒有容器在執行:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
這是因為,在後臺執行的容器裡面,必須要有一個持續執行的程序,否則容器啟動後又會自動關閉,這是docker執行機制決定的。
所以,為了演示進入容器,我們先通過docker run -it啟動一個互動式容器,然後通過快捷鍵ctrl + Q + P退出容器,然後讓容器後臺執行。檢視一下在後臺執行的容器:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90999d16c0e8 ubuntu "/bin/bash" About a minute ago Up About a minute adoring_haslett
如果要再次使用剛才的容器執行操作,有兩種方法:
方法一:用docker attach進入容器,然後互動式執行操作
docker attach CONTAINER $ docker attach 90999d16c0e8 root@90999d16c0e8:/#方法二:通過docker exec直接呼叫容器執行操作。例如,檢視容器中/var目錄
$ docker exec -t 90999d16c0e8 ls -l /var total 36 drwxr-xr-x 2 root root 4096 Apr 24 2018 backups drwxr-xr-x 5 root root 4096 May 15 14:07 cache drwxr-xr-x 1 root root 4096 Apr 5 2018 lib drwxrwsr-x 2 root staff 4096 Apr 24 2018 local lrwxrwxrwx 1 root root 9 May 15 14:06 lock -> /run/lock drwxr-xr-x 3 root root 4096 May 15 14:06 log drwxrwsr-x 2 root mail 4096 May 15 14:06 mail drwxr-xr-x 2 root root 4096 May 15 14:06 opt lrwxrwxrwx 1 root root 4 May 15 14:06 run -> /run drwxr-xr-x 2 root root 4096 May 15 14:06 spool drwxrwxrwt 2 root root 4096 May 15 14:07 tmp
所以,通過docker exec命令執行容器的/bin/bash也可以啟動容器進行互動式操作:
$ docker exec -t 90999d16c0e8 /bin/bash root@90999d16c0e8:/#
總結一下兩種方法的區別:
docker attach命令直接進入容器啟動命令的終端,不會啟動新的程序;
docker exec是在容器終端開啟新的終端,並且可以啟動新的程序。
7 日誌檢視
下面,我們在啟動的後臺容器中執行一段持續執行的指令碼:
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done" a7ab05b236b862f22c5356c388d03a2c24bfe09df42a7b7c5cb4aebdb49985c0
這時候再用docker ps 檢視就可以看到有一個容器後臺運行了:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a7ab05b236b8 ubuntu "/bin/sh -c 'while t…" 46 seconds ago Up 44 seconds vigorous_booth
我們可以通過日誌來了解剛執行的守護式容器執行情況。檢視日誌通過docker logs命令:
docker logs [OPTIONS] CONTAINER
OPTIONS常用引數如下:
-f:持續更新輸出日誌
-t:在日誌中顯示時間戳資訊
-n:顯示多少條日誌記錄
-tail: 檢視最後的指定數量日誌
不新增如何引數得檢視日誌:
$ docker logs a7ab05b236b862f22c5356c hello world hello world hello world hello world hello world
通知檢視日誌時間戳資訊:
~$ docker logs -t a7ab05b236b862f22c5356c 2019-06-13T13:18:06.957596996Z hello world 2019-06-13T13:18:09.042404246Z hello world 2019-06-13T13:18:11.043577253Z hello world 2019-06-13T13:18:13.044648977Z hello world 2019-06-13T13:18:15.045652444Z hello world 2019-06-13T13:18:17.046743917Z hello world檢視最後3行日誌:
$ docker logs --tail 3 62d5c4208bd1a5017 hello world hello world hello world
8 主機與容器間的檔案拷貝
有時候,我們需要將容器中的檔案拷貝到主機內,這一操作可以通過docker cp命令。我們先進入容器,並在/tmp目錄下建立一個abc檔案。
$ docker attach 90999d16c0e8 root@90999d16c0e8:/# cd /tmp root@90999d16c0e8:/tmp# touch abc root@90999d16c0e8:/tmp# ll total 8 drwxrwxrwt 1 root root 4096 Jun 13 14:01 ./ drwxr-xr-x 1 root root 4096 Jun 13 13:40 ../ -rw-r--r-- 1 root root 0 Jun 13 14:01 abc root@90999d16c0e8:/tmp#
然後回到主機,將剛才的abc檔案拷貝到主機當前使用者目錄下的download目錄中:
$ docker cp 90999d16c0e8:/tmp/abc ~/download/
檢視一下,確實在download目錄下找到了拷貝過來的檔案:
~$ cd download/ ~/download$ ll drwxrwxr-x 4 chb chb 4096 Jun 13 22:05 ./ drwxr-xr-x 15 chb chb 4096 Jun 13 20:50 ../ -rw-r--r-- 1 chb chb 0 Jun 13 22:01 abc
從主機拷貝檔案到容器。同樣的,我們先在宿主機的當前使用者目錄下的download目錄下建立一個123檔案,然後將這個檔案拷貝到容器/tmp目錄中:
$ touch 123 $ docker cp ~/download/123 90999d16c0e8:/tmp/ $ docker attch 90999d16c0e8 $ docker attach 90999d16c0e8 root@90999d16c0e8:/tmp# ll total 8 drwxrwxrwt 1 root root 4096 Jun 13 14:55 ./ drwxr-xr-x 1 root root 4096 Jun 13 13:40 ../ -rw-rw-r-- 1 1000 1000 0 Jun 13 14:54 123 -rw-r--r-- 1 root root 0 Jun 13 14:01 abc
9 匯入和匯出容器
在有些情況下,我們需要將容器從一臺主機遷移到另一臺主機,此時就需要用到容器的匯入和到處功能。
9.1 匯出容器
匯出容器的命令為 docker export ,具體命令格式如下:
docker export [OPTIONS] CONTAINER
OPTIONS可選引數:
-o : 指定匯出的tar檔名
$ docker export -o mycontainer.tar fd4af8e0b8b3 $ ll total 70656 drwxrwxr-x 2 chb chb 4096 Jun 18 07:55 ./ drwxr-xr-x 18 chb chb 4096 Jun 18 07:51 ../ -rw------- 1 chb chb 72333824 Jun 18 07:55 mycontainer.tar
這個mycontainer.tar檔案就是我們容器匯出的打包檔案,將其拷貝到其他主機上進行匯入即可。
另外docker export也可以通過重定向來實現匯出容器:
$ docker export fd4af8e0b8b3 > mycontainer2.tar
效果和-o引數時一樣的。
9.2 匯入容器
在上一小節中docker export匯出的檔案是容器的一個快照,我們可以使用docker import來匯入為一個映象。docker import 命令格式如下:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
OPTIONS有兩個引數:
-c : 在匯入的同時執行對容器進行修改 的dockerfile指令。
-m : 為匯入的容器新增commit資訊。
將上一節上匯出的mycontainer.tar匯出為名為myubuntu:v1.0的映象:
$ docker import mycontainer.tar test/ununtu:v1.0 sha256:623d9d0fa52b924579a6223a001951fb3b162917b410fb66f7a429e009b5fc56 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/ununtu v1.0 623d9d0fa52b 7 seconds ago 69.9MB
10 總結
本篇主要介紹docker容器的主要操作,基本囊括了大部分的日常用法,對於埠對映等內容,在後續博文中再行展開。
&nbs