docker入門教程-安裝及使用

安裝

官方文檔

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è)置倉庫

    # 安裝需要的工具
    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    # 設(shè)置docker倉庫
    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客戶端的命令一般是 docker command的方式的樟结,新版的Docker為了更好的區(qū)分不同模塊的命令窘面,可以支持類似docker image ls這樣的命令(docker module command)憾筏。

Docker 鏡像(image

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

指令 描述
ls 列出鏡像
build 構(gòu)建鏡像來自Dockerfile
history 查看鏡像歷史
inspect 顯示一個或多個鏡像詳細(xì)信息
pull 從鏡像倉庫拉取鏡像
push 推送一個鏡像到鏡像倉庫
rm 移除一個或多個鏡像
prune 移除未使用的鏡像钦奋。沒有被標(biāo)記或被任何容器引用的衰倦。
tag 創(chuàng)建一個引用源鏡像標(biāo)記目標(biāo)鏡像
export 導(dǎo)出容器文件系統(tǒng)到tar歸檔文件
import 導(dǎo)入容器文件系統(tǒng)tar歸檔文件創(chuàng)建鏡像
save 保存一個或多個鏡像到一個tar歸檔文件
load 加載鏡像來自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)拉取最新版本,指定版本可以在鏡像名后面添加版本號樊零,例如 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 命令來創(chuàng)建容器,創(chuàng)建一個容器的時候可以附加許多指令來設(shè)置很多條件

設(shè)置相關(guān)指令
指令 描述
-i, --interactive 交互式
-t, --tty 分配一個偽終端
-d, --detach 運(yùn)行容器到后臺
-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 添加連接到另一個容器
--network netwokname 連接容器到一個網(wǎng)絡(luò)
--mount mount 掛載宿主機(jī)分區(qū)到容器
-v, --volume list 掛載宿主機(jī)目錄到容器
--restart string 容器退出時重啟策略孽文,默認(rèn)no [always|on-failure]
--add-host list 添加其他主機(jī)到容器中/etc/hosts
資源限制指令
資源限制指令 描述
-m,--memory 容器可以使用的最大內(nèi)存量
--memory-swap 允許交換到磁盤的內(nèi)存量
--memory-swappiness=<0-100> 容器使用SWAP分區(qū)交換的百分比(0-100夺艰,默認(rèn)為-1)
--memory-reservation 內(nèi)存軟限制芋哭,Docker檢測主機(jī)容器爭用或內(nèi)存不足時所激活的軟限制,使用此選項郁副,值必須設(shè)置低于—memory减牺,以使其優(yōu)先
--oom-kill-disable 當(dāng)宿主機(jī)內(nèi)存不足時,內(nèi)核會殺死容器中的進(jìn)程存谎。建議設(shè)置了-memory選項再禁用OOM拔疚。如果沒有設(shè)置,主機(jī)可能會耗盡內(nèi)存
--cpus 限制容器可以使用多少可用的CPU資源
--cpuset-cpus 限制容器可以使用特定的CPU
--cpu-shares 此值設(shè)置為大于或小于默認(rèn)1024值既荚,以增加或減少容器的權(quán)重稚失,并使其可以訪問主機(jī)CPU周期的更大或更小比例
示例:創(chuàng)建一個nginx容器
docker run -tid --name dev-nginx -p 8080:80 nginx
-tid 這里使用了指令連寫的方式,使用了t i d這三個指令 表示是交互式的固以、分配偽終端墩虹、運(yùn)行容器到后臺嘱巾,
--name 將這個容器命名為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)建成功之后憨琳,我們就有許多其他的命令可以用來操作這個容器了。

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

容器啟動成功之后篙螟,Docker引擎會自動分配一個containerId,這個id可以用來唯一標(biāo)識這個容器问拘,也可以使用通過--name來命名容器作為唯一標(biāo)識遍略。我們可以使用docker stop/start/rm ... containerName/prefix4(containerId)格式來操作容器,其中containerName是容器名稱骤坐,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
    
  • 自動重啟

    加上 `--restart=always`
    

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

Docker 支持自定義network來提供給容器進(jìn)行通訊,Docker 內(nèi)置了一個默認(rèn)的bridge network,有未指定 network 的容器纽绍,默認(rèn)連接到此 network 中蕾久,其網(wǎng)段為 172.17.0.1/16。所以拌夏,兩個未進(jìn)行任何連接操作的容器是可以通過 IP 地址互相通信的僧著,因為他們同在一個 network 下,但通訊只能通過 IP 地址進(jìn)行(比如 ping 172.17.0.5)障簿,不可以通過容器名通信(比如 ping container-name)盹愚。但自定義創(chuàng)建的網(wǎng)絡(luò)可以通過容器名進(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 ~]# 

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

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

[root@cloudfile ~]# docker network list # 查看網(wǎng)絡(luò)節(jié)點列表
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)建容器時指定網(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:可以存儲在宿主機(jī)系統(tǒng)的任意位置。
  • tmpfs:掛載存儲在宿主機(jī)系統(tǒng)的內(nèi)存中顶滩,而不會寫入宿主機(jī)的文件系統(tǒng)余掖。
Docker 數(shù)據(jù)管理

卷 Volume

當(dāng)我們創(chuàng)建一個容器的時候,如果沒有指定卷礁鲁,會自動創(chuàng)建一個圈以供容器存儲數(shù)據(jù)盐欺,docker的卷默認(rèn)存儲的位置在/var/lib/docker/volumes下,我們可以創(chuàng)建一個volume在創(chuàng)建容器的時候綁定仅醇,這樣能更加方便的管理容器的數(shù)據(jù)冗美,不過比起mount來說,mount會更加通用一些析二。

[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)建容器

兩種寫法:

  • 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

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

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

綁定volume的好處不言而喻属韧,多個容器可以共享一個數(shù)據(jù)卷 比如多個nginx 指定一個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

注意:

  • 如果源文件/目錄沒有存在,不會自動創(chuàng)建淌山,會拋出一個錯誤裸燎。
  • 如果掛載目標(biāo)在容器中非空目錄,則該目錄現(xiàn)有內(nèi)容將被隱藏泼疑。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末德绿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子王浴,更是在濱河造成了極大的恐慌脆炎,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓辣,死亡現(xiàn)場離奇詭異秒裕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钞啸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門几蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喇潘,“玉大人,你說我怎么就攤上這事梭稚∮钡停” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵弧烤,是天一觀的道長忱屑。 經(jīng)常有香客問我,道長暇昂,這世上最難降的妖魔是什么莺戒? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮急波,結(jié)果婚禮上从铲,老公的妹妹穿的比我還像新娘。我一直安慰自己澄暮,他們只是感情好名段,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泣懊,像睡著了一般伸辟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗅定,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天自娩,我揣著相機(jī)與錄音用踩,去河邊找鬼渠退。 笑死,一個胖子當(dāng)著我的面吹牛脐彩,可吹牛的內(nèi)容都是我干的碎乃。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惠奸,長吁一口氣:“原來是場噩夢啊……” “哼梅誓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佛南,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤梗掰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗅回,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體及穗,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年绵载,在試婚紗的時候發(fā)現(xiàn)自己被綠了埂陆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苛白。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焚虱,靈堂內(nèi)的尸體忽然破棺而出购裙,到底是詐尸還是另有隱情,我是刑警寧澤鹃栽,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布躏率,位于F島的核電站,受9級特大地震影響民鼓,放射性物質(zhì)發(fā)生泄漏禾锤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一摹察、第九天 我趴在偏房一處隱蔽的房頂上張望恩掷。 院中可真熱鬧,春花似錦供嚎、人聲如沸黄娘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腰懂。三九已至服球,卻和暖如春绷耍,著一層夾襖步出監(jiān)牢的瞬間荠诬,已是汗流浹背妒潭。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工诺祸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留着帽,地道東北人杂伟。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像仍翰,于是被迫代替她去往敵國和親赫粥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350