Docker基礎(chǔ)操作

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 0x01 核心概念 Docker鏡像類似于虛擬機(jī)鏡像,可以理解為一個面向Docker引擎的只讀模板,包含了文件系統(tǒng)...
    閑云逸心閱讀 4,975評論 0 9
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,969評論 0 7
  • 一、運行 docker run就是運行容器的命令,具體格式我們會在 容器 一節(jié)進(jìn)行詳細(xì)講解, 我們這里簡要的說明一...
    He_Yu閱讀 890評論 0 0
  • 一、Docker容器概述 1、docker中的容器技術(shù)演進(jìn) lxc --> libcontainer --> ru...
    任總閱讀 4,012評論 0 26
  • 上一章我們說到慕容恪去世之后,前燕朝政被糊涂的小皇帝慕容暐以及戲精“皇叔爺”慕容評把持,很快就搞得烏煙瘴氣。前燕迅...
    enidbear閱讀 816評論 0 1

友情鏈接更多精彩內(nèi)容