Docker數據管理及網絡通信、端口映射

博文目錄:

一、docker的數據管理

1、數據卷

2、數據卷容器

二、docker網絡通信

1、端口映射

2、容器互聯

三、容器中部署MySQL服務併發布

四、容器中部署Apache服務併發布

一、docker的數據管理

在docker中,爲了方便查看容器內產生的數據或者將多個容器之間的數據實現共享,會涉及到容器的數據管理操作,管理docker容器中的數據主要有兩種方式:數據卷和數據卷容器。

1、數據卷

數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操作立即可見,並且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移,數據卷的使用類似於Linux下對目錄進行的mount掛載操作(注意:是將宿主機本地的目錄掛載到容器中,舉例:若宿主機本地/data目錄掛載的是/dev/sdb1,那麼要將/data做數據卷映射時,容器中指定的目錄使用的文件系統也是/dev/sdb1,我不知道這樣解釋,你們能不能理解它的工作原理)。

1)掛載宿主機目錄作爲數據卷舉例:

使用-v選項可以創建數據卷(只是運行容器時,創建一個目錄),創建數據卷的同時將宿主機的目錄掛載到數據捲上使用,以實現宿主機與容器之間的數據遷移。

需要注意的是,宿主機本地目錄的路徑必須是使用絕對路徑,如果路徑不存在,Docker會自動創建相應的路徑。

[root@centos01 ~]# docker images   <!--查看Docker宿主機鏡像-->
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602 MB
[root@centos01 ~]# docker run -d --name centos6.701 -v /data1 
hub.c.163.com/public/centos:6.7-tools   <!--創建數據卷,數據卷名字爲centos6.701-->
b85a2d8419a98756369ddc3b78247d3d42c178e8e563a936fe973f2f6611f951
[root@centos01 ~]# docker ps   <!--查看正在運行的容器-->
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS               NAMES
b85a2d8419a9        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   32 seconds ago      Up 32 seconds       22/tcp              centos6.701
[root@centos01 ~]# ls /var/lib/docker/volumes/  <!--查看正在運行的數據卷-->
fbc3bde69b9eaf6410d7e52ba412ab07bbfe49e83315d245dbcf44bf2aa6b91a  metadata.db
[root@centos01 ~]# dd if=/dev/zero of=./1.iso bs=10M count=10  <!--創建一個測試數據-->
[root@centos01 ~]# cp 1.iso /var/lib/docker/volumes/
fbc3bde69b9eaf6410d7e52ba412ab07bbfe49e83315d245dbcf44bf2aa6b91a/_data/  
       <!--宿主機給容器共享數據-->
[root@centos01 ~]# docker exec -it centos6.701 /bin/bash <!--登錄centos6.701容器-->
[root@b85a2d8419a9 /]# ls data1/  <!--查看數據卷是否有宿主機共享的數據-->
1.iso 

2、數據卷容器

如果需要在容器之間共享一些數據,最簡單的方法就是使用數據卷容器。數據卷容器就是一個普通的容器,專門提供數據卷給其他容器掛載使用。使用方法如下:首先,需要創建一個容器作爲數據卷容器,之後在其他容器創建時用--volumes-from掛載數據卷容器中的數據卷使用。

1)數據卷容器創建及使用舉例:

[root@centos01 ~]# docker run -it -d --name datasrv -v /data1 -v /data2 hub.c.163.com/public/centos:6.7-tools /bin/bash
6c2e89e442fba34821f044d1b589ef70cd2c4d775f83084ce0d7bb8a331c0a55
<!--創建運行一個容器,容器名爲datasrv,並創建兩個數據卷:data1和data2-->
[root@centos01 ~]# docker exec -it datasrv /bin/bash   <!--進入創建的容器-->
[root@6c2e89e442fb /]# ls | grep data   <!--查看是否有對應的數據卷-->
data1
data2
[root@6c2e89e442fb /]# exit   <!--退出當前容器-->
exit 
[root@centos01 ~]# docker run -it -d --volumes-from datasrv --name lyx hub.c.163.com/public/centos:6.7-tools 
56fff3838cb714369d99e30ea6eebc72e0c6ca1aa11b5e66f3c403ca74c2460e
<!--運行一個名爲lyx的容器,使用--volumes-from來將datasrv容器中的數據卷掛載到這個lyx新容器上-->
[root@centos01 ~]# docker exec -it lyx /bin/bash      <!--進入新創建的lyx容器-->
[root@56fff3838cb7 /]# ls |grep data <!--查看新的容器是否可以看到datasrv提供的數據卷-->
data1
data2
[root@56fff3838cb7 /]# echo "www.lyx.com" > /data1/lyx.txt 
        <!--在lyx容器中向data1目錄寫入文件進行測試-->
[root@56fff3838cb7 /]# exit         <!--退出該容器-->
exit
[root@centos01 ~]# docker exec -it datasrv /bin/bash  <!--進入提供數據卷的datasrv容器-->
[root@6c2e89e442fb /]# cat /data1/lyx.txt      <!--可以看到剛在lyx容器創建的文件-->
www.lyx.com
[root@6c2e89e442fb /]# exit          <!--退出該容器-->
exit
[root@centos01 ~]# cd /var/lib/docker/volumes/  
                             <!--在docker宿主機查看剛剛在lyx容器創建的數據-->
[root@centos01 volumes]# ls
cd27325467149a236d16bd8f4dcdf84c7c6018fd800e2f6d7e04980119390428  metadata.db
[root@centos01 volumes]# 
[root@centos01 volumes]# ls cd27325467149a236d16bd8f4dcdf84c7c6018fd800e2f6d7e04980119390428/_data/
lyx.txt

注意,生產環境中最注重的就是存儲的可靠性,以及存儲的可動態擴展性,一定要在做數據卷時考慮到這一點,在這方面比較出色的還要數GFS文件系統了,我上面只是做了簡單的配置,若在生產環境中,一定要好好考慮,就比如上面做的鏡像卷容器,就可以在宿主機本地掛載GFS文件系統,然後創建鏡像卷容器時,將掛載GFS的目錄映射到容器中的鏡像卷,這樣纔是一個合格的鏡像卷容器。

二、docker網絡通信

1、端口映射

docker提供了映射容器端口到宿主機和容器互聯機制來爲容器提供網絡服務。

在啓動容器的時候,如果不指定對應的端口,在容器外是無法通過網絡來訪問容器內的服務的。docker提供端口映射機制來將容器內的服務提供給外部網絡訪問,實質上就是將宿主機的端口映射到容器中,使外部網絡訪問宿主機的端口可訪問容器內的服務。

實現端口映射,需要在運行docker run命令時使用-P(大寫)選項實現隨機映射,Docker一般會隨機映射到一個端口訪問在49000~49900的端口到容器內部開放的網絡端口,但不是絕對的,也有例外情況不會映射到這個範圍;也可以使用在運行docker run命令時使用-p(小寫)選項實現指定要映射的端口(常用此種方法)。

1)端口映射舉例:

[root@centos01 ~]# docker run -d -P --name ssh hub.c.163.com/public/centos:6.7-tools 
   <!--將容器ssh的22號端口映射到宿主機的任意IP地址和隨機端口上-->
ff30d37776877e47a3c39b932610f93b74dd48e73260de092f882ac76e8a052f
[root@centos01 ~]# docker run -d -p 49000:22 --name ssh1 hub.c.163.com/public/centos:6.7-tools 
   <!--將容器ssh的22號端口映射到宿主機指定的端口上,映射端口範圍是49000~49900-->
2fb5469b67e01fc3fcf653e31dd0462dd9ca484849c34544a7bb55143adc608f
[root@centos01 ~]# docker run -d -p 192.168.100.10:1111:22 --name ssh2 hub.c.163.com/public/centos:6.7-tools 
<!--將容器ssh的22號端口映射到宿主機指定的IP地址和指定端口號上-->
3ee8614b50a777726f1bd857f2b1c57be70b3a06846c3c35de8610511873c962
[root@centos01 ~]# docker run -d -p 192.168.100.10::22 --name ssh3 hub.c.163.com/public/centos:6.7-tools
<!--將容器ssh的22號端口映射到宿主機指定IP地址的任意端口上-->
9de4b73e11db5e25fd9511f7708f812de369673bae79c76880e5493723fcd918
[root@centos01 ~]# docker run -d -p 192.168.100.10:1234:22/tcp --name ssh4 hub.c.163.com/public/centos:6.7-tools 
<!--將容器特定協議的端口號映射到宿主機指定的IP地址和指定端口上-->
ceec5bc53037345d5822a29830b38158d8a0add7b3584e36371a34a0851de043
[root@centos01 ~]# docker port ssh4  <!--查看特定的端口映射信息-->
22/tcp -> 192.168.100.10:1234
[root@centos01 ~]# docker ps  <!--查看是否映射成功-->
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS                          NAMES
ceec5bc53037        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   3 minutes ago       Up 3 minutes        192.168.100.10:1234->22/tcp    ssh4
9de4b73e11db        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   4 minutes ago       Up 4 minutes        192.168.100.10:32769->22/tcp   ssh3
3ee8614b50a7        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   4 minutes ago       Up 4 minutes        192.168.100.10:1111->22/tcp    ssh2
2fb5469b67e0        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   5 minutes ago       Up 5 minutes        0.0.0.0:49000->22/tcp          ssh1
ff30d3777687        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   5 minutes ago       Up 5 minutes        0.0.0.0:32768->22/tcp          ssh

2、容器互聯

容器互聯是通過容器的名稱在容器之間建立一條專門的網絡通信隧道從而實現的互聯。簡單說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息。

在運行docker run命令時,使用--link選項實現容器之間的互聯通信,格式如下:

--link name: alias    #其中name是要連接的容器名稱,alias是這個連接的別名。

容器互聯是通過容器的名稱來執行的,--name選項可以給容器創建一個友好的名稱,這個名稱是唯一的,如果已經命名了一個相同名稱的容器,當要再次使用這個名稱的時候,需要先使用docker rm命令來刪除之前創建的同名容器。

1)容器互聯舉例:

[root@localhost ~]# docker run -it -d -P --name web1  docker.io/httpd /bin/bash  <!--運行容器web1-->
c88f7340f0c12b9f5228ec38793e24a6900084e58ea4690e8a847da2cdfe0b
[root@localhost ~]# docker run -it -d -P --name web2 --link web1:web1 docker.io/httpd /bin/bash
<!--運行容器web2,並關聯web1容器-->
c7debd7809257c6375412d54fe45893241d2973b7af1da75ba9f7eebcfd4d652
[root@localhost ~]# docker exec -it web2 /bin/bash   <!--進入web2容器-->
root@c7debd780925:/usr/local/apache2# cd
root@c7debd780925:~# ping web1       <!--對web1進行ping測試-->
bash: ping: command not found        <!--sorry,提示沒有ping命令,下載一個咯-->
root@c7debd780925:~#apt-get update    <!--更新一下-->
root@c7debd780925:~#apt install iputils-ping     <!--安裝ping命令-->
root@c7debd780925:~#apt install net-tools    <!--這個是安裝ifconfig命令,可以不安裝,我這裏只是做個筆記-->
root@c7debd780925:~# ping web1    <!--再對web1進行ping測試-->
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.114 ms
              ..............<!--省略部分內容-->
<!--ping通了,所以可以說這兩個容器肯定是互聯的咯-->
<!--若此時又創建了web3這個新容器,要同時和web1、web2進行互聯,命令如下:-->
[root@localhost ~]# docker run -dit -P --name web3 --link web1:web1 --link web2:web2 docker.io/httpd /bin/bash
<!--運行容器時,關聯web1和web2。-->
<!--以下是進入web3-->
[root@localhost ~]# docker exec -it web3 /bin/bash
root@433d5be6232c:/usr/local/apache2# cd
<!--以下是安裝ping命令-->
root@433d5be6232c:~# apt-get update
root@433d5be6232c:~# apt install iputils-ping
<!--以下是分別對web1,web2進行ping測試-->
root@433d5be6232c:~# ping web1
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.112 ms
              ..............<!--省略部分內容-->
root@433d5be6232c:~# ping web2
PING web2 (172.17.0.3) 56(84) bytes of data.
64 bytes from web2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.165 ms
64 bytes from web2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.115 ms
              ..............<!--省略部分內容-->
<!--OK,沒問題-->

三、容器中部署MySQL服務併發布

[root@centos01 ~]# ping www.baidu.com      <!--Docker宿主機添加NAT網卡連接公網-->
PING www.a.shifen.com (39.156.66.14) 56(84) bytes of data.
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=128 time=17.6 ms
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=2 ttl=128 time=22.2 ms
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=3 ttl=128 time=18.8 ms
[root@centos01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf  
     <!--開啓路由功能共享Docker容器上網-->
[root@centos01 ~]# sysctl -p   <!--刷新配置-->
net.ipv4.ip_forward = 1 
[root@centos01 ~]# docker run -d -p 192.168.100.10:3306:3306/tcp --name mysql hub.c.163.com/public/centos:6.7-tools    <!--創建安裝MySQL容器併發布端口號-->
ff30d37776877e47a3c39b932610f93b74dd48e73260de092f882ac76e8a052f
[root@centos01 ~]# docker ps |grep mysql     <!--查看運行的mysql容器-->
c63f5cfd4e02        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   13 seconds ago      Up 12 seconds       22/tcp, 192.168.100.10:3306->3306/tcp   mysql
[root@centos01 ~]# docker exec -it mysql /bin/bash   <!--登錄MySQL容器-->
[root@ff30d3777687 /]# yum -y install mysql mysql-server <!--MySQL容器安裝MySQL數據庫-->
[root@ff30d3777687 /]# service mysqld start   <!--啓動MySQL數據庫-->
[root@ff30d3777687 /]# chkconfig --level 35 mysqld on   <!--設置開機自動啓動-->
[root@ff30d3777687 /]# mysqladmin -uroot password 'pwd@123'   
              <!--初始化MySQL數據庫登錄密碼-->
[root@ff30d3777687 /]# mysql -uroot -ppwd@123    <!--登錄MySQL數據庫-->
mysql> grant all on *.* to 'liyanxin'@'192.168.100.10' identified by 'pwd@123';  
  <!--授權特定IP地址和賬戶密碼登錄MySQL容器中的MySQL數據庫-->
[root@centos01 ~]# yum -y install mysql   <!--宿主機安裝MySQL客戶端-->
[root@centos01 ~]# mysql -h 192.168.100.10 -uliyanxin -ppwd@123  
        <!--宿主機登錄MySQL容器發佈的MySQL數據庫-->
MySQL [(none)]> create database liyanxin;   <!--創建一個liyanxin數據庫-->
[root@centos01 ~]# docker exec -it mysql /bin/bash   <!--宿主機登錄MySQL容器-->
[root@ff30d3777687 /]# mysql -uroot -ppwd@123    <!--查看新創建的數據庫是否同步-->
mysql> show databases;   <!--查看數據庫-->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liyanxin           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

四、容器中部署Apache服務併發布

[root@centos01 ~]# docker run -d -p 192.168.100.10:80:80/tcp --name httpd hub.c.163.com/public/centos:6.7-tools   
      <!--創建安裝Apache容器併發布端口號-->
9de4b73e11db5e25fd9511f7708f812de369673bae79c76880e5493723fcd918
[root@centos01 ~]# docker ps |grep httpd  <!--查看運行的httpd容器-->
836394dc1dd3        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   8 seconds ago       Up 7 seconds        22/tcp, 192.168.100.10:80->80/tcp       httpd
[root@centos01 ~]# docker exec -it httpd /bin/bash   <!--登錄httpd容器-->
[root@9de4b73e11db /]# yum -y install httpd  <!--httpd容器中安裝Apache服務-->
[root@9de4b73e11db /]# echo "www.docker.apache.com" > /var/www/html/index.html  
       <!--修改網站主頁內容-->
[root@9de4b73e11db /]# service httpd start  <!--啓動apache服務-->
[root@9de4b73e11db /]# chkconfig --level 35 httpd on  <!--設置開機自動啓動-->
[root@9de4b73e11db /]# tail -f /var/log/httpd/access_log  <!--動態監聽Apache訪問日誌-->
[root@centos01 ~]# curl http://192.168.100.10  
       <!--docker宿主機訪問httpd容器中的Apache服務-->
www.docker.apache.com
[root@centos01 ~]# docker exec -it httpd /bin/bash   <!--登錄httpd容器-->
[root@9de4b73e11db /]# tail -f /var/log/httpd/access_log    <!--查看Apache訪問日誌-->
192.168.100.10 - - [11/May/2020:17:22:07 +0800] "GET / HTTP/1.1" 403 4961 "-" "curl/7.29.0"
192.168.100.10 - - [11/May/2020:17:23:13 +0800] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0"

———————— 本文至此結束,感謝閱讀 ————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章