什麼是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
讓當前容器轉入後臺運行,然後查看進程:
可以看到在容器中啓動了一個新的進程。
本文轉自:這裏