1. 程式人生 > >Docker基礎-容器操作

Docker基礎-容器操作

days time create 執行 4.0 spa repos contain 官方

1、創建容器

1.新建容器

  可以使用docker create命令新建一個容器。

[root@linux-node1 ~]# docker create -it ubuntu:latest 
ffc9099be315f1b94876410c7d74dcd20e311e735e638080dd477534c063a6d6
[root@linux-node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ffc9099be315        ubuntu:latest       
"/bin/bash" 8 seconds ago Created optimistic_pare [root@linux-node1 ~]#

  說明:用docker create命令創建的容器處於停止狀態,可以使用docker start命令來啟動它。

2.啟動容器

  使用docker start命令可以啟動一個停止狀態的容器。

[root@linux-node1 ~]# docker start ffc9099be315
ffc9099be315
[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ffc9099be315 ubuntu:latest "/bin/bash" About a minute ago Up 8 seconds optimistic_pare [root@linux-node1 ~]#

3.新建並啟動容器

  除了可以用start命令來啟動容器,也可以在新建的時候直接啟動容器。使用docker run命令即可

[root@linux-node1 ~]# docker run ubuntu:latest /bin/echo "Hello Docker"
Hello Docker
[root@linux-node1 ~]#

  說明:

docker run啟動容器時,docker在後臺一共做了下面這些事:
    1.檢查本地是否存在指定的鏡像,不存在就從共有倉庫下載;
    2.利用鏡像創建一個容器,並啟動該容器;
    3.分配一個文件系統給容器,並在只讀的鏡像層外面掛載一層可讀寫層;
    4.從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中;
    5.從網橋的地址池配置一個IP地址給容器;
    6.執行用戶指定的應用程序;
    7.執行完畢後,容器被終止。

  docker run -it ubuntu:latest /bin/bash 可以啟動一個bash終端,允許用戶交互:
  -t參數:讓docker分配一個偽終端綁定到標準輸出
  -i參數:讓偽終端的標準輸入保持開啟狀態,接收用戶輸入,實現交互
   用exit命令或者ctrl + d命令退出容器4.守護態運行

4.守護態運行

  很多時候我們需要讓容器在後臺以守護態(Daemonized)形式運行。此時可以通過-d參數來實現。

[root@linux-node1 ~]# docker run -d ubuntu:latest /bin/bash -c "while true;do echo hello docker;sleep 1;done"
3778a35ff4bcbf8cbd3934601e9ca2bfd33034f8a4cc69b6d76e0811c910e1e0
[root@linux-node1 ~]# 

  可以通過docker logs [ID]查看容器的輸出信息:

[root@linux-node1 ~]# docker logs 3778a
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker

2、終止容器

  可以使用docker stop命令來停止一個正在運行中的容器。命令格式為:docker stop [-t|--time[=10]] [CONTAINER...]
  執行了docker stop命令之後,docker首先會向容器發送SIGTERM信號,等待一段時間(默認10秒)後,再發送SIGKILL信號來終止容器。

[root@linux-node1 ~]# docker stop 3778a  #執行該命令後,終端會等待10秒才會有終止容器的返回信息3778a
3778a
[root@linux-node1 ~]#

  docker kill命令可以跳過SIGTERM信號,直接發送SIGKILL信號終止容器。

[root@linux-node1 ~]# docker kill ffc    #該命令執行後,馬上會返回終止容器的信息ffc
ffc
[root@linux-node1 ~]# 

3、啟動和重啟容器

  docker start命令可以啟動一個停止狀態的容器。
  docker restart命令先會停止該容器,然後重新啟動該容器。

4、進入容器

  在使用-d參數啟動容器後,容器直接運行在後臺,用戶無法看到容器中的信息,也無法進行操作。
  要進入容器有多種方法,其中最常見的是官方的attach或exec命令還有第三方的nsenter工具。

1.attach命令

  attach是docker自帶的命令,命令格式為:docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
  支持三個主要選項:

--detach-keys[=[]]        指定退出attach模式的快捷鍵序列,默認是CTRL -p CTRL -q
--no-stdin=true|false    是否關閉標準輸入,默認是保持打開
--sig-proxy=true|false    是否代理收到的系統信號給應用進程,默認為true。

  舉例如下:

[root@linux-node1 ~]# docker run -itd centos:latest 
b73595139275b9feaf077c6c537e89ecb16e19b399217b0cacc71bea164acf50
[root@linux-node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS           NAMES
b73595139275        centos:latest       "/bin/bash"         11 seconds ago      Up 9 seconds                      gifted_hypatia
[root@linux-node1 ~]# docker attach gifted_hypatia 
[root@b73595139275 /]# pwd
/
[root@b73595139275 /]# exit
exit
[root@linux-node1 ~]# 

  使用attach命令並不是很方便,當多個窗口同時用attach命令連接到同一個容器的時候,所有窗口都會同步顯示。無法獨立操作。

2.exec命令

  docker從1.3.0版本開始提供了一個更加方便的命令exec,可以直接在容器內執行任意命令。命令格式為:
  docker exec [-d|--detach] [--detach-keys=[[]]] [-i|--iteractive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
  參數說明:

-i,--iteractive=true|false    打開標準輸入接收用戶輸入的命令,默認為false
--privileged=true|false        是否給執行命令以最高權限,默認為false
-t,--tty=true|false            分配偽終端,默認為false
-u,--user=""                   執行命令的用戶名或ID

  舉例如下:

[root@linux-node1 ~]# docker run -itd centos:latest 
c50284d43c2a00e10a8f02eca97c9404bf3bccb6c9759e6196b74ad31ddb42fd
[root@linux-node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS           NAMES
c50284d43c2a        centos:latest       "/bin/bash"         3 seconds ago       Up 2 seconds                      relaxed_lamport
[root@linux-node1 ~]# docker exec -it c5028 /bin/bash
[root@c50284d43c2a /]# 

3.nsenter工具

  為了連接到docker的容器,還要先找出容器進程的PID,可以通過下面的命令獲取:

PID=`docker inspect -f "{{.State.Pid}}" c50284d43c2a`   #c50284d43c2a為容器的ID號

  為了方便使用寫了一個腳本docker-pid直接可以輸出指定容器進程的PID號:

#!/bin/bash

PID=`docker inspect -f "{{.State.Pid}}" $1`
echo $PID
#使用方法:./docker-pid 容器ID或者容器名

  舉例如下:

[root@linux-node1 ~]# docker-pid 50284d43c2a
22375
[root@linux-node1 ~]# nsenter --target 22375 --mount --uts --ipc --net --pid
[root@c50284d43c2a /]# pwd
/
[root@c50284d43c2a /]# ip a
-bash: ip: command not found
[root@c50284d43c2a /]# 

4、刪除容器

  使用docker rm命令刪除處於退出或者終止狀態的容器,命令格式為:docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
  參數說明:

-f,--force=false       是否強行終止並刪除一個正在運行中的容器
-l,--link=false        刪除容器的鏈接,但保留容器
-v,--volumes=false     刪除容器掛載的數據卷

  舉例如下:

[root@linux-node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a6f06de9d30b        ubuntu:latest       "/bin/bash"         7 seconds ago       Exited (0) 5 seconds ago                       condescending_bassi
c50284d43c2a        centos:latest       "/bin/bash"         23 minutes ago      Up 23 minutes                                  relaxed_lamport
[root@linux-node1 ~]# docker rm a6f06de9d30b
a6f06de9d30b
[root@linux-node1 ~]# 

  docker rm只能刪除退出或者終止狀態的容器,並不能刪除正在運行的容器,如果要刪除正在運行的容器需要加-f參數

[root@linux-node1 ~]# docker rm c50284d43c2a
Error response from daemon: You cannot remove a running container c50284d43c2a00e10a8f02eca97c9404bf3bccb6c9759e6196b74ad31ddb42fd. Stop the container before attempting removal or force remove
[root@linux-node1 ~]# 
[root@linux-node1 ~]# docker rm -f c50284d43c2a
c50284d43c2a
[root@linux-node1 ~]# 

5、導入和導出容器

  某些時候需要將容器從一個系統遷移到另一個容器,所以就需要將容器先導出,在新的系統導入。

1.導出容器

  導出容器是指導出一個已經創建的容器到一個文件,不管此時這個容器是否處於運行狀態,可以使用docker export命令,命令格式為
  docker export [-o|--output[=""]] CONTAINER

  參數說明:

-o,--output=""        指定打出的tar文件名,也可以直接重定向實現。

  舉例如下:

[root@linux-node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
ca0f4155f3ff        centos:latest       "/bin/bash"         2 minutes ago       Up 2 minutes                                   nostalgic_golick
2b9d24d61777        ubuntu:latest       "/bin/bash"         2 minutes ago       Exited (0) 2 seconds ago                       gallant_agnesi
[root@linux-node1 ~]# docker export -o test_for_run.tar ca0f
[root@linux-node1 ~]# ls
anaconda-ks.cfg  docker-pid  test_for_run.tar  ubuntu-14.04-x86_64-minimal.tar.gz
[root@linux-node1 ~]# docker export 2b9d > test_for_stop.tar
[root@linux-node1 ~]# ls
anaconda-ks.cfg  docker-pid  test_for_run.tar  test_for_stop.tar  ubuntu-14.04-x86_64-minimal.tar.gz
[root@linux-node1 ~]#

2.導入容器 

  導出的容器文件可以通過docker import導入變成鏡像,命令格式為:
  docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|- [RESPOSITORY[:TAG]]
  參數說明:

-c,--change=[]        在導入的同時執行對容器做出修改的Dockerfile指令。

  舉例如下:

[root@linux-node1 ~]# cat test_for_run.tar |docker import - test/ubuntu:0.2
sha256:0a3bc658748d0a73798b2db3316c56020697ed4f4407992b1327e4714b09f190
[root@linux-node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         0.2                 0a3bc658748d        7 seconds ago       197MB
test                0.1                 d751da3f9943        2 hours ago         221MB
ubuntu              16.04               20c44cd7596f        10 days ago         123MB
ubuntu              latest              20c44cd7596f        10 days ago         123MB
ubuntu              14.04               d6ed29ffda6b        10 days ago         221MB
staryjie/test       latest              d6ed29ffda6b        10 days ago         221MB
centos              latest              d123f4e55e12        3 weeks ago         197MB
[root@linux-node1 ~]#

Docker基礎-容器操作