docker學習系列(二):使用Dockerfile創建自己的鏡像


dockerfile可以允許我們自己創建鏡像,通過編寫里面的下載軟件命令,執行docker build 即可生成鏡像文件。

初嘗dockerfile

新建一個目錄test,然后進入這個目錄,創建一個名為Dockerfile的文件,在里面寫入以下內容:

FROM alpine:latest
MAINTAINER sbb
CMD echo "hello world"

然后執行下面命令就會生成docker鏡像。

$ docker build -t hello-world .

執行docker run hello-world 就會輸出hello world了。
可能會有童鞋會問上面寫的是什么,下面會根據命令講解的。

dockerfile命令

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

FROM

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

FROM 鏡像名字:版本

MAINTAINER

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

RUN

構建命令,RUN可以運行全部被基礎鏡像支持的命令,常用於搭建環境。

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

CMD

設置命令,在docker容器啟動時候執行的命令,多個CMD命令存在的話只會運行最后一個CMD命令,因此只需要寫一個CMD命令即可。CMD命令有三種執行方式

# 方式一,運行一個可執行文件,並提供參數(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。

$ 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM