Docker容器管理、倉庫管理、數據管理、數據卷備份與恢復

[toc]mysql

Docker容器管理、倉庫管理、數據管理、數據卷備份與恢復

1、容器管理

建立一個容器:docker create -it centos7 bash,注意centos7是必須是已經存在的

[root@xaviyunserver ~]# docker create -it centos7 bash
5ab8830ee5d2cb4da2df86912275fc14806cad1f44bb24e0e54ddefa11a60532
[root@xaviyunserver ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5ab8830ee5d2        centos7             "bash"              10 seconds ago      Created //建立                                goofy_knuth
410e90b34976        centos7             "bash"              2 hours ago         Up 2 hours                              dreamy_chatterjee
83a4c32c03ca        centos              "/bin/bash"         4 hours ago         Up 4 hours                              nostalgic_lamport

啓動容器:docker start CONTAINERID,啓動容器後,可使用 docker ps 查看到,有start 就有stop,和restart

以前咱們使用的docker run 至關於先create再start

[root@xaviyunserver ~]# docker start 5ab8830ee5d2
5ab8830ee5d2
[root@xaviyunserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5ab8830ee5d2        centos7             "bash"              2 minutes ago       Up 5 seconds                            goofy_knuth
410e90b34976        centos7             "bash"              2 hours ago         Up 2 hours                              dreamy_chatterjee
83a4c32c03ca        centos              "/bin/bash"         4 hours ago         Up 4 hours                              nostalgic_lamport

當執行以下(不帶 -d 參數):docker run -it centos bash //當你退出時,這個容器也會顯示退出的狀態!

[root@xaviyunserver ~]# docker run -it centos bash
[root@27096b136e00 /]# ls
bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@27096b136e00 /]# ifconfig
bash: ifconfig: command not found //這裏沒有安裝net-tool工具

mark

讓容器在後臺運行:docker run -d

好比:linux

shell腳本:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

–name 給容器自定義名字:docker run -itd --name centos7_1 centos7 bash

[root@xaviyunserver ~]# docker run -itd  --name centos7_1 centos7 bash
1a93298ed9db13673049b2d8d82013aa2b8e98caaa36c4d771337fc3f9bc2cea
[root@xaviyunserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1a93298ed9db        centos7             "bash"              4 seconds ago       Up 4 seconds                            centos7_1
5ab8830ee5d2        centos7             "bash"              10 minutes ago      Up 8 minutes                            goofy_knuth
410e90b34976        centos7             "bash"              2 hours ago         Up 2 hours                              dreamy_chatterjee
83a4c32c03ca        centos              "/bin/bash"         4 hours ago         Up 4 hours                              nostalgic_lamport

下次咱們就能夠直接使用名稱進入:docker exec -it centos7_1 bash

[root@xaviyunserver ~]# docker exec -it centos7_1 bash
[root@1a93298ed9db /]#

mark

docker run --rm -it centos7 bash -c "sleep 30" //--rm 可讓容器退出後直接刪除,在這裏命令執行完容器就會退出

docker logs 能夠獲取到容器的運行歷史信息,用法以下:docker logs container_id

[root@xaviyunserver ~]# docker run -itd centos bash -c "echo 123"
5ea2041ac3d24f6e44a6347b8d94328ddff02b26fa7c12f538389bc72ad9d5d4
[root@xaviyunserver ~]# docker logs 5ea2041a
123

docker exec -it container_id bash //能夠臨時打開一個虛擬終端,而且exit後,容器依然運行着

docker rm container_id //container_id是ps的時候查看到的,這樣就能夠把container刪除,若是是運行的容器,能夠加-f.

docker export container_id > file.tar // 導出容器,能夠遷移到其餘機器上,須要導入

cat file.tar |docker import - xavi_test //這樣會生成xavi_test的鏡像

2、Docker 倉庫管理

當咱們pull一個鏡像,通常都是從官網直接拉取的,通常的都是比較純淨的,可是在公司內通常這種鏡像沒有任何做用,咱們須要的是基礎環境都配置好的,能夠直接在此基礎上面運行服務的系統。nginx

綜上所述,咱們須要搭建一個在咱們服務器內部的一個鏡像倉庫,須要哪一個直接拉取便可!(相似於gitlab),咱們須要在本地建立一個倉庫:git

下載registry 鏡像,registy爲docker官方提供的一個鏡像,咱們能夠用它來建立本地的docker私有倉庫。docker pull registry

[root@xaviyunserver ~]# docker pull registry
Using default tag: latest

docker run -d -p 5000:5000 registry// 以registry鏡像啓動容器,-p會把容器的端口映射到宿主機上,:左邊爲宿主機監聽端口,:右邊爲容器監聽端口。

[root@xaviyunserver ~]# docker run -d -p 5000:5000 registry
87517b62936d5ad893c078c790c4bbaebc38056052a85f2cdc14ac921c1b4677
[root@xaviyunserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
87517b62936d        registry            "/entrypoint.sh /etc…"   6 seconds ago       Up 5 seconds        0.0.0.0:5000->5000/tcp   friendly_davinci
1a93298ed9db        centos7             "bash"                   11 hours ago        Up 11 hours                                  centos7_1
5ab8830ee5d2        centos7             "bash"                   11 hours ago        Up 11 hours                                  goofy_knuth
410e90b34976        centos7             "bash"                   13 hours ago        Up 13 hours                                  dreamy_chatterjee
83a4c32c03ca        centos              "/bin/bash"              14 hours ago        Up 14 hours                                  nostalgic_lamport

有什麼辦法能在開機時啓動因此的dokcer??systemctl restart docker && docker start $(docker ps -a -q)

假若有這麼一種狀況,我們的容器須要對外進行提供服務,虛擬機內的IP地址確定不能夠直接做爲訪問地址的,可是咱們ens33的地址能夠配置成對外的公網IP 而後經過端口映射,是否是咱們的docker容器也能夠跑web服務了?web

[root@xaviyunserver ~]# docker exec -it 410e90b34976c bash //任意進入一個容器
[root@410e90b34976 /]# ifconfig
bash: ifconfig: command not found
[root@410e90b34976 /]# yum install -y net-tools //安裝net-tools
[root@410e90b34976 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:04  txqueuelen 0  (Ethernet)
        RX packets 4008  bytes 10832918 (10.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3346  bytes 231130 (225.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@410e90b34976 /]# exit
exit
[root@xaviyunserver ~]# ping 172.17.0.4 //能夠ping通這個容器
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from 172.17.0.4: icmp_seq=3 ttl=64 time=0.055 ms

curl 127.0.0.1:5000/v2/_catalog//能夠訪問它

[root@xaviyunserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
87517b62936d        registry            "/entrypoint.sh /etc…"   18 minutes ago      Up 18 minutes       0.0.0.0:5000->5000/tcp   friendly_davinci
1a93298ed9db        centos7             "bash"                   11 hours ago        Up 11 hours                                  centos7_1
5ab8830ee5d2        centos7             "bash"                   11 hours ago        Up 11 hours                                  goofy_knuth
410e90b34976        centos7             "bash"                   13 hours ago        Up 13 hours                                  dreamy_chatterjee
83a4c32c03ca        centos              "/bin/bash"              15 hours ago        Up 15 hours                                  nostalgic_lamport
  • 訪問:
    [root@xaviyunserver ~]# telnet 127.0.0.1 5000
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    [root@xaviyunserver ~]# curl 127.0.0.1:5000/v2/_catalog
    {"repositories":[]}

上傳一個鏡像到私有庫的步驟:

第一步:打標籤:docker tag centos7 116.62.212.186:5000/centos7 //標記一下tag,必需要帶有私有倉庫的ip:port

[root@xaviyunserver ~]# docker tag centos7 116.62.212.186:5000/centos7
[root@xaviyunserver ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
centos7                       latest              1513b3b29ff7        14 hours ago        435MB
116.62.212.186:5000/centos7   latest              1513b3b29ff7        14 hours ago        435MB
centos_with_net               latest              097367cfbba8        15 hours ago        282MB
ubuntu                        latest              113a43faa138        4 weeks ago         81.2MB
xavilinux_centos              latest              49f7960eb7e4        4 weeks ago         200MB
centos                        latest              49f7960eb7e4        4 weeks ago         200MB
registry                      latest              d1fd7d86a825        5 months ago        33.3MB

mark

第二步,更改配置文件vi /etc/docker/daemon.json //更改成

[root@xaviyunserver ~]# vi /etc/docker/daemon.json  

 {
       "insecure-registries": ["116.62.212.186:5000"]
       }

[root@xaviyunserver ~]# systemctl restart docker //重啓服務
[root@xaviyunserver ~]# docker ps -a //查看容器已經關閉,還須要啓動
[root@xaviyunserver ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
87517b62936d        registry            "/entrypoint.sh /etc…"   About an hour ago   Exited (2) 3 minutes ago                         friendly_davinci

再次開啓容器:docker start id //這裏的id爲 registry 容器id

[root@xaviyunserver ~]# docker start 87517b62936d 
87517b62936d
[root@xaviyunserver ~]# docker push 116.62.212.186:5000/centos7
The push refers to repository [116.62.212.186:5000/centos7]

mark

排障過程:redis

經過curl進行驗證:curl https://dhq9bx4f.mirror.aliyuncs.com/v2/_catalog 是能夠正常返回結果,說明服務沒有問題sql

mark

經過谷歌×××(百度不行,解決不了這個問題),一共大概有兩種方式docker

一、設置dns,在/etc/resolv.conf,以及/etc/docker/daemon.json中增長dns。例如dns地址:8.8.8.8shell

mark

mark

二、設置docker代理(centos和ubuntu一樣設置)json

參考文獻:
https://blog.csdn.net/xxb249/article/details/79469534

[root@xaviyunserver ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
Digest: sha256:43ed4f8c9d1695e97a39cdfe9475af9096e3723cfb79d820d8da00d61a277a85
Status: Image is up to date for mysql:latest

第四步、檢查:

[root@zhdy01 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos7","centvim"]}

總結:今天換了電腦上的虛擬機倆作實驗,一次成功
mark

[root@xavi ~]# docker push 192.168.72.130:5000/centos7
The push refers to repository [192.168.72.130:5000/centos7]
788edba9eaa8: Pushed 
latest: digest: sha256:cfc19e79d4010d16b86660c37dbf1f1e881e974dd06c3c6ab05477db2a43444a size: 529
[root@xavi ~]# docker run -d -p 2000:2000 registry
9c2b897587c22d9f1d6977b8c2c87b4f33dd98dc0c63003e361b60864520c70b
[root@xavi ~]# 
[root@xavi ~]# docker tag ubuntu 192.168.72.130:5000/ubuntu
[root@xavi ~]# docker push 192.168.72.130:5000/ubuntu
The push refers to repository [192.168.72.130:5000/ubuntu]
b6f13d447e00: Pushed 
a20a262b87bd: Pushed 
904d60939c36: Pushed 
3a89e0d8654e: Pushed 
db9476e6d963: Pushed 
latest: digest: sha256:e7def0d56013d50204d73bb588d99e0baa7d69ea1bc1157549b898eb67287612 size: 1357
[root@xavi ~]# curl 127.0.0.1:5000/v2_catalog
404 page not found
[root@xavi ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos7","ubuntu"]}

3、Docker 數據管理

背景:假如咱們的某個容器跑了一個線上的業務,不可抵抗的狀況發生了,數據呢?數據具體在什麼位置呢?他會一併刪除,如何保證數據不刪除呢?

把咱們宿主機的目錄掛載到容器內,讓容器的數據所有寫到我們指定的宿主機目錄。

3.1 掛載本地的目錄到容器裏:docker run -tid -v /data/:/data centos bash //-v 用來指定掛載目錄,:前面的/data/爲宿主機本地目錄,:後面的/data/爲容器裏的目錄,會在容器中自動建立

[root@xavi ~]# docker run -tid -v /data/:/data centos7 bash
43e7d37d1adcf10abca55aeeed565ddb5fcded2777ae4e96193332529029dff5
[root@xavi ~]# ls /data/
ftp  mariadb  mysql  nginx  redis  wwwroot
[root@xavi ~]# docker exec -it 43e7d37d1adcf bash
[root@43e7d37d1adc /]# ls -l /data/
total 0
drwxr-xr-x 2 1010 1010  21 Mar 29 22:20 ftp
drwx------ 5 1004 root 222 Mar  1 11:56 mariadb
drwx------ 9 1004 1005 194 Apr 18 05:37 mysql
drwxr-xr-x 4 root root  42 Mar 15 11:47 nginx
drwxr-xr-x 2 root root  44 Jun 13 08:38 redis
drwxr-xr-x 8 root root 116 May 27 09:04 wwwroot

上述兩處/data/文件下的目錄是相同的

[root@43e7d37d1adc /]# mkdir /data/xavi
[root@43e7d37d1adc /]# exit
exit

[root@xavi ~]# ls /data/
ftp  mariadb  mysql  nginx  redis  wwwroot  xavi

// 看來已經自動的存儲到了宿主機的硬盤上!

3.2 掛載數據卷

其實咱們掛載目錄的時候,能夠指定容器name,若是不指定就隨機定義了。好比上面咱們沒有指定,它就生成了一個名字爲friendly_visvesvaraya,這個名字可使用命令 docker ps 看最右側一列

[root@xavi ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
43e7d37d1adc        centos7             "bash"                   13 minutes ago      Up 13 minutes                                          friendly_visvesvaraya
9c2b897587c2        registry            "/entrypoint.sh /etc…"   About an hour ago   Up About an hour    0.0.0.0:2000->2000/tcp, 5000/tcp   epic_saha
d0b81c693cc5        registry            "/entrypoint.sh /etc…"   About an hour ago   Up About an hour    0.0.0.0:5000->5000/tcp             objective_chebyshev

docker run -itd --volumes-from friendly_visvesvaraya centos7 bash//這樣,咱們使用centos7鏡像建立了新的容器,而且使用了friendly_visvesvaraya 容器的數據卷

[root@xavi ~]# docker run -itd --volumes-from friendly_visvesvaraya  centos7 bash
97331ffb05d10701d2a9c488a8a4716313d8336cedafe66e5a9c7364d7be4985
[root@xavi ~]# 
[root@xavi ~]# docker exec -it 97331ffb05d10701 bash
[root@97331ffb05d1 /]# ls /data/
ftp  mariadb  mysql  nginx  redis  wwwroot  xavi

這裏很相似於NFS的共享功能?

3.3 定義數據卷容器

有時候,咱們須要多個容器之間相互共享數據,相似於linux裏面的NFS,因此就能夠搭建一個專門的數據卷容器,而後其餘容器直接掛載該數據卷。

首先創建數據卷容器docker run -itd -v /data/ --name testvol centos bash //注意這裏的/data/是容器的/data目錄,並不是本地的/data/目錄。

而後讓其餘容器掛載該數據卷:docker run -itd --volumes-from testvol centos7 bash

4、數據卷備份與恢復

應用背景:
平常工做中:把容器和本地宿主機作了目錄映射直接存在本地,那咱們只需對本地的硬盤按期備份,但若是沒有作這個映射,沒有作映射狀況下的備份和恢復該如何來處理

4.1 本地建立備份目錄

mkdir /data/backup

docker run --volumes-from testvol -v /data/backup/:/backup centos 

tar cvf /backup/data.tar /data/

說明:首先咱們須要使用testvol數據卷新開一個容器,同時咱們還須要把本地的/data/backup/目錄掛載到該容器的/backup下,這樣在容器中/backup目錄裏面新建的文件,就能夠直接在/data/backup/目錄中看到了。 而後再把/data/目錄下面的文件打包到成data.tar文件放到/backup目錄下面。

mark

mark

根據圖示理解:宿主機(服務器)分享了一個/data/backup/ 目錄,本地的這個backup目錄和新建容器內的backup相互映射,而咱們如今的新建容器掛載了數據卷容器的/data/ 也就是意味着數據卷的data目錄和容器的data目錄數據是一致的,如今兩兩互通,這樣只要把新建容器中的data目錄中的數據copy到backup中就能夠了!這樣就完成了真實的備份!

4.2 恢復

思路: 先新建一個數據卷容器,再建一個新的容器並掛載該數據卷容器,而後再把tar包解包。

新建數據卷容器:docker run -itd -v /data/ --name testvol2 centos bash

掛載數據卷新建容器,並解包:docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar

恢復也就是按照剛剛的思路反着來就能夠了。實用性不高,由於多數狀況下咱們仍是用宿主機映射的比較普遍。

相關文章
相關標籤/搜索