docker入門(mén)教程-安裝及使用

安裝

官方文檔

Docker提供了以下Linux發(fā)行版和體系結(jié)構(gòu)中的.deb和.rpm軟件包:

docker linux

這里我們以centos為例(新版Docker已不支持centos 7以下的版本,所以centos 6.x 慎用):

  • 卸載舊版

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  • 設(shè)置倉(cāng)庫(kù)

    # 安裝需要的工具
    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    # 設(shè)置docker倉(cāng)庫(kù)
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
  • 安裝docker

    sudo yum install docker-ce docker-ce-cli containerd.io
    

Docker的使用

Docker技術(shù)的核心是imagecontainernetworkvolume

舊版的docker客戶(hù)端的命令一般是 docker command的方式的,新版的Docker為了更好的區(qū)分不同模塊的命令,可以支持類(lèi)似docker image ls這樣的命令(docker module command)。

Docker 鏡像(image

鏡像是創(chuàng)建容器的只讀模板

指令 描述
ls 列出鏡像
build 構(gòu)建鏡像來(lái)自Dockerfile
history 查看鏡像歷史
inspect 顯示一個(gè)或多個(gè)鏡像詳細(xì)信息
pull 從鏡像倉(cāng)庫(kù)拉取鏡像
push 推送一個(gè)鏡像到鏡像倉(cāng)庫(kù)
rm 移除一個(gè)或多個(gè)鏡像
prune 移除未使用的鏡像。沒(méi)有被標(biāo)記或被任何容器引用的。
tag 創(chuàng)建一個(gè)引用源鏡像標(biāo)記目標(biāo)鏡像
export 導(dǎo)出容器文件系統(tǒng)到tar歸檔文件
import 導(dǎo)入容器文件系統(tǒng)tar歸檔文件創(chuàng)建鏡像
save 保存一個(gè)或多個(gè)鏡像到一個(gè)tar歸檔文件
load 加載鏡像來(lái)自tar歸檔或標(biāo)準(zhǔn)輸入
[root@cloudfile ~]# docker image -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.
[root@cloudfile ~]# 

示例:拉取nginx鏡像

[root@cloudfile ~]# docker image ls #查看本地已有的鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            9.6                 6782500d4eb1        2 weeks ago         200MB
kong                latest              7a800e1cef72        3 weeks ago         185MB
[root@cloudfile ~]# docker pull nginx    # 可以省略images, 默認(rèn)拉取最新版本,指定版本可以在鏡像名后面添加版本號(hào),例如 docker pull nginx:1.14
Using default tag: latest
latest: Pulling from library/nginx
afb6ec6fdc1c: Pull complete 
b90c53a0b692: Pull complete 
11fa52a0fdc0: Pull complete 
Digest: sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
You have new mail in /var/spool/mail/root
[root@cloudfile ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            9.6                 6782500d4eb1        2 weeks ago         200MB
nginx               latest              9beeba249f3e        2 weeks ago         127MB
kong                latest              7a800e1cef72        3 weeks ago         185MB
[root@cloudfile ~]# 

Docker 容器(container

創(chuàng)建容器

Docker 使用 run+image name 命令來(lái)創(chuàng)建容器,創(chuàng)建一個(gè)容器的時(shí)候可以附加許多指令來(lái)設(shè)置很多條件

設(shè)置相關(guān)指令
指令 描述
-i, --interactive 交互式
-t, --tty 分配一個(gè)偽終端
-d, --detach 運(yùn)行容器到后臺(tái)
-a, --attach list 附加到運(yùn)行的容器
--dns list 設(shè)置DNS服務(wù)器
-e, --env list 設(shè)置環(huán)境變量
--env-file list 從文件讀取環(huán)境變量
-p, --publish list 發(fā)布容器端口到主機(jī)
-P, --publish-all 發(fā)布容器所有EXPOSE的端口到宿主機(jī)隨機(jī)端口
-h, --hostname string 設(shè)置容器主機(jī)名
--ip string 指定容器IP,只能用于自定義網(wǎng)絡(luò)
--link list 添加連接到另一個(gè)容器
--network netwokname 連接容器到一個(gè)網(wǎng)絡(luò)
--mount mount 掛載宿主機(jī)分區(qū)到容器
-v, --volume list 掛載宿主機(jī)目錄到容器
--restart string 容器退出時(shí)重啟策略,默認(rèn)no [always|on-failure]
--add-host list 添加其他主機(jī)到容器中/etc/hosts
資源限制指令
資源限制指令 描述
-m,--memory 容器可以使用的最大內(nèi)存量
--memory-swap 允許交換到磁盤(pán)的內(nèi)存量
--memory-swappiness=<0-100> 容器使用SWAP分區(qū)交換的百分比(0-100,默認(rèn)為-1)
--memory-reservation 內(nèi)存軟限制,Docker檢測(cè)主機(jī)容器爭(zhēng)用或內(nèi)存不足時(shí)所激活的軟限制,使用此選項(xiàng),值必須設(shè)置低于—memory,以使其優(yōu)先
--oom-kill-disable 當(dāng)宿主機(jī)內(nèi)存不足時(shí),內(nèi)核會(huì)殺死容器中的進(jìn)程。建議設(shè)置了-memory選項(xiàng)再禁用OOM。如果沒(méi)有設(shè)置,主機(jī)可能會(huì)耗盡內(nèi)存
--cpus 限制容器可以使用多少可用的CPU資源
--cpuset-cpus 限制容器可以使用特定的CPU
--cpu-shares 此值設(shè)置為大于或小于默認(rèn)1024值,以增加或減少容器的權(quán)重,并使其可以訪(fǎng)問(wèn)主機(jī)CPU周期的更大或更小比例
示例:創(chuàng)建一個(gè)nginx容器
docker run -tid --name dev-nginx -p 8080:80 nginx
-tid 這里使用了指令連寫(xiě)的方式,使用了t i d這三個(gè)指令 表示是交互式的、分配偽終端、運(yùn)行容器到后臺(tái),
--name 將這個(gè)容器命名為dev-nginx
-p 8080:80 是將宿主機(jī)的8080端口轉(zhuǎn)發(fā)到容器的80端口
[root@cloudfile ~]# docker ps #查看運(yùn)行中的進(jìn)程
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@cloudfile ~]# docker run -tid --name dev-nginx -p 8080:80 nginx # 創(chuàng)建dev-nginx容器
e0b8a178c45918bb9b0da9fc696690eb99cdb24db4b008381e8a2b1d959fbbf0 #docker引擎分配的容器id
[root@cloudfile ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e0b8a178c459        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 2 seconds        0.0.0.0:8080->80/tcp   dev-nginx
[root@cloudfile ~]# 

使用容器

容器創(chuàng)建成功之后,我們就有許多其他的命令可以用來(lái)操作這個(gè)容器了。

指令 描述
ls 列出容器
inspect 顯示一個(gè)或多個(gè)容器詳細(xì)信息
attach 附加本地標(biāo)準(zhǔn)輸入,輸出和錯(cuò)誤到一個(gè)運(yùn)行的容器
exec 在運(yùn)行容器中執(zhí)行命令
commit 創(chuàng)建一個(gè)新鏡像來(lái)自一個(gè)容器
cp 拷貝文件/文件夾到一個(gè)容器
logs 獲取一個(gè)容器日志
port 列出或指定容器端口映射
stats 顯示容器資源使用統(tǒng)計(jì)
top 顯示一個(gè)容器運(yùn)行的進(jìn)程
update 更新一個(gè)或多個(gè)容器配置
stop/start 停止/啟動(dòng)一個(gè)或多個(gè)容器
rm 刪除一個(gè)或多個(gè)容器

容器啟動(dòng)成功之后,Docker引擎會(huì)自動(dòng)分配一個(gè)containerId,這個(gè)id可以用來(lái)唯一標(biāo)識(shí)這個(gè)容器,也可以使用通過(guò)--name來(lái)命名容器作為唯一標(biāo)識(shí)。我們可以使用docker stop/start/rm ... containerName/prefix4(containerId)格式來(lái)操作容器,其中containerName是容器名稱(chēng),prefix4(containerId)為containerId至少前4位。

[root@cloudfile ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e0b8a178c459        nginx               "nginx -g 'daemon of…"   2 hours ago         Up 2 hours          0.0.0.0:8080->80/tcp   dev-nginx
[root@cloudfile ~]# docker stop dev-nginx   # 停止dev-nginx
dev-nginx
[root@cloudfile ~]# docker rm dev-nginx     # 刪除dev-nginx
dev-nginx
[root@cloudfile ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@cloudfile ~]#
  • 進(jìn)入容器

    docker exec -it containerId/containerName bash
    

    退出容器的終端 control+p+q

  • 查看容器日志

    docker log containerId/containerName
    
  • 自動(dòng)重啟

    加上 `--restart=always`
    

Docker 網(wǎng)絡(luò)(network)

Docker 支持自定義network來(lái)提供給容器進(jìn)行通訊,Docker 內(nèi)置了一個(gè)默認(rèn)的bridge network,有未指定 network 的容器,默認(rèn)連接到此 network 中,其網(wǎng)段為 172.17.0.1/16。所以,兩個(gè)未進(jìn)行任何連接操作的容器是可以通過(guò) IP 地址互相通信的,因?yàn)樗麄兺谝粋€(gè) network 下,但通訊只能通過(guò) IP 地址進(jìn)行(比如 ping 172.17.0.5),不可以通過(guò)容器名通信(比如 ping container-name)。但自定義創(chuàng)建的網(wǎng)絡(luò)可以通過(guò)容器名進(jìn)行通信。

[root@cloudfile ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
[root@cloudfile ~]# 

可以通過(guò) docker network connect 指令將容器連接到一個(gè) network,也可以在起容器(docker run 指令)時(shí)加入 --network 參數(shù)指定即將創(chuàng)建的容器加入到哪個(gè) network,還可以通過(guò) docker network disconnect 命令將容器移出自定義的 network。

示例:創(chuàng)建容器連接網(wǎng)絡(luò)

[root@cloudfile ~]# docker network list # 查看網(wǎng)絡(luò)節(jié)點(diǎn)列表
NETWORK ID          NAME                DRIVER              SCOPE
b0b2ac02a44e        bridge              bridge              local
e6b334287fd0        host                host                local
73cc4dd0610d        none                null                local
[root@cloudfile ~]# docker network create dev # 添加名為dev的列表
570b83327e2b3cfa53922a1b5f5c223d6f6166ace7069648fb0188295a6d6922
[root@cloudfile ~]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
b0b2ac02a44e        bridge              bridge              local
570b83327e2b        dev                 bridge              local
e6b334287fd0        host                host                local
73cc4dd0610d        none                null                local  
# 創(chuàng)建容器時(shí)指定網(wǎng)絡(luò)
[root@cloudfile ~]# docker run -tid --name dev-nginx-01 -p 8080:80 --network=dev nginx 
82c81a5d7ab07a2233e5dc4b74300c661aaef67de7ec7cee98be388c981dfa41
# 先創(chuàng)建容器
[root@cloudfile ~]# docker run -tid --name dev-nginx-02 -p 8081:80 nginx
0408d5b0f61d31d33751512014072d240b5ad25cb05aae57e4aac97071983e2f 
# 將容器連接至dev網(wǎng)絡(luò)
[root@cloudfile ~]# docker network connect dev dev-nginx-02 
[root@cloudfile ~]# 

Docker 卷(volume)

Docker提供三種不同的方式將數(shù)據(jù)從宿主機(jī)掛載到容器中:volumes,bind mounts和tmpfs。

  • volumes:Docker管理宿主機(jī)文件系統(tǒng)的一部分(/var/lib/docker/volumes)。
  • bind mounts:可以存儲(chǔ)在宿主機(jī)系統(tǒng)的任意位置。
  • tmpfs:掛載存儲(chǔ)在宿主機(jī)系統(tǒng)的內(nèi)存中,而不會(huì)寫(xiě)入宿主機(jī)的文件系統(tǒng)。
Docker 數(shù)據(jù)管理

卷 Volume

當(dāng)我們創(chuàng)建一個(gè)容器的時(shí)候,如果沒(méi)有指定卷,會(huì)自動(dòng)創(chuàng)建一個(gè)圈以供容器存儲(chǔ)數(shù)據(jù),docker的卷默認(rèn)存儲(chǔ)的位置在/var/lib/docker/volumes下,我們可以創(chuàng)建一個(gè)volume在創(chuàng)建容器的時(shí)候綁定,這樣能更加方便的管理容器的數(shù)據(jù),不過(guò)比起mount來(lái)說(shuō),mount會(huì)更加通用一些。

[root@cloudfile ~]# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
[root@cloudfile ~]# 
管理卷
  • 查看volume

    [root@cloudfile volumes]# docker volume list
    DRIVER              VOLUME NAME
    local               c4969d2e6be2f8ffedd12bdb983d6xxxx
    
  • 創(chuàng)建volume

    [root@cloudfile volumes]# docker volume create nginx-volume
    nginx-volume
    [root@cloudfile volumes]# docker volume list
    DRIVER              VOLUME NAME
    local               c4969d2e6be2f8ffedd12bdb983d6xxxx
    local               nginx-volume
    [root@cloudfile volumes]# 
    
  • 查看volume詳情

    [root@cloudfile volumes]# docker volume inspect nginx-volume
    [
        {
            "CreatedAt": "2020-06-01T16:07:20+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
            "Name": "nginx-volume",
            "Options": {},
            "Scope": "local"
        }
    ] 
    [root@cloudfile volumes]# 
    
  • 刪除volume

    docker volume rm nginx-volume
    
指定volume創(chuàng)建容器

兩種寫(xiě)法:

  • docker run -itd --name=nginx-dev --mount src=nginx-volume,dst=/usr/share/nginx/html nginx
  • docker run -itd --name=nginx-dev -v nginx-vol:/usr/share/nginx/html nginx

通過(guò)上述命令啟動(dòng)容器之后,我們可以看到/var/lib/docker/volumes/nginx-volume/_data生成了些nginx的默認(rèn)文件,這個(gè)時(shí)候我們就可以將我們的靜態(tài)網(wǎng)頁(yè)放置在這里了。

[root@cloudfile _data]# pwd
/var/lib/docker/volumes/nginx-volume/_data
[root@cloudfile _data]# ls
50x.html  index.html
[root@cloudfile _data]# 

綁定volume的好處不言而喻,多個(gè)容器可以共享一個(gè)數(shù)據(jù)卷 比如多個(gè)nginx 指定一個(gè)html文件夾 這樣可以提供高可用。

Bind Mounts

我們知道了可以創(chuàng)建volume,然后綁定到容器中,可以達(dá)到數(shù)據(jù)管理以及數(shù)據(jù)卷共享的功能。但是為了更加方便管理,我們可以將已有的文件夾綁定到容器中。

  • docker run -d -it --name=nginx-dev --mount type=bind,src=/var/www,dst=/usr/share/nginx/html nginx
  • docker run -d -it --name=nginx-dev -v /var/www:/usr/share/nginx/html nginx

注意:

  • 如果源文件/目錄沒(méi)有存在,不會(huì)自動(dòng)創(chuàng)建,會(huì)拋出一個(gè)錯(cuò)誤。
  • 如果掛載目標(biāo)在容器中非空目錄,則該目錄現(xiàn)有內(nèi)容將被隱藏。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,104評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,884評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,647評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,130評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,366評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,737評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,174評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,586評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,827評(píng)論 1 283
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,608評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,914評(píng)論 2 372