博文結構
Docker鏡像的建立方法
Docker的數據管理
Docker的網絡通訊html
能夠經過Dokcer核心及安裝來安裝Docker及簡單操做。linux
Docker鏡像除了是Docker的核心技術以外,也是應用發佈的標準格式。一個 完整的Docker鏡像能夠支撐- -個Docker 容器的運行,在Docker的整個使用過程當中,進入- -個已經定型的容器以後,就能夠在容器中進行操做,最多見的操做就是在容器中安裝應用服務,若是要把已經安裝的服務進行遷移,就須要把環境及搭建的服務生成新的鏡像。web
(1)基於已有鏡像建立docker
基於已有鏡像建立主要使用docker commit命令。其實質就是把一個容 器裏面運行的程序及該程序的運行環境打包起來生成新的鏡像。apache
命令格式以下:ubuntu
docker commit 【選項】 容器ID/名稱 倉庫名稱:【標籤】vim
參數以下:centos
-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個部分:基礎鏡像信息、維護者信息.鏡像操做指令和容器啓動時執行指令
在編寫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容器中的數據主要有兩種方式:數據卷(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
也能夠指定端口
[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