Docker專題(四)-Docker容器從出生到死亡

1.容器概念

容器(Container)——鏡像運行時的實體

一個鏡像運行起來,就是容器
一個鏡像可以啓動多個容器,容器是相互隔離的,一個服務器上可以啓動多個容器,注意容器端口問題!

鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。

容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
在這裏插入圖片描述

2.Docker容器操作

2.1.查看容器

語法:

docker ps [OPTIONS]

OPTIONS說明(常用):

-a :列出當前所有正在運行的容器+歷史上運行過的
-l :顯示最近創建的容器。
-n:顯示最近n個創建的容器。
-q :靜默模式,只顯示容器編號。
–no-trunc :不截斷輸出

  • 查看正在運行容器:
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  • 查看所有的容器(啓動過的歷史容器):
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
8b3e9c904970        mysql               "docker-entrypoint..."   3 months ago        Exited (255) 4 hours ago   0.0.0.0:3306->3306/tcp, 33060/tcp   my1024_mysql
  • 查看最後一次運行的容器
[root@localhost ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
8b3e9c904970        mysql               "docker-entrypoint..."   3 months ago        Exited (255) 4 hours ago   0.0.0.0:3306->3306/tcp, 33060/tcp   my1024_mysql
  • 查看停止的容器
[root@localhost ~]# docker ps -f status=exited
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
8b3e9c904970        mysql               "docker-entrypoint..."   3 months ago        Exited (255) 4 hours ago   0.0.0.0:3306->3306/tcp, 33060/tcp   my1024_mysql

2.2.創建與啓動容器(重點)

容器是通過鏡像啓動而來的!

語法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

創建容器常用的參數說明:

-i:表示運行容器
-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。
--name :爲創建的容器命名。
-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然後共享到容器上。
-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t兩個參數,創建後就會自動進去容器)。
-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可以使用多個-p做多個端口映射

2.2.1.交互式容器(啓動並登錄進去)

使用鏡像centos:latest以交互模式啓動一個容器,在容器內執行/bin/bash命令,並取名爲mycentos

docker run -it --name=mycentos centos:7 /bin/bash

[root@localhost ~]# docker run -it --name=mycentos centos:7 /bin/bash
Unable to find image 'centos:7' locally
Trying to pull repository docker.io/library/centos ... 
7: Pulling from docker.io/library/centos
8ba884070f61: Pull complete 
Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c
Status: Downloaded newer image for docker.io/centos:7

這時我們通過ps命令查看,發現可以看到啓動的容器,狀態爲啓動狀態

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
68af7641543c        centos:7            "/bin/bash"         2 minutes ago       Up 2 minutes                            mycentos

使用exit命令 退出當前容器

[root@68af7641543c /]# exit 
exit
[root@localhost ~]# 

然後用ps -a 命令查看發現該容器也隨之停止:

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
68af7641543c        centos:7            "/bin/bash"              3 minutes ago       Exited (0) 28 seconds ago                                       mycentos
8b3e9c904970        mysql               "docker-entrypoint..."   3 months ago        Exited (255) 4 hours ago    0.0.0.0:3306->3306/tcp, 33060/tcp   my1024_mysql

2.2.2.守護式容器(先創建容器,然後登錄進去)

創建一個守護式容器:如果對於一個需要長期運行的容器來說,我們可以創建一個守護式容器。命令如下(容器名稱不能重複):

docker run -di --name=mycentos2 centos:7

[root@localhost ~]# docker run -di --name=mycentos2 centos:7
bf9248203458805ff33b997c50b89b58791ac1af21b22e2ab243a8bee2a0bf66
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
bf9248203458        centos:7            "/bin/bash"         19 seconds ago      Up 18 seconds                           mycentos2

登錄守護式容器方式:
docker exec -it container_name (或者 container_id) /bin/bash(exit退出時,容器不會停止)

[root@localhost ~]# docker exec -it mycentos2 /bin/bash
[root@bf9248203458 /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   5 root root   340 Jun 17 11:30 dev
drwxr-xr-x.   1 root root    66 Jun 17 11:30 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Mar  5 17:34 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 125 root root     0 Jun 17 11:30 proc
dr-xr-x---.   2 root root   114 Mar  5 17:36 root
drwxr-xr-x.   1 root root    21 Jun 17 11:30 run
lrwxrwxrwx.   1 root root     8 Mar  5 17:34 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Jun 10 16:40 sys
drwxrwxrwt.   7 root root   132 Mar  5 17:36 tmp
drwxr-xr-x.  13 root root   155 Mar  5 17:34 usr
drwxr-xr-x.  18 root root   238 Mar  5 17:34 var
[root@bf9248203458 /]# 

2.2.3.停止與啓動容器

  • 停止正在運行的容器:

docker stop $CONTAINER_NAME/ID

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
bf9248203458        centos:7            "/bin/bash"         4 minutes ago       Up 4 minutes                            mycentos2
[root@localhost ~]# docker stop mycentos2
mycentos2
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  • 啓動已運行過的容器:

docker start $CONTAINER_NAME/ID

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker start mycentos2
mycentos2
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
bf9248203458        centos:7            "/bin/bash"         5 minutes ago       Up 3 seconds                            mycentos2

2.2.4.重啓容器

docker restart 容器ID或者容器名

2.2.5.強制停止容器

docker kill 容器ID或者容器名

2.2.6.文件拷貝(重點)

如果我們需要將文件拷貝到容器內可以使用cp命令

docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄

[root@localhost ~]# touch 1.txt
[root@localhost ~]# docker cp 1.txt mycentos2:/root/
[root@localhost ~]# docker exec -it mycentos2 /bin/bash
[root@bf9248203458 /]# cd /root/
[root@bf9248203458 ~]# ll
total 4
-rw-r--r--. 1 root root    0 Jun 17 11:42 1.txt
-rw-------. 1 root root 3415 Mar  5 17:36 anaconda-ks.cfg

也可以將文件從容器內拷貝出來

docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄

[root@localhost ~]# docker cp mycentos2:/root/111.txt /root/
[root@localhost ~]# cd /root/
[root@localhost ~]# ll
總用量 4
-rw-r--r--. 1 root root    0 617 19:42 111.txt
-rw-r--r--. 1 root root    0 617 19:42 1.txt
-rw-------. 1 root root 1257 217 21:33 anaconda-ks.cfg

2.2.7.目錄掛載(重點)

我們可以在創建容器的時候,將宿主機的目錄容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。

創建容器 添加-v參數 後邊爲 宿主機目錄:容器目錄
docker run -di --name=mycentos2 -v /usr/local/myhtml:/usr/local/myhtml centos:7

[root@localhost myhtml]# docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml centos:7
d6e67c10f59d2169ba73436d51253a6280aac1ca47ed5223c4591a90b8e2a31e
[root@localhost myhtml]# docker exec -it mycentos3 /bin/bash
[root@d6e67c10f59d /]# cd /usr/local/
[root@d6e67c10f59d local]# ll
total 0
drwxr-xr-x. 2 root root  6 Apr 11  2018 bin
drwxr-xr-x. 2 root root  6 Apr 11  2018 etc
drwxr-xr-x. 2 root root  6 Apr 11  2018 games
drwxr-xr-x. 2 root root  6 Apr 11  2018 include
drwxr-xr-x. 2 root root  6 Apr 11  2018 lib
drwxr-xr-x. 2 root root  6 Apr 11  2018 lib64
drwxr-xr-x. 2 root root  6 Apr 11  2018 libexec
drwxr-xr-x. 2 root root  6 Jun 17 11:48 myhtml
drwxr-xr-x. 2 root root  6 Apr 11  2018 sbin
drwxr-xr-x. 5 root root 49 Mar  5 17:34 share
drwxr-xr-x. 2 root root  6 Apr 11  2018 src

如果你共享的是多級的目錄,可能會出現權限不足的提示。
在這裏插入圖片描述
這是因爲CentOS7中的安全模塊selinux把權限禁掉了,我們需要添加參數 --privileged=true 來解決掛載的目錄沒有權限的問題

docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml --privileged=true centos:7

2.2.8.查看容器IP地址

我們可以通過以下命令查看容器運行的各種數據

[root@localhost myhtml]# docker inspect mycentos3

也可以直接執行下面的命令直接輸出IP地址

[root@localhost myhtml]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3
172.17.0.2

測試宿主機連接容器

[root@localhost myhtml]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.082 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.040 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.061 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.039 ms
64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.040 ms
^C
--- 172.17.0.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6004ms
rtt min/avg/max/mdev = 0.039/0.057/0.100/0.023 ms

2.2.9.刪除容器

  • 刪除指定的容器:

docker rm $CONTAINER_ID/NAME

注意,只能刪除停止的容器

  • 刪除所有容器:

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