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:保持標准輸入打開

(3)重啟容器
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(必須是大寫模式下):容器不停止退出。
(2)停止容器
$ 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容器的主要操作,基本囊括了大部分的日常用法,對於端口映射等內容,在后續博文中再行展開。

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM