docker基本入門之後,能夠試試打包docker鏡像與dockerfile了html
docker hub倉庫有2類倉庫,用戶倉庫和頂層倉庫,用戶倉庫由docker用戶建立的,頂層倉庫由docker內部的人來管理的。倉庫裏存放的是鏡像文件,那麼問題來了 ,怎麼去建立鏡像呢?node
構建docker鏡像的有2種方法:python
notice:
you should remeber , we are not create new image from 0。而是基於一個已有的基礎鏡像,如CentOs來構建新鏡像而已。若是真的想從0構建一個全新的鏡像,能夠參考: https://docs.docker.com/engine/userguide/eng-image/baseimages/linux
咱們先啓動一個container,而後安裝個python3。nginx
咱們先啓動一個container,而後安裝個python3, [root@salt docker]# docker run --name python3 -i -t centos /bin/bash #省去安裝py3步驟。。。。。。 [root@cb6903f738e1 python3.5.2]# exit #安裝好後退出 [root@salt docker_pratice]# docker commit -m="install python3" --author='Leo' python3 1403208717:test
參數解釋:web
[root@salt docker]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 1403208717 latest 001d2ee1399c 12 minutes ago 840.4 MB
docker經過load放來導入其餘的鏡像文件。redis
[root@linux-node2 ~]# docker load < docker_httpd.iso # docker_http.iso是一個標準的docker鏡像文件 [root@linux-node2 ~]# docker images # 導入成功 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE httpd latest 4f1d18bcf20b 7 weeks ago 531.5 MB
咱們首先建立一個目錄用來存放dockerfile,這個目錄成爲構建環境(base environment),docker稱爲這個爲上下文或者構建上下文(build context)。docker會在構建鏡像時將構建上下文和該上下文的文件和目錄上傳到Docker守護進程。這樣docker守護進程就能直接訪問你想在鏡像中存儲的任何代碼,文件或者其餘數據。
下面看看DockerFIle的樣例:docker
[root@salt docker_pratice]# mkdir /docker_pratice/ [root@salt ~]# cat /docker_pratice/Dockerfile # this is a comment # 註釋 FROM 1403208717 #從哪一個基礎鏡像開始 MAINTAINER Docker Newbee <newbee@docker.com> #代表做者信息 RUN yum -y update # 須要運行命令,運行成功後提交該鏡像 RUN yum -y insall httpd # 須要運行命令,運行成功後提交該鏡像 RUN echo "Hi, i am in your container" >/var/www/html/index.html #同上 EXPOSE 80
流程講解:
每條指令都會建立一個新的鏡像層並對鏡像進行提交。docker大致上按照以下流程執行DockerFile中的指令。apache
確認無誤後,咱們開始執行dockerfile文件:
[root@salt docker_pratice]# docker build -t="test/run_httpd" . --no-cache
ubuntu
構建緩存帶來的好處就是,咱們能夠實現簡單的Dockerfile模版(好比在Dockerfile文件頂部增長包倉庫或者更新包,從而儘量確保緩存命中)。咱們通常都會在本身的Dockerfile文件頂部使用相同的指令集模版,好比對Ubuntu,可使用下面的代碼:
FROM ubuntu:14.04, MAINTAINER James Turnbull "liaojiafa@qq.com" ENV REFRESHED_AT 2016-12-05 RUN apt-get -qq update
讓咱們一步步來分析一下這個新的Dockerfile。首先,我經過FROM指令爲新鏡像設置了一個基礎鏡像ubuntu:14.04。接着,我又使用MAINTANINER指令添加了本身的詳細信息聯繫信息,以後我又使用了一個名爲REFERSHED_AT的環境變量,這個環境變量用來代表該鏡像模版最後的更新時間。最後,我使用run指令來運行apt-get -qq update。
有了這個模版,若是想刷新一個構建,只須要修改ENV指令中的日期。這使DOcker在命令中ENV指令時開始重置這個緩存,並運行後續指令而無需依賴該緩存。也就是說,RUN apt-get update這條指令就會被再次執行,包緩存也會被刷新爲最新內容。能夠擴展此模版,好比適配到不一樣的平臺或者添加額外的需求。好比像下面的的同樣:
FROM centos MAINTAINER Leo liaojiafa@exmpale.com ENV REFRESHED_AT 2016-12-09 RUN yum -y -q update
[root@salt var]# docker run -tdi -p 80:80 --name apache_web basic_sys -p : hostip : host_port : docker_container's port
rmi緊接着後面鏡像ID。
[root@salt var]# docker rmi 1403208717
[root@salt ~]#docker run -p 5000:5000 registry
[root@salt ~]#docker images test/run_httpd
[root@salt nginx]# docker tag 9d16dcc5a7a3 127.0.0.1:5000/test/run_httpd
[root@salt nginx]# docker push 127.0.0.1:5000/test/run_httpd
首先建立一個redis容器
[root@salt nginx]#docker -ti --name redis xxxx
[root@salt ~]# docker run -ti -p 0.0.0.0:80:80 --name httpweb --link redis:db -v /var/www/html/:/var/www/html/:ro test/run_httpd [root@d71914aabd87 redis-3.2.3]# redis-cli -h db -p 5555 db:5555> keys * (empty list or set)
咱們能夠查看/etc/hosts文件裏面,能夠看到和子容器對應的信息的。
此時可以訪問http,也可以鏈接redis了。容器與容器,宿主機和容器的/var/www/html也是共享的。
-v /var/www/html/:/var/www/html/:ro
表示把本地宿主機的/var/www/html映射到容器的/var/www/html,ro表示爲Only read,也能夠爲rw權限。