4.1docker基礎詳細版--1.docker初識

什麼是docker


docker是一個容器引擎,提供了一整套完整的容器解決方案。它是在2014年最火熱的開源項目,基於Apache2.0開原協議,由Go語言開發。

什麼是容器

容器其實歷史比較久遠,Linux上的LXC、Solaris上的Zones等都是容器的不同實現方式。

容器實質上是一個運行在宿主機上的進程。只不過在這個進程啓動之前進行了一些處理,讓進程進入了一個全新的虛擬環境,與宿主機的環境分離。所以這個進程認爲自身處於一個獨立的運行世界中。

一個簡單的例子是:在容器中創建的文件在宿主機上是看不到的。

容器的優勢

  • 容器創建、刪除速度快
  • 容器在運行期間佔用的開銷比較小,在一個宿主機上,容器運行的數量可以很多

docker的優勢

  • 容器管理很方便

安裝docker-ce


在2017年docker將docker版本分爲了 CE 和 EE 版本,EE 就是企業版本,CE 就是社區版本。

前提條件

docker已經可以運行在多種操作系統上甚至windows上,這裏我採用centos7.3來安裝。docker對操作系統要求如下:
- 內核版本大於3.10:可通過uname -r查看
- 系統是64位:可通過uname -i查看

yum安裝依賴包

添加docker官方源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

更新yum索引

yum makecache fast

安裝docker-ce

在配置好yum源後可直接使用yum命令進行安裝:

yum install -y docker-ce

啓動docker

安裝好後啓動docker:

systemctl docker start

然後可以運行下面的命令檢查docker的版本:

docker version

這裏寫圖片描述

其中幾個比較重要的點:Server Version爲當前版本,Storage Driver爲存儲驅動,Docker Root Dir爲docker工作目錄,Registry爲默認下載鏡像的地址

卸載docker

yum remove docker-ce
rm -rf /var/lib/docker

docker啓動和停止

docker和其他服務一樣,可以通過service命令來控制啓動和停止:

'''啓動'''
systemctl docker start

'''停止'''
systemctl docker stop

'''查看狀態'''
systemctl docker status

'''重啓'''
systemctl docker restart

docker架構


docker是一個典型的C/S架構:

docker server

這是一個守護進程,一直運行在後臺,其中內嵌有一個web server

docker client

他是一個命令行工具,通過http協議與docker server進行交互

docker server和docker cliebt公用一個可執行文件,通過命令which docker就可以找到。

docker鏡像


什麼是docker鏡像

簡單說,Docker鏡像是一個不包含Linux內核而又精簡的Linux操作系統。

docker可以理解爲一個目錄:docker server在啓動容器的時候,先根據這個鏡像目錄複製出一個目錄,然後在容器進程啓動的時候,讓這個進程chroot到這個目錄下,這樣這個目錄就成了這個容器的根文件系統。

查看docker鏡像

通過下面的命令可以查看本地有哪些docker鏡像

docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/httpd             latest              2e202f453940        6 weeks ago         179 MB
docker.io/centos            latest              ff426288ea90        2 months ago        207 MB
docker.io/hello-world       latest              f2a91732366c        3 months ago        1.85 kB
docker.io/training/webapp   latest              6fae60ef3446        2 years ago         349 MB
  • IMAGE ID:鏡像ID,長度爲64位,通常用前12位表示就可以了
  • TAG:每個鏡像可以打上多個TAG
  • REPOSITORY:本地鏡像存儲的倉庫(剛裝完的docker是空的)

REPOSITORY和TAG可以唯一標識一個鏡像

鏡像從哪裏來

Docker Hub是由Docker公司負責維護的公共註冊中心,包含大量的容器鏡像,Docker工具默認從這個公共鏡像庫下載鏡像。
https://hub.docker.com/explore

默認是國外的源,下載會慢,建議配置國內鏡像倉庫:

# vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}

修改完成後需要重啓docker

docker容器


運行容器

運行容器可以使用docker run命令,常用選項包括:

-i -t:這兩個選項經常一起用,縮寫爲 -it, 用於創建交互式容器
-d:讓容器運行在後臺,用於創建守護式容器
--name:爲容器指定名稱

運行交互式容器

現在我的本地鏡像如下:

# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/httpd             latest              2e202f453940        6 weeks ago         179 MB
docker.io/centos            latest              ff426288ea90        2 months ago        207 MB
docker.io/hello-world       latest              f2a91732366c        3 months ago        1.85 kB
docker.io/training/webapp   latest              6fae60ef3446        2 years ago         349 MB

現在我通過docker.io/centos這個鏡像創建一個交互式容器,命令如下:

docker run -it centos:latest /bin/bash

-it:指定創建交互式容器
centos:latest:以倉庫:TAG的方式指定鏡像名稱
/bin/bash:容器對應的進程,會啓動一個新的shell

通過上邊的命令,啓動了一個新的shell,這個shell是運行在容器環境中的。此時,我們離開了原本的shell,此後我們執行的shell命令都會在虛擬環境中。當我們執行exit就結束了了這個虛擬shell,從而結束了整個容器。

[root@193cbc5e0dbe /]# ls

anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

可以看到,在執行了docker run之後產生了一個新的shell,此時的命令提示符前的目錄變成了193cbc5e0dbe。當運行這個命令時鏡像不存在,則docker會自動從官方鏡像倉庫拉取鏡像並生成容器。

運行守護式容器

交互式容器適合一些臨時的任務。大多數情況下,希望創建守護式容器,即長期運行提供服務。方法如下:

docker run -d redis

這裏創建一個redis的容器,但是我本地沒有redis鏡像,所以會從官方拉取鏡像並創建容器。

這裏,只提供了鏡像名稱而沒有提供TAG,則會使用默認TAG “latest”,同樣的沒有指定命令,則會使用鏡像提供的默認命令。redis鏡像的默認命令是:/entrypoint.sh redis-server

守護式容器運行在後臺,而shell還是宿主機的shell,這樣就可以進行其他工作而不受容器的影響。

恢復守護式容器

守護式容器運行在後臺,需要恢復守護式容器到前臺可以使用下面的命令:

docker attach a44303d15bfa

a44303d15bfa是容器的id,也可以是容器的NAME。

查看容器的基本信息

通過下面的命令可以查看容器的基本信息:

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f9cb9fe5a189        redis               "docker-entrypoint..."   4 minutes ago       Up 4 minutes        6379/tcp            brave_mccarthy

可以看到容器的ID、使用的鏡像、狀態等信息

這裏看不到之前交互式容器的信息,因爲退出了,ps在不帶有參數的時候只顯示正在運行的容器。但是可以添加-a選項查看到:

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
f9cb9fe5a189        redis               "docker-entrypoint..."   4 minutes ago       Up 4 minutes               6379/tcp            brave_mccarthy
193cbc5e0dbe        centos:latest       "/bin/bash"              17 minutes ago      Exited (0) 8 minutes ago                       clever_roentgen

可以看到交互式容器的狀態爲退出。

查看容器詳細信息

docker ps命令只能查看到一些基本的內容,想要知道更詳細的信息比如:ip、端口等,就需要如下命令:

docker inspect f9cb9fe5a189

其中f9cb9fe5a189是容器的ID。這個命令返回一個json格式的數據,十分詳細。有時二次開發需要這個信息。

如果說只想要獲取IP地址的話,可以添加如下參數:

docker inspect -f '{{.NetworkSettings.IPAddress}}' f9cb9fe5a189

{{.NetworkSettings.IPAddress}}可以理解爲NetworkSettings下的IPAddress字段

停止守護式容器

停止守護式容器可以使用下面的命令:

docker stop f9cb

f9cb是容器ID的縮寫,這樣也是可以的,此時使用docker ps就看不到這個容器了。

也可以使用:

docker kill f9cb

stop和kill的區別是:stop是發送信號到容器,等待容器停止,而kill是直接殺死容器進程。

刪除容器

停止容器並不會刪除容器,刪除容器可以使用如下的方式:

docker rm f9cb9

f9cb9是容器ID的縮寫,這樣在docker ps -a中就看不到這個容器了,它被刪除了。

創建容器時指定名稱

創建容器時會默認分配一個比CONTAINER ID更友好的名字,這個字段叫NAMES,可以通過下面的命令來控制容器的名字:

docker run --name test_hello -it centos echo "123"

此時,通過docker ps -a查看,這個容器的名字是我們自己定義的:
這裏寫圖片描述

重新啓動已經停止的容器

可以通過start參數讓已經停止的容器恢復運行:

docker start  -i test_hello

這樣就不用爲運行一個命令每次創建一個新的容器。這裏也可以指定容器的id

容器日誌

docker logs [-f][-t][--tail]
-f:是否跟蹤日誌變化,默認爲false
-t:是否加上時間戳,默認爲false
--tail:返回後幾行日誌,默認爲all

如果不指定選項,則返回所有的日誌。

這裏寫圖片描述

首先創建一個守護式容器,然後不指定參數查看log,則返回所有的日誌。

這裏寫圖片描述

加上-t選項,日誌加上了時間

這裏寫圖片描述

加上-f選項,可以看到日誌的動態更新。

這裏寫圖片描述

加上–tail選項,指定顯示最新的N條

查看容器內的進程

docekr top b77a4ee19c4b

指定容器id或name

這裏寫圖片描述

在運行的容器中啓動新的進程

docker exec [-d][-i][-t] 容器名 命令 參數
docker exec -it b77a4ee19c4b /bin/bash

這裏寫圖片描述

可以看到進入了新的bash進程,按CTRL+P CTRL+Q讓當前容器轉入後臺運行,然後查看進程:
這裏寫圖片描述

可以看到在容器中啓動了一個新的進程。

本文轉自:這裏

發佈了13 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章