1. Docker 基礎(chǔ)
菜鳥教程:傳送門
1.1 Docker Hello World
Docker 允許你在容器內(nèi)運(yùn)行應(yīng)用程序燥翅, 使用 docker run
命令來在容器內(nèi)運(yùn)行一個應(yīng)用程序慨绳;
[root@bogon /]# docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
Docker 以 ubuntu15.10 鏡像創(chuàng)建一個新容器,然后在容器里執(zhí)行 bin/echo "Hello world",然后輸出結(jié)果活翩;
- 參數(shù)解析:
-
docker
: Docker 的二進(jìn)制執(zhí)行文件戳玫; -
run
:與前面的 docker 組合來運(yùn)行一個容器; -
ubuntu
:15.10指定要運(yùn)行的鏡像匪补,Docker首先從本地主機(jī)上查找鏡像是否存在伞辛,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像夯缺; -
/bin/echo "Hello world"
: 在啟動的容器里執(zhí)行的命令始锚;
-
1.1.1 運(yùn)行交互式的容器
通過docker的兩個參數(shù) -i -t
,讓docker運(yùn)行的容器實現(xiàn)"對話"的能力:
[root@bogon /]# docker run -i -t ubuntu:15.10 /bin/bash
root@b453fa34daea:/# cat /proc/version
Linux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018
root@b453fa34daea:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
執(zhí)行命令后已進(jìn)入一個 ubuntu15.10系統(tǒng)的容器喳逛,在容器中運(yùn)行命令 cat /proc/version
和 ls
分別查看當(dāng)前系統(tǒng)的版本信息和當(dāng)前目錄下的文件列表瞧捌;
- 參數(shù)解析:
-
-t
: 在新容器內(nèi)指定一個偽終端或終端; -
-i
: 允許你對容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互润文;
-
1.1.2 啟動容器(后臺模式)
命令中加入 -d
以創(chuàng)建一個以進(jìn)程方式運(yùn)行的容器姐呐,執(zhí)行后出現(xiàn)的長字符串叫做容器ID,對每個容器來說都是唯一的典蝌,我們可以通過容器ID來查看對應(yīng)的容器發(fā)生了什么曙砂;
[root@bogon /]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
7f940a34f32a44fd1f7a386072ae073d7e5f8498eb79f5b1f13bcdc35dd09b49
通過執(zhí)行 docker ps
來查看容器有在運(yùn)行:
[root@bogon /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f940a34f32a ubuntu:15.10 "/bin/sh -c 'while t…" About a minute ago Up About a minute youthful_leakey
CONTAINER ID:容器ID;NAMES:自動分配的容器名稱
通過執(zhí)行 docker logs 容器ID/容器NAMES
命令骏掀,查看容器內(nèi)的標(biāo)準(zhǔn)輸出鸠澈;
[root@bogon /]# docker logs 7f940a34f32a 或 [root@bogon /]# docker logs youthful_leakey
hello world
...
1.1.3 停止容器
通過執(zhí)行 docker stop 容器ID/容器NAMES
命令來停止容器,再通過執(zhí)行 docker ps
來查看容器有在運(yùn)行截驮;
[root@bogon /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f940a34f32a ubuntu:15.10 "/bin/sh -c 'while t…" 10 minutes ago Up 10 minutes youthful_leakey
[root@bogon /]# docker stop 7f940a34f32a 或 [root@bogon /]# docker stop youthful_leakey
youthful_leakey
[root@bogon /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1.2 Docker 容器使用
1.2.1 Docker 客戶端
通過執(zhí)行 docker
命令來查看到 Docker 客戶端的所有命令選項笑陈;
通過執(zhí)行 docker command --help
命令更深入的了解指定的 Docker
命令使用方法,如查看 docker stats
指令的具體使用方法葵袭;
1.2.2 運(yùn)行一個web應(yīng)用
使用 docker
構(gòu)建一個 web
應(yīng)用程序涵妥,例如在docker容器中運(yùn)行一個 Python Flask
應(yīng)用來運(yùn)行一個web應(yīng)用:
[root@localhost ~]# docker pull training/webapp
[root@localhost ~]# docker run -d -P training/webapp python app.py
db5e673a8de956b3873c2fe0384cabc895e683c9453a9eb72e8d3066c924aa7d
- 參數(shù)說明:
-
-d
: 讓容器在后臺運(yùn)行; -
-P
: 將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上;
-
1.2.3 查看 WEB 應(yīng)用容器
使用 docker ps
命令來查看我們正在運(yùn)行的容器:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db5e673a8de9 training/webapp "python app.py" 37 seconds ago Up 31 seconds 0.0.0.0:32768->5000/tcp suspicious_wozniak
[root@localhost docker]# ip addr # 查看docker映射主機(jī)的ip地址:192.168.74.128
其中 Docker
開放了 5000 端口(默認(rèn) Python Flask
端口)映射到主機(jī)端口 32769
上,可以通過瀏覽器輸入192.168.74.128:327769
訪問WEB應(yīng)用坡锡;
還可以通過 -p
參數(shù)來設(shè)置不一樣的端口蓬网,然后再通過 docker ps
查看正在運(yùn)行的容器,最后通過瀏覽器輸入192.168.74.128:5000
訪問WEB應(yīng)用:
[root@localhost ~]# docker run -d -p 5000:5000 training/webapp python app.py
162469a9aec01edd590d28eb1295637c41f6d039794878ce8b0c96cdc8575164
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
162469a9aec0 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp focused_beaver
1.2.4 網(wǎng)絡(luò)端口的快捷方式
通過 docker ps
命令可以查看到容器的端口映射鹉勒,docker 還提供了另一個快捷方式 docker port
帆锋,使用 docker port
可以查看指定 (ID 或者名字)容器的某個確定端口映射到宿主機(jī)的端口號:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
162469a9aec0 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp focused_beaver
[root@localhost ~]# docker port 162469a9aec0
5000/tcp -> 0.0.0.0:5000
1.2.5 查看 WEB 應(yīng)用程序日志
docker logs [ID或者名字]
可以查看容器內(nèi)部的標(biāo)準(zhǔn)輸出:
[root@localhost docker]# docker logs -f 162469a9aec0
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.74.1 - - [24/Aug/2019 18:46:12] "GET / HTTP/1.1" 200 -
192.168.74.1 - - [24/Aug/2019 18:46:12] "GET /robots.txt HTTP/1.1" 404 -
192.168.74.1 - - [24/Aug/2019 18:46:12] "GET /favicon.ico HTTP/1.1" 404 -
192.168.74.1 - - [24/Aug/2019 18:46:14] "GET / HTTP/1.1" 200 -
-
-f
: 讓docker logs
像使用tail -f
一樣來輸出容器內(nèi)部的標(biāo)準(zhǔn)輸出;
1.2.6 查看WEB應(yīng)用程序容器的進(jìn)程
使用 docker top [容器名稱]
來查看容器內(nèi)部運(yùn)行的進(jìn)程:
[root@localhost docker]# docker top focused_beaver
UID PID PPID C STIME TTY TIME CMD
root 16017 16000 0 02:45 ? 00:00:00 python app.py
1.2.7 檢查 WEB 應(yīng)用程序
使用 docker inspect [容器名稱]
來查看 Docker
的底層信息禽额, 會返回一個 JSON 文件記錄著 Docker
容器的配置和狀態(tài)信息锯厢;
[root@localhost docker]# docker inspect focused_beaver
...
1.2.8 停止 WEB 應(yīng)用容器
使用 docker stop [容器名稱]或者[容器ID]
停止 WEB 應(yīng)用容器;
1.2.9 重啟WEB應(yīng)用容器
對已停止的容器使用 docker start [容器名稱]
進(jìn)行啟動绵疲;正在運(yùn)行的容器哲鸳,我們可以使用 docker restart [容器名稱]
命令來重啟;
使用docker ps -l
查詢最后一次創(chuàng)建的容器盔憨;
1.2.10 移除WEB應(yīng)用容器
使用 docker rm [容器名稱]
命令來刪除不需要的容器徙菠,注意刪除容器時,容器必須是停止?fàn)顟B(tài)郁岩,否則會報如下錯誤婿奔;
1.3 Docker 鏡像使用
1.3.1 列出鏡像列表
使用 docker images
來列出本地主機(jī)上的鏡像:
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 7 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
各個選項說明:
-
REPOSITORY
:表示鏡像的倉庫源缺狠; -
TAG
:鏡像的標(biāo)簽; -
IMAGE ID
:鏡像ID萍摊; -
CREATED
:鏡像創(chuàng)建時間挤茄; -
SIZE
:鏡像大小冰木;
同一倉庫源可以有多個 TAG
穷劈,代表這個倉庫源的不同個版本,如 ubuntu
倉庫源里踊沸,有15.10歇终、14.04
等多個不同的版本,我們使用 REPOSITORY:TAG
來定義不同的鏡像逼龟,例如版本為15.10的ubuntu系統(tǒng)鏡像來運(yùn)行容器時:docker run -t -i ubuntu:15.10 /bin/bash
评凝;
1.3.2 獲取一個新的鏡像
當(dāng)我們在本地主機(jī)上使用一個不存在的鏡像時 Docker
就會自動下載這個鏡像;也可以使用 docker pull
命令來預(yù)下載指定名稱版本號的鏡像腺律,下載完成后奕短,可以直接使用這個鏡像來運(yùn)行容器。
[root@localhost docker]# docker pull ubuntu:14.04
1.3.3 查找鏡像
可以從 Docker Hub
網(wǎng)站來搜索鏡像匀钧,Docker Hub 網(wǎng)址為: https://hub.docker.com/翎碑,也可以使用 docker search
命令來搜索鏡像,例如需要一個 httpd
的鏡像來作為我們的web服務(wù)榴捡,就可以使用docker search
命令來搜索杈女;
[root@localhost docker]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 2622 [OK]
centos/httpd 24 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 22
arm32v7/httpd The Apache HTTP Server Project 8
-
NAME
: 鏡像倉庫源的名稱; -
DESCRIPTION
: 鏡像的描述吊圾; -
OFFICIAL
: 是否docker官方發(fā)布;
1.3.4 拖取鏡像
使用命令 docker pull
來下載鏡像翰蠢,下載完成后项乒,我們就可以使用 docker run httpd
運(yùn)行這個鏡像了。
1.3.5 創(chuàng)建鏡像
若從docker
鏡像倉庫中下載的鏡像不能滿足需求時梁沧,可以通過以下兩種方式對鏡像進(jìn)行更改:
- 從已經(jīng)創(chuàng)建的容器中更新鏡像檀何,并且提交這個鏡像;
- 使用
Dockerfile
指令來創(chuàng)建一個新的鏡像廷支;
1.3.6 更新鏡像
更新鏡像之前频鉴,需要使用鏡像來創(chuàng)建一個容器,如: docker run -t -i ubuntu:15.10 /bin/bash
恋拍;然后再運(yùn)行的容器中使用 apt-get update
命令進(jìn)行更新垛孔;完成操作后使用 exit 進(jìn)行退出;此時afe22e398ee5
ID的容器就是按照需求更改的容器施敢,再通過命令 docker commit
來提交容器副本;
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 7d85cc3b2d80 2 days ago 154MB
hello-world latest fce289e99eb9 7 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
[root@localhost docker]# docker run -t -i ubuntu:15.10 /bin/bash
root@afe22e398ee5:/# apt-get update # 同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引周荐,這樣才能獲取到最新的軟件包狭莱,只是更新了apt的資源列表
...
root@afe22e398ee5:/# exit
[root@localhost docker]# docker commit -m="has update" -a="runoob" afe22e398ee5 runoob/ubuntu:v2
各個參數(shù)說明:
-
-m
: 提交的描述信息; -
-a
:指定鏡像作者概作; -
e218edb10161
:容器ID腋妙; -
runoob/ubuntu:v2
: 指定要創(chuàng)建的目標(biāo)鏡像名
1.3.7 構(gòu)建鏡像
使用命令 docker build
從零開始來創(chuàng)建一個新的鏡像;為此需要創(chuàng)建一個 Dockerfile
文件讯榕,其中包含一組指令來告訴 Docker
如何構(gòu)建鏡像骤素,測試是在虛擬機(jī)的/home/dockerBuildTest
目錄下新建了一個 Dockerfile
文件,將下面的內(nèi)容復(fù)制進(jìn)去:
[root@localhost home]# cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
- 每一個指令都會在鏡像上創(chuàng)建一個新的層愚屁,每一個指令的前綴都必須是大寫的济竹;
- 第一條
FROM
,指定使用哪個鏡像源集绰; -
RUN
指令告訴docker
在鏡像內(nèi)執(zhí)行命令规辱,安裝了什么; - 然后使用
Dockerfile
文件栽燕,通過docker build
命令來構(gòu)建一個鏡像:
[root@localhost home]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 2.048kB
Step 1/9 : FROM centos:6.7
6.7: Pulling from library/centos
cbddbc0189a0: Pull complete
Digest: sha256:4c952fc7d30ed134109c769387313ab864711d1bd8b4660017f9d27243622df1
Status: Downloaded newer image for centos:6.7
---> 9f1de3c6ad53
Step 2/9 : MAINTAINER Fisher "fisher@sudops.com"
---> Running in 0c187664f82c
Removing intermediate container 0c187664f82c
---> cd27f5545362
Step 3/9 : RUN /bin/echo 'root:123456' |chpasswd
---> Running in 79ffe342cc0e
Removing intermediate container 79ffe342cc0e
---> fe4cc14abecc
Step 4/9 : RUN useradd runoob
---> Running in 23ef5afd9655
Removing intermediate container 23ef5afd9655
---> 7af4fef8c0aa
Step 5/9 : RUN /bin/echo 'runoob:123456' |chpasswd
---> Running in c93e51643569
Removing intermediate container c93e51643569
---> e11a014ca16d
Step 6/9 : RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
---> Running in bfb908697150
Removing intermediate container bfb908697150
---> 2f730ba3cc10
Step 7/9 : EXPOSE 22
---> Running in 7b35db7f6085
Removing intermediate container 7b35db7f6085
---> b5cefb31f421
Step 8/9 : EXPOSE 80
---> Running in a93483068a8c
Removing intermediate container a93483068a8c
---> a5fca49d0d9a
Step 9/9 : CMD /usr/sbin/sshd -D
---> Running in 8502582a965f
Removing intermediate container 8502582a965f
---> 7c3b7236c7a8
Successfully built 7c3b7236c7a8
Successfully tagged runoob/centos:6.7
構(gòu)建命令的參數(shù)說明:
-
-t
:指定要創(chuàng)建的目標(biāo)鏡像名罕袋; -
.
:Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對路徑碍岔;
使用docker images
查看創(chuàng)建的鏡像已經(jīng)在列表中存在浴讯,鏡像 ID為 7c3b7236c7a8
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 7c3b7236c7a8 2 minutes ago 191MB
httpd latest 7d85cc3b2d80 2 days ago 154MB
centos 6.7 9f1de3c6ad53 5 months ago 191MB
hello-world latest fce289e99eb9 7 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
最后使用新的鏡像來創(chuàng)建容器,查看新鏡像已經(jīng)包含創(chuàng)建的用戶runoob:
[root@localhost home]# docker run -t -i runoob/centos:6.7 /bin/bash
[root@471fa88eb567 /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)
1.3.8 設(shè)置鏡像標(biāo)簽
使用 docker tag [鏡像ID]
命令蔼啦,為鏡像添加一個新的標(biāo)簽:
[root@localhost home]# docker tag 7c3b7236c7a8 geekleng/centos:dev
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
geekleng/centos dev 7c3b7236c7a8 16 minutes ago 191MB
runoob/centos 6.7 7c3b7236c7a8 16 minutes ago 191MB
httpd latest 7d85cc3b2d80 2 days ago 154MB
centos 6.7 9f1de3c6ad53 5 months ago 191MB
hello-world latest fce289e99eb9 7 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
使用 docker images
命令可以看到榆纽,ID為 7c3b7236c7a8
的鏡像多一個名稱 geekleng/centos
和標(biāo)簽dev
;
1.4 Docker 容器連接
1.4.1 網(wǎng)絡(luò)端口映射
可以指定容器綁定的網(wǎng)絡(luò)地址以及端口號捏肢,比如綁定到 127.0.0.1:5000
奈籽,使用之前的 python
應(yīng)用的容器:
[root@localhost home]# docker run -d -P training/webapp python app.py
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c5536ccc37a training/webapp "python app.py" 11 seconds ago Up 9 seconds 0.0.0.0:32768->5000/tcp epic_montalcini
[root@localhost home]# docker run -d -p 5000:5000 training/webapp python app.py
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8cd6936ab21 training/webapp "python app.py" 10 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp laughing_kilby
4c5536ccc37a training/webapp "python app.py" 55 seconds ago Up 53 seconds 0.0.0.0:32768->5000/tcp epic_montalcini
[root@localhost home]# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
82de5f1b230e2401e89e28f83c97e4ae66dd6e95be3b89fc8454d91c44880fd0
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82de5f1b230e training/webapp "python app.py" 3 seconds ago Up 1 second 127.0.0.1:5001->5000/tcp zen_proskuriakova
a8cd6936ab21 training/webapp "python app.py" About a minute ago Up 57 seconds 0.0.0.0:5000->5000/tcp laughing_kilby
4c5536ccc37a training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32768->5000/tcp epic_montalcini
使用 -P
參數(shù)創(chuàng)建一個容器,使用 docker ps
可以看到容器端口 5000
綁定主機(jī)端口 32768
; 使用 -p
標(biāo)識來指定容器端口
綁定到主機(jī)端口
鸵赫,兩種方式的區(qū)別是:
-P
(大寫P): 是容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口衣屏;
-p
(小寫p): 是容器內(nèi)部端口綁定到指定的主機(jī)端口;
1.4.2 Docker容器連接
端口映射并不是唯一把 docker
連接到另一個容器的方法辩棒; docker
有一個連接系統(tǒng)允許將多個容器連接在一起狼忱,共享連接信息; docker
連接會創(chuàng)建一個父子關(guān)系一睁,其中父容器可以看到子容器的信息钻弄;
容器命名:在創(chuàng)建一個容器的時候, docker
會自動對它進(jìn)行命名者吁;也可以使用 --name
標(biāo)識來命名容器窘俺;
[root@localhost home]# docker run -d -P --name runoob training/webapp python app.py
431af1c61e6a8c5171318e1b07c2eb0d074766c09212305322d80d39bee6789c
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
431af1c61e6a training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:32769->5000/tcp runoob