Docker掃盲之容器與映象的基本使用
先提三個問,docker是什麼?docker能幫我們解決什麼問題?為什麼要使用docker?本文將快速帶領你走進容器的世界。
-
docker是什麼? 官方解釋:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面
個人大白話:或許你現在還沒有用過docker,但是你可能用過虛擬機器吧?docker和虛擬機器的差別在哪兒呢?首先第一個,虛擬機器給人的第一映像就是大和重,想要部署一個環境到虛擬機器上面,就必須安裝一個作業系統才能做相關的操作,其次就是你不管安裝什麼你都得安裝一個作業系統才能執行。但是現在docker的出現就解決了這個問題,為什麼docker就解決了這個問題呢?其實docker就是將這個軟體所需要的作業系統或者相關環境給精簡了,去除了所有你用不到的東西,只留下軟體最基本的依賴,這些依賴會一層依賴一層,這就會讓一個docker的映象非常小,比起整個作業系統輕便了非常多,而且最主要的是可以將你的環境打包成一個映象釋出到dockerhub等地方,然後你就在各個流行的linux上面直接將映象下載下來就可以直接使用了,可以說就是一次部署,到處使用。
-
docker能幫我們解決什麼問題? 眾所周知,每次我們的專案程式碼編寫完成過後,會將程式碼釋出到伺服器上,但是伺服器必須要安裝一系列我們需要的工具或者依賴包,亦或者是一些依賴的軟體,這個時候釋出專案的時間成本就太高了,如果碰到不熟悉的工作人員,這個時間可能會拉的更長,但是有了docker就不一樣了,我們只需要簡單的會docker,會一些基礎的image和container相關的命令,就能完成這項工作,而且在很多太伺服器的時候,也只需要一個docker就能幫我們完成部署。
-
為什麼要使用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 REPOSITORYTAGIMAGE IDCREATEDSIZE docker.io/hello-worldlatestfce289e99eb92 months ago1.84 kB [root@localhost ~]# 複製程式碼
從上面的響應資訊可以看到我們已經有了一個映象docker.io/hello-world
,分析一下這個映象的欄位吧
docker run hello-world:latest docker run fce289e99eb9
檢視容器
這裡我們來看下由hello-world生成的容器是什麼樣的 執行命令
docker ps-a 複製程式碼
響應結果
[root@localhost ~]# docker ps -a CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES e91d9159c248hello-world"/hello"2 hours agoExited (0) 2 hours agoadoring_mestorf [root@localhost ~]# 複製程式碼
分析欄位
-p 宿主機埠:容器埠 --name 容器名
啟動容器
我們可以通過docker start 容器id
來啟動一個容器
執行命令:
docker start 你的容器id 複製程式碼
但是可以看到我們的容器時什麼都沒有輸出,這是為什麼呢?剛開始不是輸出來hello world嗎?因為在docker裡面容器啟動的時候只會輸出啟動的id,想要看詳細資訊只有進入容器檢視,可以使用docker ps
命令來檢視執行的容器, 但是我們執行docker ps為什麼也沒有任何資訊?這是因為我們沒有後臺執行,必須要在執行(執行run的時候)容器的時候加上-d
引數。
[root@localhost ~]# docker ps CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES [root@localhost ~]# 複製程式碼
搜尋映象
由於我們的hello-world的例子並不支援後臺,我們可以重新獲取一個映象來執行,我們可以先執行docker search 映象名
來查詢你想要的映象, 我們這裡來下載一個Centos的映象
執行命令
docker search centos 複製程式碼
響應結果
[root@localhost ~]# docker search centos INDEXNAMEDESCRIPTIONSTARSOFFICIALAUTOMATED docker.iodocker.io/centosThe official build of CentOS.5261[OK] docker.iodocker.io/ansible/centos7-ansibleAnsible on Centos7121[OK] docker.iodocker.io/jdeathe/centos-sshCentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x...109[OK] docker.iodocker.io/consol/centos-xfce-vncCentos container with "headless" VNC sessi...83[OK] docker.iodocker.io/imagine10255/centos6-lnmp-php56centos6-lnmp-php5652[OK] docker.iodocker.io/centos/mysql-57-centos7MySQL 5.7 SQL database server49 docker.iodocker.io/tutum/centosSimple CentOS docker image with SSH access44 docker.iodocker.io/gluster/gluster-centosOfficial GlusterFS Image [ CentOS-7 +Glu...40[OK] docker.iodocker.io/openshift/base-centos7A Centos7 derived base image for Source-To...39 docker.iodocker.io/centos/postgresql-96-centos7PostgreSQL is an advanced Object-Relationa...37 docker.iodocker.io/kinogmt/centos-sshCentOS with SSH26[OK] docker.iodocker.io/centos/httpd-24-centos7Platform for running Apache httpd 2.4 or b...22 docker.iodocker.io/centos/php-56-centos7Platform for building and running PHP 5.6 ...20 docker.iodocker.io/openshift/jenkins-2-centos7A Centos7 based Jenkins v2.x image for use...20 docker.iodocker.io/pivotaldata/centos-gpdb-devCentOS image for GPDB development. Tag nam...10 docker.iodocker.io/openshift/wildfly-101-centos7A Centos7 based WildFly v10.1 image for us...6 docker.iodocker.io/openshift/jenkins-1-centos7DEPRECATED: A Centos7 based Jenkins v1.x i...4 docker.iodocker.io/darksheer/centosBase Centos Image -- Updated hourly3[OK] docker.iodocker.io/pivotaldata/centosBase centos, freshened up a little with a ...2 docker.iodocker.io/pivotaldata/centos-mingwUsing the mingw toolchain to cross-compile...2 docker.iodocker.io/blacklabelops/centosCentOS Base Image! Built and Updates Daily!1[OK] docker.iodocker.io/openshift/wildfly-81-centos7A Centos7 based WildFly v8.1 image for use...1 docker.iodocker.io/pivotaldata/centos-gcc-toolchainCentOS with a toolchain, but unaffiliated ...1 docker.iodocker.io/jameseckersall/sonarr-centosSonarr on CentOS 70[OK] docker.iodocker.io/smartentry/centoscentos with smartentry0[OK] [root@localhost ~]# 複製程式碼
- INDEX:這個映象的索引
- NAME:映象名稱
- DESCRIPTION:映象描述
- STARS:這個映象有多少個人在使用,可以更具這個數量來選取自己需要的映象
- OFFICIAL:是否是官方釋出的映象
- 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 REPOSITORYTAGIMAGE IDCREATEDSIZE docker.io/centoslatest9f38484d220f6 days ago202 MB docker.io/hello-worldlatestfce289e99eb92 months ago1.84 kB [root@localhost ~]# 複製程式碼
從上面的響應結果我們可以看到我們多了一個centos的映象,現在來啟動這個映象吧,使用docker run 映象名
來啟動映象
執行命令
docker run -d -ti --name docker.io/centos /bin/bash 複製程式碼
引數描述
- -d:讓啟動的這個容器以後臺方式執行
- -ti:可以讓容器接受和控制檯互動還有可以在控制檯輸出資訊
- /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 IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 9687356aaf8edocker.io/centos"/bin/bash"2 minutes agoUp 2 minutesyouthful_mccarthy e91d9159c248hello-world"/hello"2 hours agoExited (0) 36 minutes agoadoring_mestorf [root@localhost ~]# 複製程式碼
從上面可以看到已經有兩個執行中的容器了,由於我們剛才啟動容器的時候使用來一些額外的引數,現在我們在來看是否有一個執行中的容器。 執行命令
docker ps 複製程式碼
響應結果
[root@localhost ~]# docker ps CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 9687356aaf8edocker.io/centos"/bin/bash"5 minutes agoUp 5 minutesyouthful_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 IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES e91d9159c248hello-world"/hello"3 hours agoExited (0) 52 minutes agoadoring_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 ~]# 複製程式碼
可以看到這裡是返回了多個資訊,因為開頭我們就介紹了映象是一層一層的相互繼承的,想要刪除這個映象必須一層一層的刪除,所以這裡會有多個刪除記錄。