dockerfile能夠容許咱們本身建立鏡像,經過編寫裏面的下載軟件命令,執行docker build 便可生成鏡像文件。nginx
新建一個目錄test,而後進入這個目錄,建立一個名爲Dockerfile的文件,在裏面寫入如下內容:docker
FROM alpine:latest MAINTAINER sbb CMD echo "hello world"
而後執行下面命令就會生成docker鏡像。shell
$ docker build -t hello-world .
執行docker run hello-world 就會輸出hello world了。
可能會有童鞋會問上面寫的是什麼,下面會根據命令講解的。ubuntu
dockerfile的指令分爲兩種:構建指令和設置指令。
構建命令:用於構建鏡像的時候執行的,不會在該鏡像上的容器裏執行。 設置命令:用於設image的屬性,將會在運行的容器裏執行。ui
指定基礎image,其實大部分鏡像都是基於另外一個鏡像的基礎上去進行修改的,好比說我這個apt-get安裝的nginx是基於ubuntu的(上面例子裏的alpine是docker提供的最小鏡像),這個命令須要放在最前面。
命令格式以下:this
FROM 鏡像名字:版本
構建命令,用於指定建立者是誰。code
構建命令,RUN能夠運行所有被基礎鏡像支持的命令,經常使用於搭建環境。orm
RUN apt-get update RUN apt-get install -y nginx
設置命令,在docker容器啓動時候執行的命令,多個CMD命令存在的話只會運行最後一個CMD命令,所以只須要寫一個CMD命令便可。CMD命令有三種執行方式get
# 方式一,運行一個可執行文件,並提供參數(like an exec, this is the preferred form) CMD ["executable","param1","param2"] # 方式二,利用」/bin/sh -c」去執行, (as a shell) CMD command param1 param2 # 方式三,做爲ENTRYPOINT的默認參數 CMD ["param1", "param2"]
在使用docker run imagename command新建並啓動容器的時候,command會替換dockerfile裏的CMD命令,如上面咱們建立的docker鏡像,若是後面輸入了hello docker,則不會輸出hello world了,原本dockerfile裏面指定了輸出hello world。cmd
$ docker run hello_docker echo "hello docker" hello docker $ docker run hello_docker hello world
設置命令,在docker容器啓動時候執行的命令,一個dockerfile只能有一個ENTRYPOINT命令,有兩種執行方式:
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2
和CMD命令很類似,可是區別在於docker run imagename command的時候,command部分是做爲參數傳給ENTRYPOINT的。
指定容許啓動的用戶,默認是root
指定容器要暴露的端口,經常使用於一些須要通訊的應用,如nginx,就會在dockerfile指定暴露80端口,或者在docker run時指定 --expose=1234,這兩種方式做用相同,可是--expose能夠接受區間範圍的端口做爲參數。
注意expose暴露的是容器的端口,若是外面主機須要經過端口鏈接到這個服務,須要進行一個映射,把容器的端口映射到主機的端口。
docker run -p 本地端口:暴露端口 鏡像
最後附上一個簡單建立nginx的dockerfile
FROM ubuntu MAINTAINER sbb RUN apt-get update RUN apt-get install -y nginx ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] EXPOSE 80