Docker 鏡像和容器管理

20分鐘時間,大家可以快速掌握Docker相關知識,首先得了解幾個概念。其實Docker和我們之前接觸的Virtual Box、VMWare、QEMU類似,只是Docker是簡單的進程級隔離管理方法。其中包括容器及鏡像兩個常用的概念,可以認爲docker就是一個管理平臺,container就是一個虛擬機,鏡像是一個當前虛擬機的快照,container裏面可以跑操作系統。多個容器裏面可以用同一個鏡像生成。這麼類比的話,大家可能更容易理解一點。下面簡單基於Mac上的docker簡單介紹一下相關的命令,其他系統命令都一樣。

1. 先在mac上安裝docker,用命令行安裝即可,很簡單:

brew cask install docker

會提示你輸入密碼,如果你之前安裝過要重新安裝,可以用:

brew cask reinstall docker

安裝好之後會在你Mac的啓動臺有個圖標,點擊啓動之後才能命令行裏使用docker相關命令,不然命令行提示找不到。或者啓動服務:

systemctl start docker.service

2. 拉取Centos鏡像

這裏我們拉centos7.5.1804作爲例子,你可以修改冒號後的版本號拉去你想要的版本

docker pull <System Name>:<Version Number>

這裏要注意一下,拉去鏡像的時候可能拉不到,這是因爲被強了,你得搞個外網的proxy。

拉取的信息輸出:

(base) ➜  ~ docker pull centos:7.5.1804
7.5.1804: Pulling from library/centos
5ad559c5ae16: Pull complete
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:7.5.1804
docker.io/library/centos:7.5.1804

3. 查看拉取得鏡像

docker images

輸出結果如下,記着我們的IMAGE ID

(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.5.1804            cf49811e3cdb        6 months ago        200MB

4. 加載鏡像到docker

docker run -it <Image ID> /bin/bash

cf498是IMAGE ID的前5位,這裏只需要輸入能區分其他IMAGE的前幾位就可以了。不需要全部輸入。

之後你就登陸到docker上了,這個時候,會同時創建一個docker容器,就是Container。

讓我來查看下centos上的版本信息是否和我們拉取的一致吧。

登錄信息如下,root後面@的部分就是你的Container ID(容器ID)

(base) ➜  ~ docker run -it cf498 /bin/bash
[root@58ed746e59f8 /]#

5. 查看版本信息

查看版本信息如下:

[root@58ed746e59f8 /]# cat /proc/version
Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) ) #1 SMP Tue Jul 2 22:58:16 UTC 2019
[root@58ed746e59f8 /]# uname -a
Linux 58ed746e59f8 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@58ed746e59f8 /]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

6. 退出容器

可以用Ctrl+d或者在docker命令行輸入exit,即可退出容器,但是對於attach登上來的,可能會停止容器。如果想退出時,容器依然在,可以用Ctrl+p+q。

7. 查看當前容器的狀態

 docker ps -a

(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
58ed746e59f8        cf498               "/bin/bash"         12 minutes ago      Exited (0) About a minute ago                       clever_kepler

這裏容器status 已經變成退出了。

8. 再次進入容器

建議用exec,不要用attach,用attach進入的話,退出用Ctrl+D或者exit命令會終止容器,但是用exec登錄就不會停止容器。

docker exec -it <Container ID> /bin/bash
docker attach <Container ID>

當容器退出的時候,你再次用exec或者attach進入容器就會報錯。

base) ➜  ~ docker exec -it 58ed746e59f8 /bin/bash
Error response from daemon: Container 58ed746e59f890c3f0c431e5cc253e1af3aa58bf6d88e9ebe345177d2723b0e0 is not running

(base) ➜  ~ docker attach 58ed746e59f8
You cannot attach to a stopped container, start it first

這個時候有兩種方,第一種方法,採用第四步的加載鏡像,但是這個時候會重新創建一個容器,這並不是我們想要的

(base) ➜  ~ docker run -it cf498 /bin/bash
[root@3336e7dba13c /]# exit
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         52 seconds ago      Exited (0) 6 seconds ago                       flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         20 minutes ago      Exited (0) 9 minutes ago                       clever_kepler

第二種方法start之前的container,然後再exec上去。

9. 重啓container

docker start <Container ID>

(base) ➜  ~ docker start 3336e7dba13c
3336e7dba13c
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         4 minutes ago       Up 4 seconds                                    flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         24 minutes ago      Exited (0) 13 minutes ago                       clever_kepler

再用docker exec就可以登錄激活狀態的container了。

(base) ➜  ~ docker exec -it 3336e7dba13c /bin/bash
[root@3336e7dba13c /]# exit
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         6 minutes ago       Up 2 minutes                                    flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         26 minutes ago      Exited (0) 15 minutes ago                       clever_kepler

再次從container裏面退出,之前的docker也一直處於活躍狀態。那這個時候想停掉活躍的container,怎麼辦呢?可以用stop命令。

10. 停止container

docker stop <Container ID>

停止鏡像需要一會時間,大家耐心等一下。結果如下:

(base) ➜  ~   docker stop 3336e7dba13c
3336e7dba13c
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         9 minutes ago       Exited (137) 48 seconds ago                       flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         29 minutes ago      Exited (0) 19 minutes ago

11. 保存容器內容爲鏡像

docker commit <Container ID>

我們先啓動3336e7dba13c這個容器,然後做一個鏡像

(base) ➜  ~ docker commit 3336e7dba13c
sha256:3b7a68bf880b0a7ca2c2459a37ff5562efbb2540ea7939d446a32a5acdef937e
(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              3b7a68bf880b        6 seconds ago       200MB
centos              7.5.1804            cf49811e3cdb        6 months ago        200MB

我們發現新的IMAGE被打好了,但是REPOSITORY和TAG是none,這讓我們後面很難區分,這個時候,可以用tag來標記docker鏡像。

docker tag <Image ID> <New Tag Name>

其中ID就是對應的IMAGEID, 後面centos1是對應的REPOSITORY的名字。

(base) ➜  ~ docker tag 3b7a68bf880b centos1
(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos1             latest              3b7a68bf880b        About a minute ago   200MB
centos              7.5.1804            cf49811e3cdb        6 months ago         200MB

12. 刪除容器

docker rm <Container ID>

這裏要注意不能刪除正在活躍的容器,不然會報錯

(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         19 minutes ago      Up 5 minutes                                    flamboyant_lewin
58ed746e59f8        cf498               "/bin/bash"         39 minutes ago      Exited (0) 28 minutes ago                       clever_kepler
(base) ➜  ~ docker rm 3336e7dba13c
Error response from daemon: You cannot remove a running container 3336e7dba13c58df693233bcea09a05b28d311dc6e3fbd8f66eed1e894aae9e2. Stop the container before attempting removal or force remove

我們可以嘗試刪除之前那個停掉的容器58ed746e59f8,或者用stop容器3336e7dba13c停掉之後再刪除。

(base) ➜  ~ docker rm 58ed746e59f8
58ed746e59f8
(base) ➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3336e7dba13c        cf498               "/bin/bash"         23 minutes ago      Up 9 minutes                            flamboyant_lewin

發現刪完了之後,就剩下那個活躍的容器了

13 刪除鏡像

docker rmi <Image ID>

我們嘗試刪除剛上面生成的鏡像:3b7a68bf880b

(base) ➜  ~ docker rmi 3b7a68bf880b
Untagged: centos1:latest
Deleted: sha256:3b7a68bf880b0a7ca2c2459a37ff5562efbb2540ea7939d446a32a5acdef937e
(base) ➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.5.1804            cf49811e3cdb        6 months ago        200MB

 

到此docker基本命令已經講完了,是不是覺得很簡單。

 

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