如何用Dockerfile创建镜像

\u5982\u4f55\u7528Dockerfile\u521b\u5efa\u955c\u50cf

Dockerfile\u7ed3\u6784
dockerfile\u75314\u90e8\u5206\u4fe1\u606f\u7ec4\u6210\uff1a\u57fa\u7840\u955c\u50cf\u4fe1\u606f\u3001\u7ef4\u62a4\u8005\u4fe1\u606f\u3001\u955c\u50cf\u64cd\u4f5c\u6307\u4ee4\u548c\u5bb9\u5668\u542f\u52a8\u65f6\u6267\u884c\u6307\u4ee4\u3002

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# Base image to use, this must be set as the first line
FROM ubuntu

# Maintainer: docker_user (@docker_user)
MAINTAINER docker_user [email protected]

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx


\u5176\u4e2d#\u8868\u6ce8\u91ca\uff0c\u53ef\u4ee5\u6807\u6ce8\u4e00\u4e9b\u8bf4\u660e\u6027\u7684\u6587\u5b57\u3002
FROM\u5173\u952e\u5b57\u6307\u5b9a\u955c\u50cf\u7684\u6765\u6e90\uff0c\u9ed8\u8ba4\u4e3aDockerHub\uff0c\u4e5f\u53ef\u4ee5\u5199\u79c1\u6709\u4ed3\u5e93\u7684\u955c\u50cf\uff0c\u4f8b\u5982\uff1alocalhost\uff1a5000/centos:6.7\uff0c\u5982\u679c\u672c\u5730\u5df2\u7ecf\u5b58\u5728\u6307\u5b9a\u7684\u955c\u50cf\u540d\u79f0\uff0c\u5219\u4f1a\u4ece\u672c\u5730\u7f13\u5b58\u76f4\u63a5\u83b7\u53d6\u3002MAINTAINER \u6307\u5b9a\u955c\u50cf\u7684\u4f5c\u8005\uff0c\u4e4b\u540e\u4e3a\u955c\u50cf\u64cd\u4f5c\u6267\u884cRUN\u3001ADD\u7b49\uff0c\u6700\u540e\u662f\u5bb9\u5668\u542f\u52a8\u65f6\u53d1\u8d77\u7684\u6307\u4ee4\u3002
Dockerfile\u4e2d\u7684\u6307\u4ee4
FROM: \u6307\u5b9a\u955c\u50cf\u540d\u79f0\uff0c\u683c\u5f0f\u4e3aFROM \u6216FROM :\uff0c\u4f8b\u5982FROM ubuntu \u6216 FROM ubuntu:12.04\u3000
MAINTAINER: \u955c\u50cf\u4f5c\u8005 \uff0c\u683c\u5f0f\u4e3a MAINTAINER
RUN\uff1a\u683c\u5f0f\u4e3a RUN \u6216 RUN ["executable", "param1", "param2"]\u3002
\u524d\u8005\u5c06\u5728 shell \u7ec8\u7aef\u4e2d\u8fd0\u884c\u547d\u4ee4\uff0c\u5373 /bin/sh -c\uff1b\u540e\u8005\u5219\u4f7f\u7528 exec \u6267\u884c\u3002\u6307\u5b9a\u4f7f\u7528\u5176\u5b83\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u5b9e\u73b0\uff0c\u4f8b\u5982 RUN ["/bin/bash", "-c", "echo hello"]\u3002
\u6bcf\u6761 RUN \u6307\u4ee4\u5c06\u5728\u5f53\u524d\u955c\u50cf\u57fa\u7840\u4e0a\u6267\u884c\u6307\u5b9a\u547d\u4ee4\uff0c\u5e76\u63d0\u4ea4\u4e3a\u65b0\u7684\u955c\u50cf\u3002\u5f53\u547d\u4ee4\u8f83\u957f\u65f6\u53ef\u4ee5\u4f7f\u7528 \ \u6765\u6362\u884c\u3002
CMD:\u652f\u6301\u4e09\u79cd\u683c\u5f0f
\u3000\u30001.CMD ["executable","param1","param2"] \u4f7f\u7528 exec \u6267\u884c\uff0c\u63a8\u8350\u65b9\u5f0f\uff1b
\u3000\u30002.CMD command param1 param2 \u5728 /bin/sh \u4e2d\u6267\u884c\uff0c\u63d0\u4f9b\u7ed9\u9700\u8981\u4ea4\u4e92\u7684\u5e94\u7528\uff1b
\u3000\u30003.CMD ["param1","param2"] \u63d0\u4f9b\u7ed9 ENTRYPOINT \u7684\u9ed8\u8ba4\u53c2\u6570\uff1b
\u6307\u5b9a\u542f\u52a8\u5bb9\u5668\u65f6\u6267\u884c\u7684\u547d\u4ee4\uff0c\u6bcf\u4e2a Dockerfile \u53ea\u80fd\u6709\u4e00\u6761 CMD \u547d\u4ee4\u3002\u5982\u679c\u6307\u5b9a\u4e86\u591a\u6761\u547d\u4ee4\uff0c\u53ea\u6709\u6700\u540e\u4e00\u6761\u4f1a\u88ab\u6267\u884c\u3002\u5982\u679c\u7528\u6237\u542f\u52a8\u5bb9\u5668\u65f6\u5019\u6307\u5b9a\u4e86\u8fd0\u884c\u7684\u547d\u4ee4\uff0c\u5219\u4f1a\u8986\u76d6\u6389 CMD \u6307\u5b9a\u7684\u547d\u4ee4\u3002
EXPOSE:\u683c\u5f0f\u4e3a EXPOSE [...]\u3002
\u544a\u8bc9 Docker \u670d\u52a1\u7aef\u5bb9\u5668\u66b4\u9732\u7684\u7aef\u53e3\u53f7\uff0c\u4f9b\u4e92\u8054\u7cfb\u7edf\u4f7f\u7528\u3002\u5728\u542f\u52a8\u5bb9\u5668\u65f6\u9700\u8981\u901a\u8fc7 -P\uff0cDocker \u4e3b\u673a\u4f1a\u81ea\u52a8\u5206\u914d\u4e00\u4e2a\u7aef\u53e3\u8f6c\u53d1\u5230\u6307\u5b9a\u7684\u7aef\u53e3\u3002
ENV:\u683c\u5f0f\u4e3a ENV \u3002 \u6307\u5b9a\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u4f1a\u88ab\u540e\u7eed RUN \u6307\u4ee4\u4f7f\u7528\uff0c\u5e76\u5728\u5bb9\u5668\u8fd0\u884c\u65f6\u4fdd\u6301\u3002\u8fd9\u5c31\u5bf9\u5e94\u7a0b\u5e8f\u8bed\u8a00\u4e2d\u7684\u53d8\u91cf\u5b9a\u4e49\uff0c\u53ef\u5728\u9700\u8981\u7684\u65f6\u5019\u5f15\u7528\u3002\u4f8b\u5982\uff1a

1
2
3
4

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && \u2026
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH


ADD:\u683c\u5f0f\u4e3a ADD \u3002
\u8be5\u547d\u4ee4\u5c06\u590d\u5236\u6307\u5b9a\u7684 \u5230\u5bb9\u5668\u4e2d\u7684 \u3002 \u5176\u4e2d \u53ef\u4ee5\u662fDockerfile\u6240\u5728\u76ee\u5f55\u7684\u4e00\u4e2a\u76f8\u5bf9\u8def\u5f84\uff1b\u4e5f\u53ef\u4ee5\u662f\u4e00\u4e2a URL\uff1b\u8fd8\u53ef\u4ee5\u662f\u4e00\u4e2a tar \u6587\u4ef6\uff08\u81ea\u52a8\u89e3\u538b\u4e3a\u76ee\u5f55\uff09\u3002
COPY:\u683c\u5f0f\u4e3a COPY \u3002
\u590d\u5236\u672c\u5730\u4e3b\u673a\u7684 \uff08\u4e3a Dockerfile \u6240\u5728\u76ee\u5f55\u7684\u76f8\u5bf9\u8def\u5f84\uff09\u5230\u5bb9\u5668\u4e2d\u7684 \u3002\u5f53\u4f7f\u7528\u672c\u5730\u76ee\u5f55\u4e3a\u6e90\u76ee\u5f55\u65f6\uff0c\u63a8\u8350\u4f7f\u7528 COPY\u3002
COPY\u548cADD\u7684\u4e0d\u540c\u5c31\u662f\uff1aADD\u591a\u4e86\u81ea\u52a8\u89e3\u538b\u548c\u652f\u6301URL\u8def\u5f84\u7684\u529f\u80fd\u3002
ENTRYPOINT\uff1a
\u4e24\u79cd\u683c\u5f0f\uff1a
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2\uff08shell\u4e2d\u6267\u884c\uff09\u3002
\u914d\u7f6e\u5bb9\u5668\u542f\u52a8\u540e\u6267\u884c\u7684\u547d\u4ee4\uff0c\u5e76\u4e14\u4e0d\u53ef\u88ab docker run \u63d0\u4f9b\u7684\u53c2\u6570\u8986\u76d6\u3002
\u6bcf\u4e2a Dockerfile \u4e2d\u53ea\u80fd\u6709\u4e00\u4e2a ENTRYPOINT\uff0c\u5f53\u6307\u5b9a\u591a\u4e2a\u65f6\uff0c\u53ea\u6709\u6700\u540e\u4e00\u4e2a\u8d77\u6548\u3002
CMD\u548cENTRYPOINT\u6bd4\u8f83\uff1a\u4e24\u4e2a\u547d\u4ee4\u90fd\u662f\u53ea\u80fd\u4f7f\u7528\u4e00\u6b21\uff0c\u5e76\u4e14\u90fd\u662f\u5728\u6267\u884cdocker run\u6307\u4ee4\u65f6\u8fd0\u884c\uff0c\u5982\u679c\u6709\u591a\u4e2a\uff0c\u53ea\u6267\u884c\u6700\u540e\u4e00\u6761\u3002
\u4e24\u8005\u7684\u4e0d\u540c\u5728\u4e8e\u53c2\u6570\u7684\u4f20\u9012\u65b9\u5f0f\uff0c\u5982\u679c\u5728Dockerfile\u4e2d\u5b9a\u4e49\u5982\u4e0b\u6307\u4ee4

1

CMD echo hello


\u6216

1

ENTRYPOINT ["echo","hello"]\u3000


\u90a3\u4e48\u5728\u8fd0\u884c\u547d\u4ee4docker run containerId echo hello\u65f6\uff0c\u6307\u5b9a\u4e86CMD\u7684\u8f93\u5165\u7ed3\u679c\u4e3aworld\uff0c\u53ef\u4ee5\u770b\u51faDockerfile\u4e2d\u6307\u5b9a\u7684\u547d\u4ee4\u88ab\u8986\u76d6\u4e86\uff0c\u800c\u6307\u5b9a\u4e86ENTRYPOINT\u65f6\uff0c\u8f93\u51fa\u7ed3\u679c\u4e3ahello echo world\uff0c\u53ef\u4ee5\u770b\u51fa\u6307\u5b9a\u7684\u547d\u4ee4\u88ab\u4f5c\u4e3aENTRYPOINT\u6307\u5b9a\u6307\u4ee4\u7684\u53c2\u6570\u4e86\u3002

VOLUME:\u683c\u5f0f\u4e3a VOLUME ["/data"]\u3002\u521b\u5efa\u4e00\u4e2a\u53ef\u4ee5\u4ece\u672c\u5730\u4e3b\u673a\u6216\u5176\u4ed6\u5bb9\u5668\u6302\u8f7d\u7684\u6302\u8f7d\u70b9\uff0c\u4e00\u822c\u7528\u6765\u5b58\u653e\u6570\u636e\u5e93\u548c\u9700\u8981\u4fdd\u6301\u7684\u6570\u636e\u7b49\u3002\u4e0d\u8fc7\u6b64\u5c5e\u6027\u5728Dockerfile\u4e2d\u6307\u5b9a\u5e76\u6ca1\u6709\u4ec0\u4e48\u610f\u4e49\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u6307\u5b9a\u672c\u5730\u4e3b\u673a\u7684\u76ee\u5f55\u3002\u5982\u679c\u9700\u8981\u6307\u5b9a\u6302\u8f7d\u70b9\u53ef\u4ee5\u5728\u6267\u884cdocker run\u547d\u4ee4\u65f6\u6307\u5b9a\uff1a

1

docker run -it -v /home/fengzheng/ftp/:/data 859666d51c6d /bin/bash


USER:\u683c\u5f0f\u4e3a USER daemon\u3002\u6307\u5b9a\u8fd0\u884c\u5bb9\u5668\u65f6\u7684\u7528\u6237\u540d\u6216 UID\uff0c\u540e\u7eed\u7684 RUN \u4e5f\u4f1a\u4f7f\u7528\u6307\u5b9a\u7528\u6237\u3002
\u5f53\u670d\u52a1\u4e0d\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u6307\u5b9a\u8fd0\u884c\u7528\u6237\u3002\u5e76\u4e14\u53ef\u4ee5\u5728\u4e4b\u524d\u521b\u5efa\u6240\u9700\u8981\u7684\u7528\u6237\uff0c\u4f8b\u5982\uff1aRUN groupadd -r postgres && useradd -r -g postgres postgres\u3002\u8981\u4e34\u65f6\u83b7\u53d6\u7ba1\u7406\u5458\u6743\u9650\u53ef\u4ee5\u4f7f\u7528 gosu\uff0c\u800c\u4e0d\u63a8\u8350 sudo\u3002
WORKDIR:\u683c\u5f0f\u4e3a WORKDIR /path/to/workdir\u3002\u4e3a\u540e\u7eed\u7684 RUN\u3001CMD\u3001ENTRYPOINT \u6307\u4ee4\u914d\u7f6e\u5de5\u4f5c\u76ee\u5f55\u3002\u53ef\u4ee5\u4f7f\u7528\u591a\u4e2a WORKDIR \u6307\u4ee4\uff0c\u540e\u7eed\u547d\u4ee4\u5982\u679c\u53c2\u6570\u662f\u76f8\u5bf9\u8def\u5f84\uff0c\u5219\u4f1a\u57fa\u4e8e\u4e4b\u524d\u547d\u4ee4\u6307\u5b9a\u7684\u8def\u5f84\u3002\u4f8b\u5982

1
2
3
4

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd


\u5219\u6700\u7ec8\u8def\u5f84\u4e3a /a/b/c\u3002
ONBUILD:\u683c\u5f0f\u4e3a ONBUILD [INSTRUCTION]\u3002
\u914d\u7f6e\u5f53\u6240\u521b\u5efa\u7684\u955c\u50cf\u4f5c\u4e3a\u5176\u5b83\u65b0\u521b\u5efa\u955c\u50cf\u7684\u57fa\u7840\u955c\u50cf\u65f6\uff0c\u6240\u6267\u884c\u7684\u64cd\u4f5c\u6307\u4ee4\u3002
\u4f8b\u5982\uff0cDockerfile \u4f7f\u7528\u5982\u4e0b\u7684\u5185\u5bb9\u521b\u5efa\u4e86\u955c\u50cf image-A\u3002

1
2
3
4

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]


\u5982\u679c\u57fa\u4e8e image-A \u521b\u5efa\u65b0\u7684\u955c\u50cf\u65f6\uff0c\u65b0\u7684Dockerfile\u4e2d\u4f7f\u7528 FROM image-A\u6307\u5b9a\u57fa\u7840\u955c\u50cf\u65f6\uff0c\u4f1a\u81ea\u52a8\u6267\u884cONBUILD \u6307\u4ee4\u5185\u5bb9\uff0c\u7b49\u4ef7\u4e8e\u5728\u540e\u9762\u6dfb\u52a0\u4e86\u4e24\u6761\u6307\u4ee4\u3002

1
2
3
4
5

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src


\u4f7f\u7528 ONBUILD \u6307\u4ee4\u7684\u955c\u50cf\uff0c\u63a8\u8350\u5728\u6807\u7b7e\u4e2d\u6ce8\u660e\uff0c\u4f8b\u5982 ruby:1.9-onbuild\u3002
\u57fa\u4e8eCentOS6.7\u5e76\u6e90\u7801\u5b89\u88c5nginx
\u9996\u5148\u51c6\u5907\u4e86nginx-1.9.9.tar.gz\u5b89\u88c5\u5305\u548cCentOS6-Base-163.repo\uff08163\u6e90\uff09\uff0c\u5c06\u8fd9\u4e24\u4e2a\u6587\u4ef6\u653e\u5230\u540c\u4e00\u76ee\u5f55\u4e0b\uff0c\u5e76\u5728\u6b64\u76ee\u5f55\u4e0b\u521b\u5efa\u540d\u79f0\u4e3aDockerfile\u7684\u6587\u4ef6\u3002\u4e4b\u540e\u5728\u6b64\u6587\u4ef6\u4e2d\u5b9e\u73b0\u6e90\u66ff\u6362\u3001nginx\u7f16\u8bd1\u5b89\u88c5\u3001\u53ca\u4e00\u4e9b\u4f9d\u8d56\u5305\u7684\u5b89\u88c5\uff0cDockerfile\u5185\u5bb9\u5982\u4e0b\uff1a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# this is a test ubuntu 12.04 image dockerfile
# Author:fengzheng

# Base image,this must be set as the first line
#localhost:5000/centos:6.7\u662f\u6211\u7684\u79c1\u6709\u4ed3\u5e93\u7684\u955c\u50cf\uff0c\u53ef\u66ff\u6362\u4e3acentos:6.7\uff08DockerHub\u4e2d\u7684\u955c\u50cf\uff09
FROM localhost:5000/centos:6.7

MAINTAINER fengzheng

# Commands to update the image

RUN mkdir /usr/nginx1.9.9
ADD nginx-1.9.9.tar.gz /usr/nginx1.9.9/
#RUN yum -y install tar
#RUN tar -zxvf /usr/nginx1.9.9/nginx-1.9.9.tar.gz
RUN cd /etc/yum.repos.d/ && mv CentOS-Base.repo CentOS-Base.repo.bak
ADD CentOS6-Base-163.repo /etc/yum.repos.d/
RUN cd /etc/yum.repos.d/ && mv CentOS6-Base-163.repo CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum -y install gcc \
&& yum -y install yum install -y pcre-devel \
&& yum -y install zlib zlib-devel \
&& yum -y install openssl openssl--devel \
&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install

#\u5982\u679c\u8bbe\u7f6edaemon off; nginx\u65e0\u6cd5\u542f\u52a8
#RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
# \u542f\u52a8nginx \u9700\u8fdb\u5165/usr/local/nginx/sbin \u6267\u884c./configure
CMD /bin/bash


\u6700\u540e\u6267\u884c\u547d\u4ee4"docker build -t nginx-centos:6.7 ."
\u5176\u4e2d.\u8868\u793a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u641c\u7d22Dockerfile\u6587\u4ef6\uff0c-t\u53c2\u6570\u6307\u5b9a\u955c\u50cf\u540d\u79f0\u548ctag\u3002

\u5728\u4f7f\u7528Docker\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9664\u4e86\u4eceDocker Hub\u4e0a\u4e0b\u8f7d\u5df2\u7ecf\u505a\u597d\u7684\u955c\u50cf\uff0c\u5f88\u591a\u65f6\u5019\u9700\u8981\u6211\u4eec\u81ea\u5df1\u5236\u4f5c\u955c\u50cf\u3002\u4e0b\u9762\u60f3\u5728\u8fd9\u4e2a\u6587\u7ae0\u4e2d\u8bf4\u660e\u4e00\u4e0b\u955c\u50cf\u7684\u5236\u4f5c\u65b9\u6cd5\u3002 \u5236\u4f5c\u955c\u50cf\u7684\u65b9\u5f0f\u4e3b\u8981\u6709\u4e24\u79cd\uff1a \u901a\u8fc7docker commit \u5236\u4f5c\u955c\u50cf \u901a\u8fc7docker build \u5236\u4f5c\u955c\u50cf \u8fd9\u4e24\u79cd\u65b9\u5f0f\u90fd\u662f\u901a\u8fc7\u6539\u8fdb\u5df2\u6709\u7684\u955c\u50cf\u6765\u8fbe\u5230\u81ea\u5df1\u7684\u76ee\u7684\u3002\u5236\u4f5c\u57fa\u7840\u955c\u50cf\uff0c\u4f1a\u5728\u53e6\u5916\u4e00\u7bc7\u6587\u7ae0\u201c\u4ece\u96f6\u5f00\u59cb\u5236\u4f5c\u57fa\u7840\u955c\u50cf\u201d\u4e2d\u4ecb\u7ecd\u3002 docker commit docker commit \u662f\u5f80\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u91cc\u63d0\u4ea4\u4e00\u6b21\u53d8\u66f4\u3002\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u5236\u4f5c\u955c\u50cf\uff0c\u672c\u8d28\u4e0a\u662f\u8fd0\u884c\u4e00\u4e2a\u57fa\u7840\u955c\u50cf\uff0c\u7136\u540e\u5728\u57fa\u7840\u955c\u50cf\u4e0a\u8fdb\u884c\u8f6f\u4ef6\u5b89\u88c5\u548c\u4fee\u6539\u3002\u6700\u540e\u518d\u5c06\u6539\u52a8\u63d0\u4ea4\u5230\u7248\u672c\u7cfb\u7edf\u4e2d\u3002

创建镜像的目的
首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有最小版本,也有一些安装了mysql、nginx、apache等等第三方软件的版本可以直接拿来使用。虽然已经足够多了,但是有些情况下并不能满足我们的需求,例如需要安装一些比较少用到的第三方软件,这个时候只能先用公共仓库中的镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像。这些操作在之前的文章中介绍了。这样操作完成之后,可以用如下两种方式实现定制镜像的目的:
1.用save和export的方式将镜像保存为tar包,然后在需要的时候导入tar镜像包
2.将已经配置好的镜像push到我们的私有仓库(docker创建私有仓库)或者已注册过的共有仓库中,需要的时候直接pull下来使用
这两种方式都可以,但是自动化程度低、自由度不够、定制起来比较麻烦。既然如此,那就来说一下更加自动化的创建方式。
Dockerfile结构
dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# Base image to use, this must be set as the first line
FROM ubuntu

# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user [email protected]

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx

其中#表注释,可以标注一些说明性的文字。
FROM关键字指定镜像的来源,默认为DockerHub,也可以写私有仓库的镜像,例如:localhost:5000/centos:6.7,如果本地已经存在指定的镜像名称,则会从本地缓存直接获取。MAINTAINER 指定镜像的作者,之后为镜像操作执行RUN、ADD等,最后是容器启动时发起的指令。
Dockerfile中的指令
FROM: 指定镜像名称,格式为FROM <image> 或FROM <image>:<tag>,例如FROM ubuntu 或 FROM ubuntu:12.04 
MAINTAINER: 镜像作者 ,格式为 MAINTAINER <name>
RUN:格式为 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。
CMD:支持三种格式
  1.CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
  2.CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
  3.CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
EXPOSE:格式为 EXPOSE <port> [<port>...]。
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
ENV:格式为 ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。这就对应程序语言中的变量定义,可在需要的时候引用。例如:

1
2
3
4

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD:格式为 ADD <src> <dest>。
该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
COPY:格式为 COPY <src> <dest>。
复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。当使用本地目录为源目录时,推荐使用 COPY。
COPY和ADD的不同就是:ADD多了自动解压和支持URL路径的功能。
ENTRYPOINT:
两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
CMD和ENTRYPOINT比较:两个命令都是只能使用一次,并且都是在执行docker run指令时运行,如果有多个,只执行最后一条。
两者的不同在于参数的传递方式,如果在Dockerfile中定义如下指令

1

CMD echo hello



1

ENTRYPOINT ["echo","hello"] 

那么在运行命令docker run containerId echo hello时,指定了CMD的输入结果为world,可以看出Dockerfile中指定的命令被覆盖了,而指定了ENTRYPOINT时,输出结果为hello echo world,可以看出指定的命令被作为ENTRYPOINT指定指令的参数了。

VOLUME:格式为 VOLUME ["/data"]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。不过此属性在Dockerfile中指定并没有什么意义,因为没有办法指定本地主机的目录。如果需要指定挂载点可以在执行docker run命令时指定:

1

docker run -it -v /home/fengzheng/ftp/:/data 859666d51c6d /bin/bash

USER:格式为 USER daemon。指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而不推荐 sudo。
WORKDIR:格式为 WORKDIR /path/to/workdir。为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

1
2
3
4

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

则最终路径为 /a/b/c。
ONBUILD:格式为 ONBUILD [INSTRUCTION]。
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
例如,Dockerfile 使用如下的内容创建了镜像 image-A。

1
2
3
4

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。

1
2
3
4
5

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。
基于CentOS6.7并源码安装nginx
首先准备了nginx-1.9.9.tar.gz安装包和CentOS6-Base-163.repo(163源),将这两个文件放到同一目录下,并在此目录下创建名称为Dockerfile的文件。之后在此文件中实现源替换、nginx编译安装、及一些依赖包的安装,Dockerfile内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# this is a test ubuntu 12.04 image dockerfile
# Author:fengzheng

# Base image,this must be set as the first line
#localhost:5000/centos:6.7是我的私有仓库的镜像,可替换为centos:6.7(DockerHub中的镜像)
FROM localhost:5000/centos:6.7

MAINTAINER fengzheng

# Commands to update the image

RUN mkdir /usr/nginx1.9.9
ADD nginx-1.9.9.tar.gz /usr/nginx1.9.9/
#RUN yum -y install tar
#RUN tar -zxvf /usr/nginx1.9.9/nginx-1.9.9.tar.gz
RUN cd /etc/yum.repos.d/ && mv CentOS-Base.repo CentOS-Base.repo.bak
ADD CentOS6-Base-163.repo /etc/yum.repos.d/
RUN cd /etc/yum.repos.d/ && mv CentOS6-Base-163.repo CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum -y install gcc \
&& yum -y install yum install -y pcre-devel \
&& yum -y install zlib zlib-devel \
&& yum -y install openssl openssl--devel \
&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install

#如果设置daemon off; nginx无法启动
#RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
# 启动nginx 需进入/usr/local/nginx/sbin 执行./configure
CMD /bin/bash

最后执行命令"docker build -t nginx-centos:6.7 ."
其中.表示在当前目录下搜索Dockerfile文件,-t参数指定镜像名称和tag。

  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細棣栧厛鍑嗗浜唍ginx-1.9.9.tar.gz瀹夎鍖呭拰CentOS6-Base-163.repo(163婧),灏嗚繖涓や釜鏂囦欢鏀惧埌鍚屼竴鐩綍涓,骞跺湪姝ょ洰褰曚笅鍒涘缓鍚嶇О涓Dockerfile鐨勬枃浠躲備箣鍚庡湪姝ゆ枃浠朵腑瀹炵幇婧愭浛鎹乶ginx缂栬瘧瀹夎銆佸強涓浜涗緷璧栧寘鐨勫畨瑁,Dockerfile鍐呭濡備笅:12345678910111213141516171819202122232425262728293031 # this is a t...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細鎸囧畾鍚姩瀹瑰櫒鏃舵墽琛岀殑鍛戒护锛屾瘡涓 Dockerfile 鍙兘鏈変竴鏉 CMD 鍛戒护銆傚鏋滄寚瀹氫簡澶氭潯鍛戒护锛屽彧鏈夋渶鍚庝竴鏉′細琚墽琛銆傚鏋滅敤鎴峰惎鍔ㄥ鍣ㄦ椂鍊欐寚瀹氫簡杩愯鐨勫懡浠わ紝鍒欎細瑕嗙洊鎺 CMD 鎸囧畾鐨勫懡浠ゃ侲XPOSE:鏍煎紡涓 EXPOSE <port> [<port>...]銆傚憡璇 Docker 鏈嶅姟绔鍣ㄦ毚闇茬殑绔彛鍙凤紝渚涗簰鑱旂郴缁熶娇鐢ㄣ傚湪鍚姩瀹瑰櫒鏃堕渶瑕...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細-f 鎸囧畾dockerfile鐨勫悕瀛 -t 涓洪暅鍍忚缃竴涓爣绛俱傛爣鍑嗏滈暅鍍忓悕锛氭爣绛锯濆鏋滄病鏈夋寚瀹 浠讳綍鏍囩锛宒ocker灏嗕細鑷姩涓洪暅鍍忚缃竴涓猯atest鏍囩 杩欐椂鍊欏彲浠鐢╠ocker images鏉ユ煡鐪嬩綘鍒涘缓鐨勯暅鍍 [root@localhost ~]# docker run -i -t static_web /bin/bash [root@cf1cafd10982 /]# rpm -qa | grep vs...
  • dockerfile鏄粈涔
    绛旓細2. 鏋勫缓杩囩▼锛閫氳繃Dockerfile鏋勫缓Docker闀滃儚鏄竴涓嚜鍔ㄥ寲鐨勮繃绋嬨傚綋鎵цdocker build鍛戒护鏃讹紝Docker浼氫粠Dockerfile鎵鍦ㄧ殑涓婁笅鏂囪矾寰勫紑濮嬭鍙栨寚浠わ紝骞舵墽琛屾瘡涓涓寚浠ゆ潵鍒涘缓涓涓柊鐨勯暅鍍忓眰銆傝繖涓繃绋嬩腑浼氬寘鎷紪璇戞簮浠g爜銆佸畨瑁呬緷璧栥侀厤缃幆澧冨彉閲忕瓑姝ラ銆3. 浼樺娍涓庡簲鐢細Dockerfile鐨勪娇鐢ㄦ瀬澶у湴绠鍖栦簡闀滃儚鐨勬瀯寤哄拰...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細1銆佸噯澶噅dk銆侀渶瑕佽繍琛岀殑spring boot灏忛」鐩 灏唈dk鍘嬬缉鍖呰В鍘嬪埌Dockerfile鎵鍦ㄧ殑鐩綍涓紝灏唖pring boot灏忛」鐩畐ebsocket.jar澶嶅埗鍒癉ockerfile鎵鍦ㄧ殑鐩綍涓嬶細2銆鍒涘缓Dockerfile锛屽唴瀹瑰涓嬶細1 FROM centos 2 3 MAINTAINER yaolin 4 5 COPY jdk1.7.0_79 jdk1.7.0_79 6 ADD websocket.jar app.jar 7...
  • 濡備綍鐢╠ockerfile濡備綍鐢熸垚涓涓猦ello world
    绛旓細濡備綍缂栧啓涓涓Dockerfile,鏍煎紡濡備笅锛欳ommentINSTRUCTION arguments FROM 鍩轰簬鍝釜闀滃儚 RUN 瀹夎杞欢鐢 MAINTAINER 闀滃儚鍒涘缓鑰 CMD container鍚姩鏃舵墽琛岀殑鍛戒护锛屼絾鏄竴涓狣ockerfile涓彧鑳芥湁涓鏉MD鍛戒护锛屽鏉″垯鍙墽琛屾渶鍚庝竴鏉MD.CMD涓昏鐢ㄤ簬container鏃跺惎鍔ㄦ寚瀹氱殑鏈嶅姟锛屽綋docker run command鐨勫懡浠ゅ尮閰嶅埌CMD command...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細鍒朵綔闀滃儚鐨勬柟寮忎富瑕佹湁涓ょ锛 閫氳繃docker commit 鍒朵綔闀滃儚 閫氳繃docker build 鍒朵綔闀滃儚 杩欎袱绉嶆柟寮忛兘鏄氳繃鏀硅繘宸叉湁鐨勯暅鍍忔潵杈惧埌鑷繁鐨勭洰鐨勩傚埗浣滃熀纭闀滃儚锛屼細鍦ㄥ彟澶栦竴绡囨枃绔犫滀粠闆跺紑濮嬪埗浣滃熀纭闀滃儚鈥濅腑浠嬬粛銆 docker commit docker commit 鏄線鐗堟湰鎺у埗绯荤粺閲屾彁浜や竴娆″彉鏇淬備娇鐢ㄨ繖绉嶆柟寮忓埗浣滈暅鍍忥紝鏈川涓婃槸杩愯涓...
  • 濡備綍鍩轰簬docker鏋勫缓鍜屽彂甯働ython搴旂敤绋嬪簭?
    绛旓細鍒涘缓涓涓 Dockerfile锛岀敤浜庡畾涔 Docker 闀滃儚鐨勬瀯寤鸿繃绋嬨傚湪 Dockerfile 涓紝闇瑕佹寚瀹氬熀纭闀滃儚銆佸畨瑁 Python 搴撱佸皢搴旂敤绋嬪簭浠g爜澶嶅埗鍒伴暅鍍忎腑绛夋搷浣溿備互涓嬫槸涓涓ず渚 Dockerfile锛浣跨敤 Python 3.9 浣滀负鍩虹闀滃儚 FROM python:3.9 璁剧疆宸ヤ綔鐩綍 WORKDIR /app 澶嶅埗搴旂敤绋嬪簭浠g爜鍒伴暅鍍忎腑 COPY . /app 瀹夎...
  • 濡備綍浣跨敤Dockerfile鏋勫缓闀滃儚
    绛旓細VOLUME:鏍煎紡涓 VOLUME ["/data"]銆鍒涘缓涓涓彲浠ヤ粠鏈湴涓绘満鎴栧叾浠栧鍣ㄦ寕杞界殑鎸傝浇鐐癸紝涓鑸敤鏉ュ瓨鏀炬暟鎹簱鍜岄渶瑕佷繚鎸佺殑鏁版嵁绛夈備笉杩囨灞炴у湪Dockerfile涓寚瀹氬苟娌℃湁浠涔堟剰涔夛紝鍥犱负娌℃湁鍔炴硶鎸囧畾鏈湴涓绘満鐨勭洰褰曘傚鏋滈渶瑕佹寚瀹氭寕杞界偣鍙互鍦ㄦ墽琛宒ocker run鍛戒护鏃舵寚瀹氾細1 ...
  • DockeFIile鐭ヨ瘑鐐规荤粨鍜屽彂甯冭嚜宸辩殑闀滃儚
    绛旓細ARG :鐢ㄤ簬鎸囧畾浼犻掔粰鏋勫缓杩愯鏃剁殑鍙橀噺 ONBUILD :鐢ㄤ簬璁剧疆闀滃儚瑙﹀彂鍣 缂栧啓dockerfile鏂囦欢 閫氳繃dockerfile鏋勫缓闀滃儚 鏌ョ湅闀滃儚鏋勫缓鐨勮繃绋,鍙互浣跨敤 docker history 闀滃儚id 鏉ユ煡鐪 鍒涘缓瀹屽懡鍚嶇┖闂村悗锛屾墦寮闀滃儚浠撳簱锛屽垱寤洪暅鍍忎粨搴擄紝閫夋嫨鏈湴浠撳簱 鏍规嵁瀹樻柟缁欑殑鏂囨。寮濮嬫彁浜ゅ氨鍙互锛岃繖閲屽氨涓嶆埅鍥句簡 ...
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网