Docker映象構建(五)

AlbenXie發表於2018-07-10

Docker 映象介紹

Docker映象構建分為兩種,一種是手動構建,另一種是Dockerfile(自動構建)

 

手動構建docker映象

案例:我們基於centos映象進行構建,製作自己的nginx映象

1
2
3
docker run --name mynginx -it centos
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y

我們需要修改nginx配置檔案,讓他執行在前臺

1
2
vi /etc/nginx/nginx.conf
daemon off;

修改完之後我們退出,將mynginx本地提交

1
2
3
4
5
6
7
8
9
10
[root@linux-node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
2a8128fa6245        centos              "/bin/bash"         9 minutes ago       Exited (0) 2 minutes ago                       mynginx
[root@linux-node1 ~]# docker commit -m "My Nginx" 2a8128fa6245 shhnwangjian/mynginx:v1
sha256:a8be358735525b50f49ca0bfe2b264427875333dcb1c02495b49dce4d1b10705
[root@linux-node1 ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
shhnwangjian/mynginx   v1                  a8be35873552        39 seconds ago      335.2 MB
nginx                  latest              01f818af747d        3 weeks ago         181.6 MB
centos                 latest              67591570dd29        4 weeks ago         191.8 MB

上面commit命令一行註釋

  • -m 描述
  • 容器ID
  • 第一個shhnwangjian是倉庫的名稱
  • 第二個mynginx是映象的名稱
  • v1 標籤,如果是最後一個版本我們可以打latest

我們現在啟動製作好的nginx映象

1
2
[root@linux-node1 ~]# docker run --name mynginxv1 -d -p 88:80 shhnwangjian/mynginx:v1 nginx
21bb74c3979c26697b7f03a79c3ddb49363791d03160e07fd04617d7e8c00436<br><br>

提示:最後面的nginx不是映象的nginx,而是服務的名稱 

1
2
3
[root@linux-node1 ~]# docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                NAMES
21bb74c3979c        shhnwangjian/mynginx:v1   "nginx"             35 seconds ago      Up 33 seconds       0.0.0.0:88->80/tcp   mynginxv1

Dockerfile

Dockerfile是由一行命令和語句組成的。

案例:我們基於centos映象進行自動構建(dockerfile)

規劃存放dockerfile檔案的目錄結構

1
2
3
4
[root@linux-node1 ~]# cd /root
[root@linux-node1 nginx]# mkdir -p dockerfile/nginx
[root@linux-node1 nginx]# pwd
/root/dockerfile/nginx

建立檔案需注意:D需要大寫,當我們構建dockerfile的時候,docker預設會在我們當前目錄讀取一個名為Dockerfile的檔案。這時候的D必須大寫。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@linux-node1 nginx]# vim Dockerfile
# This Dockerfile
 
# Base image
FROM centos
 
# Maintainer
MAINTAINER shhnwangjian xxx@163.com
 
# Commands
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]

說明:

  • #井號代表註釋
  • #Base image 除了註釋的第一行,必須是FROM,意思就是我們需要告訴dockerfile基礎映象是什麼
  • #Maintainer 維護資訊
  • #Commands 命令
  • #ADD index.html 這個檔案需要我們在當前目錄下有才可以,我們配置我們可以準備好,然後使用ADD命令進行新增或修改
  • EXPOSE 對外埠號
  • CMD ["nginx"] 它要啟動的命令是nginx (就算是nginx服務)

我們寫好Dockerfile還需要一個index.html

1
echo shhnwangjian > index.html

開始構建

1
docker build -t mynginx:v2 .

提示:.代表構建的位置,我們是當前目錄。

構建完成

啟動容器

1
2
[root@linux-node1 nginx]# docker run --name mynginxv2 -d -p 89:80 mynginx:v2
0c4f1703d96c63587825e62225ffc67a172b1233b958a320d881e5560383846d

Dockerfile引數簡介:

  • FROM (指定基礎映象)
  • MAINTAINER (指定維護者資訊)
  • RUN (在命令前面加上RUN)
  • ADD (COPY檔案,會自動解壓)
  • WORKDIR (設定當前工作目錄,類似於cd)
  • VOLUME (設定卷,掛載主機目錄)
  • EXPOSE (指定對外的埠)
  • CMD (指定容器啟動後要乾的事情)

 

Dockerfile引數解釋

FROM

1
格式:FROM<image>或FROM<image>:<tag>。

解釋:FROM是Dockerfile裡的第一條指令(必須是),後面跟有效的映象名(如果該映象你的本地倉庫沒有則會從遠端倉庫Pull取)。然後後面的其它指令FROM的映象中執行。

 

MAINTAINER

1
格式:MAINTAINER <name>

解釋:指定維護者資訊。

 

RUN

1
格式:RUN <command>或 RUN["executable""param1""param2"]。

解釋:執行命令,命令較長使可以使用\來換行。推薦使用上面陣列的格式。

 

CMD

1
2
3
4
格式:
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用;
CMD ["param1","param2"] 提供給ENTRYPOINT的預設引數;

解釋:CMD指定容器啟動時執行的命令,每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最後一條會被執行。如果你在啟動容器的時候也指定的命令,那麼會覆蓋Dockerfile構建的映象裡面的CMD命令。

 

ENTRYPOINT

1
2
3
格式:
ENTRYPOINT ["executable""param1","param2"]
ENTRYPOINT command param1 param2(shell中執行)。

解釋:和CMD類似都是配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。 
  每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。ENTRYPOINT沒有CMD的可替換特性,也就是你啟動容器的時候增加執行的命令不會覆蓋ENTRYPOINT指定的命令。 

    所以生產實踐中我們可以同時使用ENTRYPOINT和CMD。

例:

1
2
ENTRYPOINT ["/usr/bin/rethinkdb"]
CMD ["--help"]

 

USER

1
格式:USER daemon

解釋:指定執行容器時的使用者名稱和UID,後續的RUN指令也會使用這裡指定的使用者。

 

EXPOSE

1
格式:EXPOSE<port> [<port>...]

解釋:設定Docker容器內部暴露的埠號,如果需要外部訪問,還需要啟動容器時增加-p或者-P引數進行分配。

 

ENV

1
2
格式:ENV<key> <value>
ENV <key>=<value> ...

解釋:設定環境變數,可以在RUN之前使用,然後RUN命令時呼叫,容器啟動時這些環境變數都會被指定。

 

ADD

1
2
3
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]

解釋:將指定的<src>複製到容器檔案系統中的<dest>

所有拷貝到container中的檔案和資料夾許可權為0755,uid和gid為0

如果檔案是可識別的壓縮格式,則docker會幫忙解壓縮

 

VOLUME

1
格式:VOLUME ["/data"]

解釋:可以將本地資料夾或者其他container的資料夾掛載到container中。

 

WORKDIR

1
格式:WORKDIR/path/to/workdir

解釋:切換目錄,為後續的RUN、CMD、ENTRYPOINT 指令配置工作目錄。

可以多次切換(相當於cd命令), 也可以使用多個WORKDIR 指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。

例:

1
2
3
4
5
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c

 

ONBUILD 

解釋:指定的命令在構建映象時並不執行,而是在它的子映象中執行。

 

ARG

1
格式:ARG<name>[=<default value>]

解釋:ARG指定了一個變數在docker build的時候使用,可以使用--build-arg <varname>=<value>來指定引數的值,不過如果構建的時候不指定就會報錯。

相關文章