Docker制作镜像
Dockerfile 指令详解
1.FROM
用法:
FROM <image>1
FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
如果FROM语句没有指定镜像标签,则默认使用latest标签。
2.MAINTAINER
用法:
MAINTAINER <name>1
指定创建镜像的用户
3.RUN
RUN "executable", "param"
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。。
4.CMD
CMD "executable","param"
CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。
CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了
5.EXPOSE
格式:
EXPOSE <port> 1
告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。
6.ENV
ENV <key> <value> # 只能设置一个变量
ENV <key>=<value> ... # 允许一次设置多个变量12
指定一个环境变量,会被后续RUN指令使用,并在容器运行时保留。
例子:
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy12
等同于
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy123
7.ADD
ADD <src>... <dest>1
ADD复制本地主机文件、目录或者远程文件 URLS 从 并且添加到容器指定路径中 。
支持通过 GO 的正则模糊匹配,具体规则可参见 Go filepath.Match
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character12
路径必须是绝对路径,如果 不存在,会自动创建对应目录
路径必须是 Dockerfile 所在路径的相对路径
如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制
8.COPY
COPY <src>... <dest>1
COPY复制新文件或者目录从 并且添加到容器指定路径中 。用法同ADD,唯一的不同是不能指定远程文件 URLS。
9.ENTRYPOINT
ENTRYPOINT “executable”, “param”
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run
方法一:编写Dockerfile
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
示范一:tomcat基础镜像
cat Dockerfile
FROM centos
MAINTAINER test@test.com
RUN mkdir -p /opt/tomcat && \
mkdir -p /optlog/MskyLog && \
mkdir -p /data/appdatas/cat && \
useradd jboss5 && \
chown -R jboss5:jboss5 /opt/tomcat && \
chown -R jboss5:jboss5 /optlog/MskyLog && \
chown -R jboss5:jboss5 /data/appdatas/cat
ADD apachetomcatserver.tar.gz /opt/tomcat
ADD jdk1.8.0_102.tar.gz /opt/tomcat
ENV LANG=en_US.utf8
ENV JAVA_HOME=/opt/tomcat/jdk1.8.0_102
ENV PATH=$JAVA_HOME/bin:$PATH
EXPOSE 8180
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
docker build -t tomcat_test .
Sending build context to Docker daemon 191.9MB
Step 1/9 : FROM centos
---> 67fa590cfc1c
Step 2/9 : MAINTAINER test@test.com
---> Running in 2fd1f46ea532
Removing intermediate container 2fd1f46ea532
---> f76973935554
Step 3/9 : RUN mkdir -p /opt/tomcat && mkdir -p /optlog/MskyLog && mkdir -p /data/appdatas/cat && useradd jboss5 && chown -R jboss5:jboss5 /opt/tomcat && chown -R jboss5:jboss5 /optlog/MskyLog && chown -R jboss5:jboss5 /data/appdatas/cat
---> Running in b3dddb1ea466
Removing intermediate container b3dddb1ea466
---> 4a37c81a2a23
Step 4/9 : ADD apachetomcatserver.tar.gz /opt/tomcat
---> e598035a34ab
Step 5/9 : ADD jdk1.8.0_102.tar.gz /opt/tomcat
---> de71ef38bb98
Step 6/9 : ENV LANG en_US.utf8
---> Running in 1630b7859aef
Removing intermediate container 1630b7859aef
---> 3947bc7e1120
Step 7/9 : ENV JAVA_HOME=/opt/tomcat/jdk1.8.0_102
---> Running in 8ced366d5221
Removing intermediate container 8ced366d5221
---> 23fd939cc362
Step 8/9 : ENV PATH=$JAVA_HOME/bin:$PATH
---> Running in 87f143ac0756
Removing intermediate container 87f143ac0756
---> 11847b502604
Step 9/9 : EXPOSE 8180
---> Running in 5a94bb7988d3
Removing intermediate container 5a94bb7988d3
---> 7304d31c44fe
Successfully built 7304d31c44fe
Successfully tagged tomcat_test:latest
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为 7304d31c44fe
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat_test latest 7304d31c44fe 2 minutes ago 595MB
centos latest 67fa590cfc1c 8 days ago 202MB
示范二:tomcat具体应用(以test为例)
cat Dockerfile
FROM tomcat_test
MAINTAINER test@test.com
COPY test.war /opt/tomcat/apachetomcatserver/webapps
USER jboss5
ENTRYPOINT ["/opt/tomcat/apachetomcatserver/bin/startup.sh","run"]
docker build -t test .
Sending build context to Docker daemon 184.7MB
Step 1/5 : FROM tomcat_test
---> 7304d31c44fe
Step 2/5 : MAINTAINER test@test.com
---> Running in 09a0d4fb1fbc
Removing intermediate container 09a0d4fb1fbc
---> 9167e11c9890
Step 3/5 : COPY test.war /opt/tomcat/apachetomcatserver/webapps
---> f92e7d1a0f4e
Step 4/5 : USER jboss5
---> Running in f676f021a0de
Removing intermediate container f676f021a0de
---> 87758dd31733
Step 5/5 : ENTRYPOINT ["/opt/tomcat/apachetomcatserver/bin/startup.sh","run"]
---> Running in 7f05bba7190f
Removing intermediate container 7f05bba7190f
---> 5dad1eed56ff
Successfully built 5dad1eed56ff
Successfully tagged test:latest
查看镜像:
[root@docker-bulid test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 5dad1eed56ff 4 minutes ago 780MB
tomcat_test latest 7304d31c44fe 21 minutes ago 595MB
centos latest 67fa590cfc1c 8 days ago 202MB
给镜像打标签:docker tag
制作完镜像后根据自己的需要给镜像打标签(重起镜像名称),将上述制作好的镜像打一个标签,通常是以私有仓库地址为镜像名称的。
docker tag tomcat_test 10.1.1.1/test/ tomcat_test
查看镜像:
[root@docker-bulid test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 5dad1eed56ff 6 minutes ago 780MB
10.1.1.1/test/tomcat_test latest 7304d31c44fe 24 minutes ago 595MB
tomcat_test latest 7304d31c44fe 24 minutes ago 595MB
centos latest 67fa590cfc1c 8 days ago 202MB
将镜像推送到私有镜像仓库中:docker push
使用命令docker push + 镜像名字:
[root@docker-bulid test]# docker push 10.1.1.1/test/tomcat_test
The push refers to repository [10.1.1.1/test/tomcat_test]
c943684290b7: Pushed
6fdfb7ca8f55: Pushed
7b470a43942f: Pushed
877b494a9f30: Pushed
latest: digest: sha256:2bf7491d7ac220e8d6bdae7d70bc1b90f0f2c500ebb584e0b3cf24b20b8a2932 size: 1162
方法二:执行docker commit
docker commit 是基于已有的容器创建新的镜像。
示范:(以grafana容器为例)
docker pull grafana/grafana
Using default tag: latest
latest: Pulling from grafana/grafana
35c102085707: Pull complete
251f5509d51d: Pull complete
8e829fe70a46: Pull complete
6001e1789921: Pull complete
aa5d496c0b92: Pull complete
edc8d3677179: Pull complete
d2dabd4d817e: Pull complete
0b8ff4615528: Pull complete
99fe97311c2e: Pull complete
Digest: sha256:f458ea6aaf4b04485bbb86c686a9435e133cefa7644c46513955104a667b2ab1
Status: Downloaded newer image for grafana/grafana:latest
docker run -itd grafana/grafana
通过docker ps -a命令查看容器进程:
[root@docker-bulid test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
464077145a41 grafana/grafana "/run.sh" 23 seconds ago Up 22 seconds 3000/tcp unruffled_mclaren
进入容器:
docker exec -it 464077145a41 /bin/bash
安装插件:
grafana@464077145a41:/usr/share/grafana$ grafana-cli plugins install grafana-piechart-panel
installing grafana-piechart-panel @ 1.3.8
from: https://grafana.com/api/plugins/grafana-piechart-panel/versions/1.3.8/download
into: /var/lib/grafana/plugins
✔ Installed grafana-piechart-panel successfully
Restart grafana after installing plugins . <service grafana-server restart>
grafana@464077145a41:/usr/share/grafana$
退出容器:
输入exit或者ctrl p+q。
提交新镜像:
docker commit 464077145a41 grafana/grafana:new
查看镜像:
[root@docker-bulid test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
grafana/grafana new 4a2ef37ad41a 4 seconds ago 256MB
test latest 5dad1eed56ff 36 minutes ago 780MB
tomcat_test latest 7304d31c44fe About an hour ago 595MB
10.1.1.1/test/tomcat_test latest 7304d31c44fe About an hour ago 595MB
centos latest 67fa590cfc1c 8 days ago 202MB
grafana/grafana latest a6e14b4109af 13 days ago 253MB