安裝
Docker提供了以下Linux發(fā)行版和體系結(jié)構(gòu)中的.deb和.rpm軟件包:
這里我們以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ù)的核心是image
、container
、network
和volume
舊版的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)。
卷 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)容將被隱藏。