Docker部署
Docker安裝
[root@docker01 ~]# yum remove docker docker-common docker-selinux docker-engine
[root@docker01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
[root@docker01 ~]# yum makecache fast
[root@docker01 ~]# yum install docker-ce -y
[root@docker01 ~]# docker version
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# systemctl enable docker
[root@docker01 ~]# docker version
鏡像加速
#官網(wǎng)地址
https://www.daocloud.io/mirror
#加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#阿里鏡像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
#加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
Docker 基礎(chǔ)命令
[root@docker01 ~]# docker --help
Usage:
docker [OPTIONS] COMMAND [arg...]
docker daemon [ --help | ... ]
docker [ --help | -v | --version ]
A
self-sufficient runtime for containers.
Options:
--config string Location of client config files (default "/root/.docker") #客戶端配置文件的位置
-D, --debug=false Enable debug mode #啟用Debug調(diào)試模式
-H, --host=[] Daemon socket(s) to connect to #守護(hù)進(jìn)程的套接字(Socket)連接
-h, --help=false Print usage #打印使用
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") #設(shè)置日志級別
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") #信任證書簽名CA
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") #TLS證書文件路徑
--tlskey string Path to TLS key file (default "/root/.docker/key.pem") #TLS密鑰文件路徑
--tlsverify Use TLS and verify the remote #使用TLS驗證遠(yuǎn)程
-v, --version Print version information and quit #打印版本信息并退出
......
Commands:
attach Attach to a running container #當(dāng)前shell下attach連接指定運行鏡像
build Build an image from a Dockerfile #通過Dockerfile定制鏡像
commit Create a new image from a container's changes #提交當(dāng)前容器為新的鏡像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定文件或者目錄到宿主機(jī)中
create Create a new container #創(chuàng)建一個新的容器,同run 但不啟動容器
diff Inspect changes on a container's filesystem #查看docker容器變化
events Get real time events from the server #從docker服務(wù)獲取容器實時事件
exec Run a command in a running container #在已存在的容器上運行命令
export Export a container's filesystem as a tar archive #導(dǎo)出容器的內(nèi)容流作為一個tar歸檔文件(對應(yīng)import)
history Show the history of an image #展示一個鏡像形成歷史
images List images #列出系統(tǒng)當(dāng)前鏡像
import Import the contents from a tarball to create a filesystem image #從tar包中的內(nèi)容創(chuàng)建一個新的文件系統(tǒng)映像(對應(yīng)export)
info Display system-wide information #顯示系統(tǒng)相關(guān)信息
inspect Return low-level information on a container or image #查看容器詳細(xì)信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應(yīng)save)
login Register or log in to a Docker registry #注冊或者登陸一個docker源服務(wù)器
logout Log out from a Docker registry #從當(dāng)前Docker registry退出
logs Fetch the logs of a container #輸出當(dāng)前容器日志信息
pause Pause all processes within a container #暫停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口對應(yīng)的容器內(nèi)部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #從docker鏡像源服務(wù)器拉取指定鏡像或者庫鏡像
push Push an image or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務(wù)器
rename Rename a container #重命名容器
restart Restart a running container #重啟運行的容器
rm Remove one or more containers #移除一個或者多個容器
rmi Remove one or more images #移除一個或多個鏡像(無容器使用該鏡像才可以刪除,否則需要刪除相關(guān)容器才可以繼續(xù)或者-f強(qiáng)制刪除)
run Run a command in a new container #創(chuàng)建一個新的容器并運行一個命令
save Save an image(s) to a tar archive #保存一個鏡像為一個tar包(對應(yīng)load)
search Search the Docker Hub for images #在docker hub中搜索鏡像
start Start one or more stopped containers #啟動容器
stats Display a live stream of container(s) resource usage statistics #統(tǒng)計容器使用資源
stop Stop a running container #停止容器
tag Tag an image into a repository #給源中鏡像打標(biāo)簽
top Display the running processes of a container #查看容器中運行的進(jìn)程信息
unpause Unpause all processes within a container #取消暫停容器
version Show the Docker version information #查看容器版本號
wait Block until a container stops, then print its exit code #截取容器停止時的退出狀態(tài)值
Docker鏡像管理
搜索鏡像docker search
[root@docker01 ~]# docker search nginx
NAME(名稱) DESCRIPTION (描述) STARS(下載次數(shù)) OFFICIAL(官方) AUTOMATED(自動化創(chuàng)建)
nginx Official build of Nginx. 12451 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1715 [OK]
鏡像選擇建議
- 優(yōu)先考慮官方
- stars數(shù)量最多
獲取鏡像docker pull
默認(rèn)獲取最新
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
指定版本獲取
搜索鏡像并查看該鏡像的 tag 默認(rèn)我們使用命令查看是看不到鏡像的版本的,可以通過 docker-hub 查看,但是國內(nèi)原因很慢, 這里可以使用倉庫的 restful API 來查詢 jq 是一個 json 格式化工具,需要提前安裝 。
[root@docker01 ~]# yum install jq
[root@docker01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
說明:更換鏡像名查看其它鏡像就可以,這里將centos更換成其它的鏡像名即可。
[root@docker01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/nginx/tags|jq
[root@docker01 ~]# docker pull centos:7
私有倉庫鏡像pull
docker pull 鏡像下載地址
查看鏡像列表
[root@docker01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 10 days ago 126MB
centos 7 5e35e350aded 8 weeks ago 203MB
centos latest 0f3e07c0138f 3 months ago 220MB
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 10 days ago 126MB
centos 7 5e35e350aded 8 weeks ago 203MB
centos latest 0f3e07c0138f 3 months ago 220MB
[root@docker01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 10 days ago 126MB
centos 7 5e35e350aded 8 weeks ago 203MB
centos latest 0f3e07c0138f 3 months ago 220MB
列表包括了倉庫名、標(biāo)簽、鏡像ID、創(chuàng)建時間以及所占用的空間。鏡像ID則是鏡像的唯一標(biāo)識,一個鏡像可以對應(yīng)多個標(biāo)簽。
刪除鏡像
說明:使用docker rmi 刪除本地鏡像,后面可以跟鏡像ID或者標(biāo)簽。(刪除鏡像之前先用docker rm 刪除依賴于這個鏡像的所有容器)。注意docker rm 命令是移除容器。
docker rmi [選項] <鏡像1> [<鏡像2> ...]
docker rmi imageID/imageName/
導(dǎo)出鏡像 docker save
如果要導(dǎo)出鏡像到本地,提供給另外一臺機(jī)使用,可以使用docker save 或者docker image save 命令。
Docker save 鏡像名稱:tag -o 自定義名稱.tar
[root@docker01 ~]# docker save nginx:latest -o nginx.tar.gz
[root@docker01 ~]# ls
nginx.tar.gz
[root@docker01 ~]# docker save nginx >/tmp/nginx1.tar.gz
[root@docker01 ~]# ls /tmp/
nginx1.tar.gz
導(dǎo)入鏡像
通過docker save導(dǎo)出的鏡像,通常需要通過docker load 導(dǎo)入,命令如下:
Docker load -i 名稱.tar
[root@docker01 ~]# docker load -i nginx.tar.gz
[root@docker01 ~]# docker load </tmp/nginx1.tar.gz
鏡像打標(biāo)簽
[root@docker01 ~]# docker tag nginx:latest nginx:1.16.1
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginxsrc v6 7ed8dee10e66 2 days ago 541MB
nginx 1.16.1 c7460dfcab50 3 days ago 126MB
nginx latest c7460dfcab50 3 days ago 126MB
Docker容器管理
啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一種是將在終止?fàn)顟B(tài)(stopped)的容器重新啟動。
因為Docker的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創(chuàng)建容器。所以主要命令還是docker run
新建容器
[root@docker01 ~]# docker create -it centos /bin/bash #創(chuàng)建一個容器
77cabb640f4d2f18aca3449c96aa2467c763b7f0683ca89345465cfefa82b7eb
[root@docker01 ~]# docker ps -a #查看所有容器的狀態(tài)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77cabb640f4d centos "/bin/bash" 11 seconds ago Created ecstatic_ride
[root@docker01 ~]# docker start 77cabb640f4d #根據(jù)id啟動之前的容器
77cabb640f4d
[root@docker01 ~]# docker ps #查看處于運行狀態(tài)的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77cabb640f4d centos "/bin/bash" 41 seconds ago Up 6 seconds ecstatic_ride
[root@docker01 ~]# docker attach 77cabb640f4d #根據(jù)id進(jìn)入到容器中
[root@77cabb640f4d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@77cabb640f4d ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:48 pts/0 00:00:00 /bin/bash
root 16 1 0 03:49 pts/0 00:00:00 ps -ef
[root@77cabb640f4d ~]# exit #退出容器
exit
新建容器并啟動docker run
#參數(shù)
-i, --interactive 交互式
-t, --tty 分配一個偽終端
-d, --detach 運行容器到后臺
-a, --attach list 附加到運行的容器
--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 連接容器到一個網(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周期的更大或更小比例
例如:執(zhí)行下面命令輸出一個"hello world",之后容器自動終止。
[root@docker01 ~]# docker run -it centos echo "hello world"
hello world #這里是因為默認(rèn)替換了CMD的執(zhí)行主行主程序的命令,其真實執(zhí)行的是CMD ["sh" ,"-c" ,"echo "hello world""] sh被認(rèn)為是主程序,執(zhí)行完成后退出,所以容器也就自動關(guān)閉。
[root@docker01 ~]# docker run -it centos /bin/echo "hello world"
hello world
啟動一個bash終端,允許用戶進(jìn)行交互
[root@docker01 ~]# docker run --name centos7 -it centos /bin/bash
[root@45c206cfbb6f /]# pwd
/
--name: 給容器定義一個名稱
-t:讓Docker分配一個偽終端并綁定到容器的標(biāo)準(zhǔn)輸入上
-i:讓容器的標(biāo)準(zhǔn)輸入保持打開
/bin/bash:執(zhí)行一個命令
當(dāng)利用docker run 來創(chuàng)建容器時,Docker在后臺運行的標(biāo)準(zhǔn)操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載;
- 利用鏡像創(chuàng)建一個容器,并啟動該容器;
- 分配一個文件系統(tǒng)給容器,并在只讀的鏡像層外面掛載一層可讀寫層;
- 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中;
- 從網(wǎng)橋的地址池配置一個 IP 地址給容器;
- 執(zhí)行用戶指定的應(yīng)用程序;
- 執(zhí)行完畢后容器被自動終止。
啟動已經(jīng)終止的容器卷
容器的核心為所執(zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運行所必需的。除此之外,并沒有其他的資源??梢栽趥谓K端利用 ps 或 top 來查看進(jìn)程信息。
docker ps -a 可以查看所有容器的情況,docker ps 查看已啟動容器的情況
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45c206cfbb6f centos "/bin/bash" 2 hours ago Exited (0) 9 seconds ago centos7
7c2b1ef25d95 centos "/bin/bash" 2 hours ago Exited (0) 2 hours ago dazzling_khayyam
49ca5a318bcf centos "/bin/echo 'hello wo…" 2 hours ago Exited (0) 2 hours ago agitated_hoover
90edf30620ef centos "echo 'hello world'" 2 hours ago Exited (0) 2 hours ago happy_wescoff
77cabb640f4d centos "/bin/bash" 3 hours ago Exited (0) 3 hours ago
[root@docker01 ~]# docker start 45c206cfbb6f
45c206cfbb6f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45c206cfbb6f centos "/bin/bash" 2 hours ago Up 6 seconds
停止容器
可以使用 docker stop 來終止一個正在運行的容器。
此外,當(dāng)Docker容器中指定的應(yīng)用終結(jié)時,容器也會自動終結(jié),例如啟動一個終端容器,用戶通過exit命令或者Ctrl+d 來退出終端時,所創(chuàng)建的容器立刻終止。
終止?fàn)顟B(tài)的容器可以用 docker ps -a 命令看到,也可以通過 docker start 命令來重新啟動。
[root@docker01 ~]# docker stop 45c206cfbb6f
45c206cfbb6f
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45c206cfbb6f centos "/bin/bash" 2 hours ago Exited (0) 9 seconds ago
后臺進(jìn)程運行
守護(hù)進(jìn)程運行(后臺運行)
更多的時候,需要讓Docker容器在后臺運行,而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時可以加 -d 參數(shù)來實現(xiàn)。
[root@docker01 ~]# docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
b218728ce7f5345e991cd0b1c5331e66447aa13ab521261ad46b8c444f402620
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b218728ce7f5 centos "/bin/bash -c 'while…" 6 seconds ago Up 5 seconds kind_proskuriakova
[root@docker01 ~]# docker logs b218728ce7f5 #獲取容器輸出的信息,通過docker logs命令獲取
hello world
hello world
hello world
進(jìn)入程序
在使用 -d 參數(shù)時,容器啟動后會進(jìn)入后臺,某些時候需要進(jìn)入容器進(jìn)行操作,有很多種房,包括 docker attach 命令或者 docker exec命令等。
attach命令
docker attach 是Docker自帶的命令、
[root@docker01 ~]# docker run -itd centos
39b8b0ab96d45b3320517aa44ce30867a5cdd3d05c341bde161b95264bddf55f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39b8b0ab96d4 centos "/bin/bash" 19 seconds ago Up 19 seconds modest_keller
[root@docker01 ~]# docker attach 39b8b0ab96d4
[root@39b8b0ab96d4 /]#
[root@39b8b0ab96d4 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
但是使用attach命令有時候并不方便,當(dāng)多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示,當(dāng)某個窗口因命令阻塞,其他窗口也無法執(zhí)行操作了。且通過exit退出后容器就自動終止了。
exec命令
exec 可以在容器內(nèi)直接執(zhí)行任意命令,此處我們也可以使用它進(jìn)入到容器里面
[root@docker01 ~]# docker run -itd centos
d8e133187bf8a53f101b1e29e250d34733cbabadbd6ad5ec42f933db9da42987
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e133187bf8 centos "/bin/bash" 53 seconds ago Up 52 seconds exciting
[root@docker01 ~]# docker exec -it d8e133187bf8 /bin/bash
[root@d8e133187bf8 /]#
[root@d8e133187bf8 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e133187bf8 centos "/bin/bash" 4 minutes ago Up 4 minutes exciting_euclid
導(dǎo)出和導(dǎo)入容器
Docker commit
(1).通過容器自作鏡像(只有容器才有寫入權(quán)限,但是一旦停止,寫入的就會丟失,如果想保留,可以通過docker commit制作鏡像進(jìn)行保留)
注:只有docker export制作的鏡像可以默認(rèn)拷貝至其他的平臺,docker commit制作的鏡像默認(rèn)在images列表,默認(rèn)的不是一個tar文件,導(dǎo)出操作如下:
Docker commit 容器ID -m(說明)鏡像名稱:tag
導(dǎo)出docker images 列表中的鏡像
Docker save 鏡像名稱:tag -o 自定義名稱.tar
通過docker save導(dǎo)出的鏡像,通常需要通過docker load 導(dǎo)入,命令如下:
Docker load -i 名稱.tar
2.Docker export
將當(dāng)前的 容器導(dǎo)成一個tar鏡像文件;
Docker export 容器ID -o 自定義名稱.tar/tar.gz
將tar鏡像文件導(dǎo)入當(dāng)前列表,并自定義名稱版本:
Docker import 鏡像文件.tar/tar.gz 鏡像名稱:tag
#導(dǎo)出鏡像
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU
d8e133187bf8 centos "/bin/bash" 4 minutes ago Up 4
[root@docker01 ~]# docker export d8e133187bf8 -o centos7.tar.gz
[root@docker01 ~]# ls
centos7.tar.gz
#導(dǎo)入鏡像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.1 7f663fdb1dc1 9 seconds ago 220MB
容器刪除
使用 docker rm 來刪除一個處于終止?fàn)顟B(tài)的容器。
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e133187bf8 centos "/bin/bash" 15 minutes ago Up 15 minutes exciting_euclid
#先停止docker
[root@docker01 ~]# docker stop d8e133187bf8
d8e133187bf8
#再刪除容器
[root@docker01 ~]# docker rm d8e133187bf8
d8e133187bf8
如果要刪除一個運行中的容器,可以添加 -f 參數(shù)。 Docker會發(fā)送 STGKILL信號給容器,再進(jìn)行刪除。
清理所有處于終止?fàn)顟B(tài)的的容器(慎用)
[root@docker01 ~]# docker run -itd centos
ba42dbe0296bea8a9a626553ce3694d1a17b67e82e51ff1aba25463df3990cde
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba42dbe0296b centos "/bin/bash" 12 seconds ago Up 11 seconds funny_kirch
[root@docker01 ~]# docker rm -f ba42dbe0296b
ba42dbe0296b
Docker的數(shù)據(jù)卷管理
Docker 容器中管理數(shù)據(jù)主要有兩種方式:
數(shù)據(jù)卷(Data volumes)
數(shù)據(jù)卷容器(Data volumes containers)
數(shù)據(jù)卷
數(shù)據(jù)卷是一個可供一個或者多個容器使用的特殊目錄,它繞過UFS,可以提供很多有用的特性:
- 數(shù)據(jù)卷可以在容器之間共享和重用
- 對數(shù)據(jù)卷的修改會立馬生效
- 對數(shù)據(jù)卷的更新,不會影響鏡像
- 數(shù)據(jù)卷默認(rèn)會一直存在,即時容器被刪除
管理數(shù)據(jù)卷
[root@docker01 ~]# docker volume create myvolume #創(chuàng)建一個數(shù)據(jù)卷
myvolume
[root@docker01 ~]# docker volume inspect myvolume #查看數(shù)據(jù)卷的信息
[
{
"CreatedAt": "2020-01-13T16:05:38+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
[root@docker01 ~]# docker volume ls #查看數(shù)據(jù)列表
local myvolume
用卷創(chuàng)建一個容器
[root@docker01 ~]# docker run -itd --name mycentos --mount src=myvolume,dst=/data centos
4a027fe9f4a9de6767fc6a2381d02fa44de78b58d6658d4c3b0dea523569ace0
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a027fe9f4a9 centos "/bin/bash" About a minute ago Up About a minute mycentos
[root@docker01 ~]# docker exec -it mycentos /bin/bash
[root@4a027fe9f4a9 /]# ls data/
#新開一個終端創(chuàng)建文件
[root@docker01 ~]# cd /var/lib/docker/volumes/myvolume/_data/
[root@docker01 /var/lib/docker/volumes/myvolume/_data]# ls
[root@docker01 /var/lib/docker/volumes/myvolume/_data]# touch test.txt
#查看文件
[root@4a027fe9f4a9 /]# cd data/
[root@4a027fe9f4a9 data]# ls
test.txt
src:數(shù)據(jù)卷名字
dst:需要掛載的目錄路徑
注意:如果沒有創(chuàng)建指定卷,則自動創(chuàng)建,默認(rèn)創(chuàng)建的事是匿名的數(shù)據(jù)局。
此時開啟另外一個終端再次創(chuàng)建一個容器,并且掛載同樣的數(shù)據(jù)卷,可以發(fā)現(xiàn)這種方式可以在容器之間共享和重用
[root@docker01 ~]# docker run -itd --name mycentos01 --mount src=myvolume,dst=/data centos
75e190aeccd3031558afd83baa7a30160c596792304796a4210d94db4bb48769
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75e190aeccd3 centos "/bin/bash" 5 seconds ago Up 4 seconds mycentos01
4a027fe9f4a9 centos "/bin/bash" 2 hours ago Up 2 hours mycentos
[root@docker01 ~]# docker exec -it mycentos01 /bin/bash
[root@75e190aeccd3 /]# ls data/
test.txt
上面創(chuàng)建容器并掛載數(shù)據(jù)卷,還可以使用下面這種方法 -v 數(shù)據(jù)卷名字:掛載路徑,Docker掛載數(shù)據(jù)卷默認(rèn)權(quán)限是讀寫,也可以通過 :ro 指定為只讀。
[root@docker01 ~]# docker run -itd --name mycentos02 -v myvolume:/test:ro centos
dbc735c7f5056603b534c95a776662d71e817196f89327ca892cbb4bc555fc2f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbc735c7f505 centos "/bin/bash" 9 seconds ago Up 9 seconds mycentos02
75e190aeccd3 centos "/bin/bash" 7 minutes ago Up 7 minutes mycentos01
4a027fe9f4a9 centos "/bin/bash" 2 hours ago Up 2 hours mycentos
[root@docker01 ~]# docker exec -it dbc735c7f505 /bin/bash
[root@dbc735c7f505 /]# ls test/
test.txt
刪除數(shù)據(jù)卷
Docker 不會在容器被刪除后自動刪除數(shù)據(jù)卷。且如果要刪除數(shù)據(jù)卷,必須先將使用數(shù)據(jù)卷的容器停止,刪除后,才能刪除數(shù)據(jù)卷
[root@docker01 ~]# docker rm -f $(docker ps -qa)
dbc735c7f505
75e190aeccd3
4a027fe9f4a9
39b8b0ab96d4
716a492ee32a
[root@docker01 ~]# docker volume rm myvolume
myvolume
掛載一個主機(jī)目錄作為數(shù)據(jù)卷
使用 -v 參數(shù)也可以指定掛載一個本地主機(jī)的目錄到容器中
[root@docker01 ~]# docker run -itd --name web -v /webapp:/opt/webapp centos #創(chuàng)建一個掛載本地目錄的容器
becbfc3e81ea9280aefb3884b1b1fa45ff773086bb520aa0852bd95b5710f49f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
becbfc3e81ea centos "/bin/bash" 6 seconds ago Up 5 seconds web
[root@docker01 ~]# ls /webapp/ #本地沒有會自動的創(chuàng)建
[root@docker01 ~]# echo "hello world" >/webapp/index.html #追加內(nèi)容至文件
[root@docker01 ~]# ls /webapp/ #本地查看
index.html
[root@docker01 ~]# cat /webapp/index.html
hello world
[root@docker01 ~]# docker exec -it becbfc3e81ea /bin/bash #進(jìn)入容器內(nèi)部查看
[root@becbfc3e81ea /]# cat /opt/webapp/index.html
hello world
掛載一個宿主機(jī)文件作為數(shù)據(jù)卷
-v 參數(shù)也可以從主機(jī)掛載單個文件到容器中
root@docker01 ~]# echo "test" >test.txt
[root@docker01 ~]# docker run -itd --name web01 -v /root/test.txt:/opt/test.txt centos
d0b4b5347524171c8d214366ad17e0a3301209a0639e980b137969317c2b6b5e
[root@docker01 ~]# docker exec -it d0b4b5347524 /bin/bash
[root@d0b4b5347524 /]# cat /opt/test.txt
test
數(shù)據(jù)卷容器
如果有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享,最好創(chuàng)建數(shù)據(jù)卷容器。
數(shù)據(jù)卷容器其實就是一個正常的容器,專門用來提供數(shù)據(jù)卷供其它容器掛載的。
--volumes-from (跟某一個已經(jīng)存在的容器掛載相同的卷)
[root@docker01 ~]# docker run -d -v /dbdata --name dbdata centos #創(chuàng)建一個數(shù)據(jù)卷容器
64ae39622380535beb3ff76d0b922018f53bbf3dad74f4f46b092296df0849ef
[root@docker01 ~]# docker run -d -it --volumes-from dbdata --name db01 centos #創(chuàng)建一個容器db01使用--volumes-from掛載dbdata.
0646d45189469572482df94d8b8a177b2afa02b0f4d9cc83ad755010f98cb343
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0646d4518946 centos "/bin/bash" 15 seconds ago Up 14 seconds db01
[root@docker01 ~]# docker exec -it 0646d4518946 /bin/bash #登錄容器內(nèi)部查看
[root@0646d4518946 /]# ls
bin dev home lib64 media opt root sbin sys usr
dbdata etc lib lost+found mnt proc run srv tmp var
[root@0646d4518946 /]# touch dbdata/file1 #創(chuàng)建一個文件
[root@docker01 ~]# docker run -d -it --volumes-from dbdata --name db02 centos #創(chuàng)建第二個掛載數(shù)據(jù)卷容器的容器db02
f5c952b1dba0dc5578b1c2e703b3380565eecfda353d9583499d7749259dc5ce
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5c952b1dba0 centos "/bin/bash" 5 seconds ago Up 4 seconds db02
0646d4518946 centos "/bin/bash" 4 minutes ago Up 4 minutes db01
[root@docker01 ~]# docker exec -it f5c952b1dba0 /bin/bash
[root@f5c952b1dba0 /]# ls dbdata/ #查看文件存在證明數(shù)據(jù)共享。
file1
從上面可以看出可以使用超過一個 --volumes-from 參數(shù)來指定從多個容器掛載相同的的數(shù)據(jù)卷,也可以從其他已經(jīng)掛載了數(shù)據(jù)卷的容器來級聯(lián)掛載數(shù)據(jù)卷,示例:
[root@docker01 ~]# docker run -itd --name db03 --volumes-from db01 centos
622211d51fdcf143d09fb0f1c760aeb9652bbb063acda3692dd01a14dae6e630
[root@docker01 ~]# docker exec -it 622211d51fdcf143 /bin/bash
[root@622211d51fdc /]# ls dbdata/
file1
注意:使用 --volumes-from 參數(shù)所掛載數(shù)據(jù)卷的容器自己并需要保持在運行狀態(tài)。如果刪除了掛載的容器(包括dbdata、db01和db02),數(shù)據(jù)卷也不會被自動刪除。如果要刪除一個數(shù)據(jù)卷,必須在刪除最后一個還掛載著它的容器時使用 docker rm -v 命令來指定同時刪除關(guān)聯(lián)的容器。
Docker容器的網(wǎng)絡(luò)
Docker 允許通過外部訪問容器或容器互聯(lián)的方式來提供網(wǎng)絡(luò)服務(wù)。
外部訪問容器
容器中可以運行一些網(wǎng)絡(luò)應(yīng)用,比如(nginx,apache,php等),要讓外部訪問這些應(yīng)用可以通過 -P 或者 -p 參數(shù)來制定端口映射
使用 -P 參數(shù)時,Docker 會隨機(jī)映射一個 端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口。
[root@docker01 ~]# docker run -d -P centos_nginxsrc:v4
db1eeff2a8071addb6e1dc449605f49371d3e4d1a1bb19aed101b7448a4f3c5a
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db1eeff2a807 centos_nginxsrc:v4 "nginx -g 'daemon of…" 12 seconds ago Up 11 seconds 0.0.0.0:32768->80/tcp friendly_lichterman
[root@docker01 ~]# curl localhost:32768
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
-p (小寫的)則可以指定要映射的端口,并且,在一個指定端口上只可以綁定一個容器。格式有:
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有的接口的地址
# hostPort:containerPort#使用hostPort:containerPort 格式宿主機(jī)的88端口映射到容器的80端口,默認(rèn)會綁定宿主機(jī)所有接口上的所有地址
[root@docker01 ~]# docker run -d -p 80:80 --name nginx01 centos_nginxsrc:v4
7f1d7713a0428af350ab86518574ab8fcdf57c9ca41b70fe395a9c9e4630b12c
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f1d7713a042 centos_nginxsrc:v4 "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp nginx01
映射到指定地址的指定端口
#ip:hostPort:containerPort#使用ip:hostPort:containerPort 格式指定映射使用一個特定地址,如localhost地址127.0.0.1
[root@docker01 ~]# docker run -d -p 127.0.0.1:81:80 --name nginx02 centos_nginxsrc:v4
6b890b75c42422bdd6d0ef9c37bef224df785fa8093376bc25cd28f3aa78cdd0
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b890b75c424 centos_nginxsrc:v4 "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 127.0.0.1:81->80/tcp nginx02
映射到指定地址的任意端口
#ip::containerPort #使用ip:containerPort 綁定localhost的任意端口到容器的80端口,宿主機(jī)會自動分配一個端口
[root@docker01 ~]# docker run -d -p 127.0.0.1::80 --naem nginx03 centos_nginxsrc:v4
85f70aee5540c087c9d28dda50f2c8f1b093ddac7b00379ac245861327639958
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85f70aee5540 centos_nginxsrc:v4 "nginx -g 'daemon of…" 7 seconds ago Up 5 seconds 127.0.0.1:32768->80/tcp nginx03
指定udp端口
[root@docker01 ~]# docker run -d -p 127.0.0.1:82:80/udp --name nginx04 centos_nginxsrc:v4
2f178794f66c87ab8e5c77f5aaf73f2e9dfdfab2ed0d26a2aaa4f13a9cda733d
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f178794f66c centos_nginxsrc:v4 "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp, 127.0.0.1:82->80/udp nginx04
查看映射端口配置
使用 docker port 查看當(dāng)前映射的端口配置,也可以查看到綁定的地址
[root@docker01 ~]# docker port nginx04
80/udp -> 127.0.0.1:82
注意:
容器有自己內(nèi)部網(wǎng)絡(luò)地址和ip地址(使用 docker inspect 可以獲取所有變量,Docker 還可以有一個可變的網(wǎng)絡(luò)配置)
-p 標(biāo)記可以多次使用來綁定多個端口
[root@docker01 ~]# docker run -d -p 127.0.0.1:82:80 -p 8080:443 --name nginx05 centos_nginxsrc:v4
433436861a5a4fb46503cac5a76c206f278a262270be9e4135f8d27b6aacc239
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
433436861a5a centos_nginxsrc:v4 "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds 127.0.0.1:82->80/tcp, 0.0.0.0:8080->443/tcp nginx05
容器互聯(lián)
容器的連接(linking)系統(tǒng)除了端口映射外,另一種是容器中應(yīng)用交互的方式。該系統(tǒng)會在源和接收容器之間創(chuàng)建一個隧道,接受容器可以看到源容器指定的信息。
請參考docker網(wǎng)絡(luò)配置:http://www.itdecent.cn/writer#/notebooks/41877344/notes/58850036