docker學習系列(二):使用Dockerfile建立本身的鏡像

dockerfile能夠容許咱們本身建立鏡像,經過編寫裏面的下載軟件命令,執行docker build 便可生成鏡像文件。nginx

初嘗dockerfile

新建一個目錄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命令

dockerfile的指令分爲兩種:構建指令和設置指令。
構建命令:用於構建鏡像的時候執行的,不會在該鏡像上的容器裏執行。 設置命令:用於設image的屬性,將會在運行的容器裏執行。ui

FROM

指定基礎image,其實大部分鏡像都是基於另外一個鏡像的基礎上去進行修改的,好比說我這個apt-get安裝的nginx是基於ubuntu的(上面例子裏的alpine是docker提供的最小鏡像),這個命令須要放在最前面。
命令格式以下:this

FROM 鏡像名字:版本

MAINTAINER

構建命令,用於指定建立者是誰。code

RUN

構建命令,RUN能夠運行所有被基礎鏡像支持的命令,經常使用於搭建環境。orm

RUN apt-get update
RUN apt-get install -y nginx

CMD

設置命令,在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

ENTRYPOINT

設置命令,在docker容器啓動時候執行的命令,一個dockerfile只能有一個ENTRYPOINT命令,有兩種執行方式:

ENTRYPOINT ["executable", "param1", "param2"] 
ENTRYPOINT command param1 param2

和CMD命令很類似,可是區別在於docker run imagename command的時候,command部分是做爲參數傳給ENTRYPOINT的。

USER

指定容許啓動的用戶,默認是root

EXPOSE

指定容器要暴露的端口,經常使用於一些須要通訊的應用,如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
相關文章
相關標籤/搜索