教你如何寫dockerfile

dockerfile 例子

example
From ubuntu:14:04
MAINTAINER foo bar <[email protected]>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo"\ndaemon off;">>/etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx
VOLUME ["/data","/etc/nginx/site-enable","/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80
EXPOSE 443

指令介紹

FROM: 指定鏡像 名字:標籤
MAINTAINER:維護者信息
RUN:運行shell腳本 一定要加上-y,創建時不能接受輸入
VOLUME: 與主機共享目錄 也可運行時 -v
CMD:啓動腳本
WORKDIR:爲CMD中設置可執行文件設置運行目錄
EXPOSE:與主機相連的端口

From 可以有多個,多個則創建多個鏡像

Maintainer 維護則信息可省略

Run 腳本

RUN shell
RUN [“apt-get”,“install”,"-y",“nginx”] #非shell
可執行文件 形參
run的執行結果會被緩存,下次創建不想緩存build --no-cache

CMD 啓動腳本

CMD shell
CMD [“可執行文件”,“形參”] #無shell

ENTRYPOINT[“可執行文件”] 而後 CMD[“形參”] 分開寫

只能執行一次
docker run --entrypoint

EXPOSE 80 443 對主機露端口號

ENV 環境變量

ENV HELLO 1234

ADD 用於向鏡像添加文件,要複製的文件,以相對路徑,當前目錄以內

還會解壓縮 解包 對於網絡文件只解壓縮不解包(tar)
外部文件
網絡文件
curl http:/xxxx/tar.gz | tar -xz

COPY 用於添加文件

但不會解壓縮包,不能用於網絡文件

VOLUME 將目錄存儲到主機內

VOLUME /data
VOLUME ["/data","/var/log/hello"]
不能指定主機目錄
只有在docker run時指定,否則用默認的

USER <用戶名>

USER後面所有的 RUN CMD ENTRYPOINT 都是以該用戶執行的

WORKDIR

爲那些命令設置工作路徑
可更換以改變路徑

ONBUILD 觸發式,當別人用你的鏡像的時候,FROM 後面就會執行

ONBUILD RUN touch /hello.txt

可查看 docker inspect -f “{{.ContainerConfig.OnBuild}}” example

構建命令

build命令創建鏡像
docker build <選項> <dockerfile路徑> --tag 名字:標籤 .
docker images 查看
.dockerignore 忽略某些目錄 ,遵循go語言規則
經常忽略.git .svn這類

運行選項(在構建完成,後追加到生成容器階段)

docker run --name hello-nginx -d -p 80:80 -v /root/data:data hello:0.1
docker -d 後臺運行
-p 端口映射
-v 文件映射
-e 設置環境變量
–rm 一次性用完即毀壞
–privileged 容器可以有主機內核功能

查看歷史

docker history <鏡像名orID>:<標籤>

複製文件

docker cp hello-nginx:/etc/nginx/nginx.conf ./
docker cp <容器名>:<路徑><主機路徑>

從容器中創建鏡像

docker commit 從容器
docker commit -a “Foo Bar [email protected]” -m “add hello.txt” hello-nginx hello:0.2
-a
-m
提交用戶註冊信息

查看容器文件修改與鏡像對比

docker diff hello-nginx
A添加
C修改
D刪除

查看內容

docker inspect <內容>

上傳私有倉庫時,先要打上標籤

docker tag : <私有倉庫url>:/:
docker push :/:

別名

docker run --link <別的容器名>:<在本容器內叫什麼>

docker ps 查看端口號
引用時<別名>:<端口號>

數據卷的概念

主機中掛載到docker容器內的,任何修改都會保存的。
-v [主機(省略就會掛到/var/…docker)]:[容器內]

數據卷容器

docker run -i -t --volumes-from hello-volume(容器名) --name www
這樣那些數據卷就會自動掛載到這個容器www中了

創建基礎鏡像步驟

ubuntu

  1. 安裝bootstrap工具
    sudo apt-get install debootstrap
    sudo debootstrap trusty trusty #ubuntu版本代號 目錄
    tar -C trusty -c . | sudo docker import - trusty
    打包文件 並且 傳給 docker import
    centos
    省略

空鏡像
tar cv --files-from /dev/null | sudo dcoker import - scratch
打空包
Dockerfile
From scratch
ADD ./hello /hello
CMD ["/hello"]
ADD 鏡像中要包含的文件 <本地路徑> <鏡像路徑>

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