Docker掃盲之容器與映象的基本使用

fallinjava發表於2019-03-21

環境

OS:CentOS Linux release 7.6.1810 (Core)

Docker版本:Docker version 1.13.1, build 07f3374/1.13.1

參考文獻

docs.docker-cn.com/get-started…

介紹

先提三個問,docker是什麼?docker能幫我們解決什麼問題?為什麼要使用docker?本文將快速帶領你走進容器的世界。

  1. docker是什麼? 官方解釋:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面

    個人大白話:或許你現在還沒有用過docker,但是你可能用過虛擬機器吧?docker和虛擬機器的差別在哪兒呢?首先第一個,虛擬機器給人的第一映像就是大和重,想要部署一個環境到虛擬機器上面,就必須安裝一個作業系統才能做相關的操作,其次就是你不管安裝什麼你都得安裝一個作業系統才能執行。但是現在docker的出現就解決了這個問題,為什麼docker就解決了這個問題呢?其實docker就是將這個軟體所需要的作業系統或者相關環境給精簡了,去除了所有你用不到的東西,只留下軟體最基本的依賴,這些依賴會一層依賴一層,這就會讓一個docker的映象非常小,比起整個作業系統輕便了非常多,而且最主要的是可以將你的環境打包成一個映象釋出到dockerhub等地方,然後你就在各個流行的linux上面直接將映象下載下來就可以直接使用了,可以說就是一次部署,到處使用。

  2. docker能幫我們解決什麼問題? 眾所周知,每次我們的專案程式碼編寫完成過後,會將程式碼釋出到伺服器上,但是伺服器必須要安裝一系列我們需要的工具或者依賴包,亦或者是一些依賴的軟體,這個時候釋出專案的時間成本就太高了,如果碰到不熟悉的工作人員,這個時間可能會拉的更長,但是有了docker就不一樣了,我們只需要簡單的會docker,會一些基礎的image和container相關的命令,就能完成這項工作,而且在很多太伺服器的時候,也只需要一個docker就能幫我們完成部署。

  3. 為什麼要使用docker? 可能你在想我都有一個Linux系統了還要docker來幹嘛?但是你有沒有想過當你係統的環境需要遷移的時候,比如說你們需要叢集,或者需要搭建測試伺服器這些等等等等,你就需要花大量的時間來搭建環境,然後下載一些相應的包,但是這中間很有可能出現各種各樣的坑,這些都是無法避免的,但是docker就是一個容器,它不管在那個環境上面執行,它都依賴於自己的容器,而不會去依賴裝載容器的系統,這也就避免了因為系統的原因導致安裝的步驟都不一樣。

docker hello world

還是以程式設計師的靈魂hello world來作為例子,然後快速進入docker的世界,可以使用docker run 映象名來啟動一個映象,當這個映象在本地不存在時,那麼docker會到docker倉庫去獲取這個映象。 執行命令

docker run hello-world
複製程式碼

響應結果

[root@localhost ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for docker.io/hello-world:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[root@localhost ~]#
複製程式碼

docker的基本使用

檢視映象

上面我們已經執行了一個hello-word,那麼我們來看一下執行了hello-world我們會生成那些東西?首先第一個是映象,也是最重要的一個。執行以下命令可以檢視容器中的所有映象 執行命令

docker images
複製程式碼

響應結果

[root@localhost ~]# docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world               latest              fce289e99eb9        2 months ago        1.84 kB
[root@localhost ~]# 
複製程式碼

從上面的響應資訊可以看到我們已經有了一個映象 docker.io/hello-world,分析一下這個映象的欄位吧

  1. REPOSITORY:這個是映象所在的倉庫,可以理解一種型別的資料,比如牙膏。
  2. TAG:倉庫的標籤,這裡的latest是對倉庫裡面的型別進行標記,可以理解成是牙膏裡面的中華牙膏這個標記(其實就是版本),當沒有指定標籤時,那麼這個latest就是預設的標籤,一個倉庫可以打多個標籤,每個標籤和倉庫組成一組你想要的資料,當你需要獲取指定標籤的時候只需要這樣寫docker run hello-world:latest
  3. IMAGE ID:這個映象的id,也是唯一的id,比如你每次打個標籤它的值都會變,我們啟動的時候也可以使用docker run fce289e99eb9 來啟動。
  4. CREATED:這裡是代表這個映象的建立時間距離現在已經過去了多久。
  5. SIZE:顧名思義,這就是這個映象的大小。

檢視容器

這裡我們來看下由hello-world生成的容器是什麼樣的 執行命令

docker ps  -a
複製程式碼

響應結果

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                      PORTS               NAMES
e91d9159c248        hello-world                     "/hello"                 2 hours ago         Exited (0) 2 hours ago                          adoring_mestorf
[root@localhost ~]# 
複製程式碼

分析欄位

  1. CONTAINER ID:容器id
  2. IMAGE:容器所屬的映象
  3. COMMAND:啟動時的預設執行命令,這裡的命令時hello的原因時因為映象的基礎映象在生成的時候指定的,因為我們時從伺服器上面拿下來的。
  4. CREATED:容器建立的時間距離下限的時間
  5. STATUS:這個容器現在的狀態,可以看到容器現在已經時退出了
  6. PORTS:這個容器啟動的時候對映在本機上面的埠,由於我們沒有設定就沒有值,可以通過 -p 宿主機埠:容器埠 來設定
  7. NAMES:容器的名字,可以通過--name 容器名 來設定

啟動容器

我們可以通過docker start 容器id 來啟動一個容器 執行命令:

docker start 你的容器id
複製程式碼

但是可以看到我們的容器時什麼都沒有輸出,這是為什麼呢?剛開始不是輸出來hello world嗎?因為在docker裡面容器啟動的時候只會輸出啟動的id,想要看詳細資訊只有進入容器檢視,可以使用docker ps命令來檢視執行的容器, 但是我們執行docker ps為什麼也沒有任何資訊?這是因為我們沒有後臺執行,必須要在執行(執行run的時候)容器的時候加上-d 引數。

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# 
複製程式碼

搜尋映象

由於我們的hello-world的例子並不支援後臺,我們可以重新獲取一個映象來執行,我們可以先執行docker search 映象名來查詢你想要的映象, 我們這裡來下載一個Centos的映象 執行命令

docker search centos
複製程式碼

響應結果

[root@localhost ~]# docker search centos
INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                             The official build of CentOS.                   5261      [OK]       
docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              121                  [OK]
docker.io   docker.io/jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x...   109                  [OK]
docker.io   docker.io/consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   83                   [OK]
docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              52                   [OK]
docker.io   docker.io/centos/mysql-57-centos7            MySQL 5.7 SQL database server                   49                   
docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      44                   
docker.io   docker.io/gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glu...   40                   [OK]
docker.io   docker.io/openshift/base-centos7             A Centos7 derived base image for Source-To...   39                   
docker.io   docker.io/centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relationa...   37                   
docker.io   docker.io/kinogmt/centos-ssh                 CentOS with SSH                                 26                   [OK]
docker.io   docker.io/centos/httpd-24-centos7            Platform for running Apache httpd 2.4 or b...   22                   
docker.io   docker.io/centos/php-56-centos7              Platform for building and running PHP 5.6 ...   20                   
docker.io   docker.io/openshift/jenkins-2-centos7        A Centos7 based Jenkins v2.x image for use...   20                   
docker.io   docker.io/pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag nam...   10                   
docker.io   docker.io/openshift/wildfly-101-centos7      A Centos7 based WildFly v10.1 image for us...   6                    
docker.io   docker.io/openshift/jenkins-1-centos7        DEPRECATED: A Centos7 based Jenkins v1.x i...   4                    
docker.io   docker.io/darksheer/centos                   Base Centos Image -- Updated hourly             3                    [OK]
docker.io   docker.io/pivotaldata/centos                 Base centos, freshened up a little with a ...   2                    
docker.io   docker.io/pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile...   2                    
docker.io   docker.io/blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                    [OK]
docker.io   docker.io/openshift/wildfly-81-centos7       A Centos7 based WildFly v8.1 image for use...   1                    
docker.io   docker.io/pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated ...   1                    
docker.io   docker.io/jameseckersall/sonarr-centos       Sonarr on CentOS 7                              0                    [OK]
docker.io   docker.io/smartentry/centos                  centos with smartentry                          0                    [OK]
[root@localhost ~]#
複製程式碼
  1. INDEX:這個映象的索引
  2. NAME:映象名稱
  3. DESCRIPTION:映象描述
  4. STARS:這個映象有多少個人在使用,可以更具這個數量來選取自己需要的映象
  5. OFFICIAL:是否是官方釋出的映象
  6. AUTOMATED:是否支援自動化

獲取映象

上面我們已經使用docker search centos來搜尋到了很多的驚醒,現在我們來使用docker pull 映象名來獲取映象吧 執行命令

docker pull docker.io/centos
複製程式碼

響應結果

[root@localhost ~]# docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
8ba884070f61: Pull complete 
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for docker.io/centos:latest
[root@localhost ~]#
複製程式碼

可以從響應結果來看到我們的驚喜那個已經成功的獲取下來了,執行docker images來檢視我們的映象 執行命令

docker images
複製程式碼

響應結果

[root@localhost ~]# docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos                    latest              9f38484d220f        6 days ago          202 MB
docker.io/hello-world               latest              fce289e99eb9        2 months ago        1.84 kB
[root@localhost ~]#
複製程式碼

從上面的響應結果我們可以看到我們多了一個centos的映象,現在來啟動這個映象吧,使用docker run 映象名來啟動映象 執行命令

docker run -d -ti --name docker.io/centos /bin/bash
複製程式碼

引數描述

  1. -d:讓啟動的這個容器以後臺方式執行
  2. -ti:可以讓容器接受和控制檯互動還有可以在控制檯輸出資訊
  3. /bin/bash:讓容器啟動時執行該命令

帶上引數的原因是Docker中系統映象的預設命令是 bash,如果不加 -ti bash 命令執行了自動會退出。這是因為如果沒有銜接輸入流,本身就會馬上結束。加-ti 後docker命令會為容器分配一個偽終端,並接管其stdin/stdout支援互動操作,這時候bash命令不會自動退出。

響應結果

[root@localhost ~]# docker run -d -ti docker.io/centos /bin/bash
9687356aaf8e8b7ce24be22af28c6d6b1d9bc130c34e0211f6da05fc7a244d2b
複製程式碼

現在容器已經啟動起來了,我們可以上面學習的docker ps -a命令來檢視所有的容器 執行命令

docker ps -a
複製程式碼

響應結果

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                      PORTS               NAMES
9687356aaf8e        docker.io/centos                "/bin/bash"              2 minutes ago       Up 2 minutes                                    youthful_mccarthy
e91d9159c248        hello-world                     "/hello"                 2 hours ago         Exited (0) 36 minutes ago                       adoring_mestorf
[root@localhost ~]#
複製程式碼

從上面可以看到已經有兩個執行中的容器了,由於我們剛才啟動容器的時候使用來一些額外的引數,現在我們在來看是否有一個執行中的容器。 執行命令

 docker ps
複製程式碼

響應結果

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9687356aaf8e        docker.io/centos    "/bin/bash"         5 minutes ago       Up 5 minutes                            youthful_mccarthy
[root@localhost ~]# 
複製程式碼

可以從響應結果裡面看到我們的容器已經在執行了

進入容器

容器是啟動了,但是我們沒法操作呀,這裡介紹一下怎麼進入容器,可以使用該命令進入容器docker exec -ti 容器id bash 執行命令

docker exec -ti 9687356aaf8e bash
複製程式碼

響應結果

[root@localhost ~]# docker exec -ti 9687356aaf8e bash
[root@9687356aaf8e /]# 
複製程式碼

可以從響應結果來看我們登陸的伺服器id變成來容器id,也就是所我們進入了容器了,現在你就可以在容器裡面做你想要做的事了

退出容器

我們現在已經在容器裡面了,但是想要退出出來怎麼辦呢?可以執行exit命令來退出,還可以按鍵盤上的ctrl + p + q來退出,這兩種退出方式都不會讓容器停止

停止容器

我們現在已經成功的啟動了一個容器了,現在介紹一下如何停止一個容器,可以使用命令docker stop 容器id來停止容器 執行命令

docker stop 9687356aaf8e
複製程式碼

響應結果

[root@localhost ~]# docker stop 9687356aaf8e
9687356aaf8e
[root@localhost ~]# 
複製程式碼

可以看到停止容器時會返回一個容器的id

刪除容器

當容器過多或者容器無用的時候我們就需要將容器刪除,使用以下命令可以刪除一個容器docker rm 你的容器id 執行命令

docker rm 9687356aaf8e
複製程式碼

響應結果

[root@localhost ~]# docker rm 9687356aaf8e
9687356aaf8e
[root@localhost ~]#
複製程式碼

可以看到還是返回了一個被刪除的容器id,我們執行以下docker ps -a 來看下容器到底有沒有被刪除掉(想要刪除容器必須讓容器先停止) 執行命令

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                      PORTS               NAMES
e91d9159c248        hello-world                     "/hello"                 3 hours ago         Exited (0) 52 minutes ago                       adoring_mestorf
[root@localhost ~]# 
複製程式碼

刪除映象

當我們生成來無用映象的時候就需要將這個映象刪除掉,但是需要注意的是,刪除映象的時候這個映象不能有容器,也就是說必須要先將容器刪除掉才行,可以執行docker rmi 映象id來刪除一個映象 執行命令

docker rmi 9f38484d220f
複製程式碼

響應結果

[root@localhost ~]# docker rmi 9f38484d220f
Untagged: docker.io/centos:latest
Untagged: docker.io/centos@sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Deleted: sha256:9f38484d220fa527b1fb19747638497179500a1bed8bf0498eb788229229e6e1
Deleted: sha256:d69483a6face4499acb974449d1303591fcbb5cdce5420f36f8a6607bda11854
[root@localhost ~]#
複製程式碼

可以看到這裡是返回了多個資訊,因為開頭我們就介紹了映象是一層一層的相互繼承的,想要刪除這個映象必須一層一層的刪除,所以這裡會有多個刪除記錄。

相關文章