Docker數據管理與網絡通信

博文結構
Docker鏡像的創建方法
Docker的數據管理
Docker的網絡通信

可以通過Dokcer核心及安裝來安裝Docker及簡單操作。

一.Docker鏡像的創建方法

Docker鏡像除了是Docker的核心技術之外,也是應用發佈的標準格式。一個 完整的Docker鏡像可以支撐- -個Docker 容器的運行,在Docker的整個使用過程中,進入- -個已經定型的容器之後,就可以在容器中進行操作,最常見的操作就是在容器中安裝應用服務,如果要把已經安裝的服務進行遷移,就需要把環境及搭建的服務生成新的鏡像。

(1)基於已有鏡像創建

基於已有鏡像創建主要使用docker commit命令。其實質就是把一個容 器裏面運行的程序及該程序的運行環境打包起來生成新的鏡像。

命令格式如下:

docker commit 【選項】 容器ID/名稱 倉庫名稱:【標籤】

參數如下:

-m : 說明信息
-a  : 作者信息
-p  : 生成過程中停止鏡像來創建新鏡像

(1)先安裝Docker,在創建個鏡像

[root@localhost ~]# yum -y install docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# mount /dev/cdrom /media/
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@localhost ~]# cd /media/
[root@localhost media]# ls
apache-tomcat-8.5.16.tar.gz  dhcp          jdk-8u91-linux-x64.tar.gz
centos                       httpd         registry.tar.gz
centos6                      httpd_centos  ubuntu-12.04-x86_64-minimal.tar.gz
[root@localhost media]# docker load < dhcp  \\zair載入鏡像到本地
[root@localhost media]# docker images  \\查看鏡像
[root@localhost media]# docker create -it docker.io/networkboot/dhcpd /bin/bash   \\創建容器
dfbe3a15f462d82674cfdfe87dfb7c4b4b1dcf2267e5c0043510cbe10f11a65b
[root@localhost /]# docker ps -a  \\查看容器
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS              PORTS               NAMES
dfbe3a15f462        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   About a minute ago   Created                                 determined_dubinsky
[root@localhost /]# docker start dfbe3a15f462  \\啓動容器
dfbe3a15f462
[root@localhost /]# docker exec -it dfbe3a15f462  /bin/bash
root@dfbe3a15f462:/# touch 123  \\創建倆個文件
root@dfbe3a15f462:/# touch 456

(2) 啓動一個鏡像,在容器裏做修改,然後將修改後的容器提交爲新的鏡像,需要記住該容器的D號,例如:

[root@localhost /]# docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
dfbe3a15f462        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   5 minutes ago       Up 2 minutes                            determined_dubinsky

(3)使用dockercommit命令創建一個新鏡像,如下:

[root@localhost /]# docker commit -m "newdhcp" -a "xws" dfbe3a15f462 docker:mydhcp
sha256:2c1acb192f78bbbb584fc52954a179eb0f10730e0cd58d120d952439ead45b00

(4)創建完成後.會返回新創建鏡像的ID信息。查看本地鏡像列表可以看到新創建的鏡像信息:

[root@localhost /]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE
docker                        mydhcp              2c1acb192f78        About a minute ago   125 MB
docker.io/networkboot/dhcpd   latest              6f98b6b9b486        19 months ago        125 MB

(2)基於本地模板創建

通過導入操作系統模板文件可以生成鏡像,模板可以從OPENVZ 開源項目下載,下載地址爲
http://openvz , org/Download/template/ precreated.

用 命令下載如下

wget http://down1oad. openvz . org/ template/precreated/ubuntu-12.04-x86_ 64-minimal.tar.gz

(3)基於Dockerfile創建

除了手動生成Docker鏡像之外,可以使用Dockerfile自動生成鏡像。Dockerfile 是由-組指令組成的文件,其中每條指令對應Linux中的一條命令, Docker 程序將讀取Dockerfile中的指令生成指定鏡像。

Dockerfile結構大致分爲4個部分:基礎鏡像信息、維護者信息.鏡像操作指令和容器啓動時執行指令

Docker數據管理與網絡通信

在編寫Dockerfile時,有嚴格的格式需要遵循:第一行必須使用FROM指令指明所基於的鏡像名稱:之後使用MAINTAINER指令說明維護該鏡像的用戶信息:然後是鏡像操作相關指令,如RUN指令,每運行一條指令,都會給基礎鏡像添加新的一層;最後使用CMD指令來指定啓動容器時要運行的命令操作。

案例:使用Dockerfile創建鏡像並在容器中運行

1.建立工作目錄

[root@localhost /]# mkdir apache
[root@localhost /]# cd apache/

2.創建並編寫Dockerfile文件

[root@localhost media]# docker load < centos   \\先把centos載入到本地
[root@localhost apache]# vim Dockerfile

FROM centos   \\基於centos基礎鏡像
MAINTAINER The Centos projier  \\維護該鏡像用戶信息,後面隨便寫
RUN yum -y update   \\鏡像操作指令安裝apache軟件包
RUN yum -y install httpd
EXPOSE 80   \\開啓80端口
ADD index.html /var/www/html/index.html  //複製網站首頁文件
ADD run.sh /run.sh   //將執行腳本複製到鏡像中
RUN chmod 775 /run.sh
RUN systemctl disable httpd    \\設置apache開啓不啓動
CMD 【“/run.sh”】    \\啓動容器執行腳本

3.編寫執行腳本內容

[root@localhost apache]# vim run.sh
#!/bin/bash                               
rm -rf /run/httpd/*                         \\清理http的緩存
exec /usr/sbin/apachectl -D FOREGROUND   \\啓動apache服務

4.創建測試頁面

[root@localhost apache]# echo "asd" >index.html
[root@localhost apache]# ls
Dockerfile  index.html  run.sh

5.使用Dockerfile生成鏡像

編寫完成Dockerfile及相關內容之後,可以通過docker build 命令來創建鏡像。

docker build 【選項】 路徑

使用方纔編寫的dockerfile自動生成鏡像

[root@localhost apache]# docker build -t httpd:centos .

在自動生成鏡像的命令指定鏡像後,一定不要忘記寫新生成鏡像的
存放路徑,也就是空格後的一個”."代表當前路徑,否則會報錯。

6.使用新的鏡像運行容器

將新生成的鏡像加載到容器中運行

[root@localhost /]# docker run -d -p 12345:80 httpd:centos

ee9adf324443b006ead23f2d9c71f86d1a4eb73358fb684ee3a2d058a0ac4243

[root@localhost apache]# docker ps -a

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                   NAMES
99e9234cefe5        httpd:centos                  "/run.sh"                8 seconds ago       Up 7 seconds        0.0.0.0:12345->80/tcp   youthful_lumiere
dfbe3a15f462        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   56 minutes ago      Up 53 minutes                               determined_dubinsky

//使用新生成的鏡像加載到容器中運行
//“-p”選項實現從本地端口12345到容器中80端口的映射

用瀏覽器訪問網頁

Docker數據管理與網絡通信

二.Docker的數據管理

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

(1)數據卷

數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操作立刻可見,並且更新數據不會影響鏡像.從而實現數據在宿主機與容器之間的遷移。數據卷的使用類似於Linux下對目錄進行的mount操作。

1.創建數據卷

[root@localhost /]# docker run -d -v /data1 -v /data2 --name web httpd:centos
4944c63124d2f96bedd78b4016e6d96e464089626e97b913b06ec888e7ab8f65
[root@localhost /]# docker exec -it web /bin/bash  \\進入容器可以看到已經和宿主機一樣了
[root@4944c63124d2 /]# ls
anaconda-post.log  boot   data2  etc   lib    media  opt   root  run.sh  srv  tmp  var
bin                data1  dev    home  lib64  mnt    proc  run   sbin    sys  usr
[root@4944c63124d2 /]# 

(2)掛載主機目錄作爲數據卷

例如

[root@localhost /]# docker run -d -v /var/www:/xws --name web-1 httpd:centos
05079057bf0c7c47b14fd457d1a5df0e29f080b6103753399654ef9d0aa4bf0f

中間:以前爲宿主機的目錄,後面爲容器裏的目錄

[root@localhost /]# cd /var/www/
[root@localhost www]# touch asdasdasd
[root@localhost www]# ls
asdasdasd

進入容器裏看一下

[root@localhost /]# docker exec -it web-1 /bin/bash
[root@05079057bf0c /]# ls     
anaconda-post.log  boot  etc   lib    media  opt   root  run.sh  srv  tmp  var
bin                dev   home  lib64  mnt    proc  run   sbin    sys  usr  xws
[root@05079057bf0c /]# cd xws
[root@05079057bf0c xws]# ls
asdasdasd

可以看到宿主機與容器共享

(2)數據卷容器

[root@localhost /]# docker run -it --volumes-from web --name 777 httpd:centos /bin/bash
[root@d6324596cb2c /]# cd data1
[root@d6324596cb2c data1]# touch file
[root@d6324596cb2c data1]# exit
exit
[root@localhost /]# docker exec -it web /bin/bash
[root@4944c63124d2 /]# ls
123                bin   data1  dev  home  lib64  mnt  proc  run     sbin  sys  usr
anaconda-post.log  boot  data2  etc  lib   media  opt  root  run.sh  srv   tmp  var
[root@4944c63124d2 /]# cd data1
[root@4944c63124d2 data1]# ls
file
[root@4944c63124d2 data1]# 

可以看到倆個容器共享

(3)Docker網絡通信

Docker提供了映射容器端口到宿主機和容器互聯機制來爲容器提供網絡服務。
實現端口映射,需要在運行docker run命令時使用-P (大寫)選項實現隨機映射,Docker 會隨機映射一個端口範圍在49000~ 49900的端口到容器內部開放的網絡端口,

1.端口映射

[root@localhost /]# docker run -d -P httpd:centos
70762709d90a8365803b8b13be02e06e2f9c0b4fdb8624bad01d579817809
[root@localhost /]# docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                     PORTS                   NAMES
70762709d90a        httpd:centos                  "/run.sh"                5 seconds ago       Up 4 seconds               0.0.0.0:**32768**->80/tcp   kickass_bhaskara

可以看到端口變爲32768

Docker數據管理與網絡通信

也可以指定端口

[root@localhost /]# docker run -d -p 123:80 httpd:centos
9c7b1b3989b30f44c22276a62674e565daf410e05bdf0b4892c09dca22662253

2.容器互聯

容器互聯是通過容器的名稱在容器間建立一條 專門的網絡通信隧道從而實現的互聯。簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息,在運行docker run 命令時使用--link選項實現容器之間的互聯通信。
格式爲:

--link name:alias \別名

  • 創建源容器
[root@localhost /]# docker run -d -P --name web1 httpd:centos
0105f396c69b15557af4c15a62143872e725a28050075b554a4d2765a504d558
  • 創建接收容器

使用docker run 命令建立容器B,-- -name指定名稱爲web2. --link 指定連接容器以實現容器互聯。

[root@localhost /]# docker run -d -P --name web2 --link web1:web1 httpd:centos
10413ec7492d1d4bab724b4ecf2c2378dae6f496d14c2d68d27ee29b6a26bb1a
  • 測試容器互聯
[root@localhost /]#** docker exec -it web2 /bin/bash**
[root@10413ec7492d /]# **ping web1**
PING web1 (172.17.0.8) 56(84) bytes of data.
64 bytes from web1 (172.17.0.8): icmp_seq=1 ttl=64 time=0.153 ms
64 bytes from web1 (172.17.0.8): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from web1 (172.17.0.8): icmp_seq=3 ttl=64 time=0.064 ms
64 bytes from web1 (172.17.0.8): icmp_seq=4 ttl=64 time=0.074 ms
64 bytes from web1 (172.17.0.8): icmp_seq=5 ttl=64 time=0.065 ms
64 bytes from web1 (172.17.0.8): icmp_seq=6 ttl=64 time=0.065 ms
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章