首页 > 技术文章 > Docker镜像与仓库(四)

w787815 2018-08-04 09:27 原文

Dockerfile方式创建镜像
https://hub.docker.com/_/centos/ #找一个centos6.6 的dockerfile链接
[root@linux-node1 ~]# wget https://github.com/CentOS/sig-cloud-instance-images/blob/8911843d9a6cc71aadd81e491f94618aded94f30/docker/Dockerfile 

[root@linux-node1 ~]# mkdir docker
[root@linux-node1 ~]# mv Dockerfile docker
[root@linux-node1 ~]# cd docker
[root@linux-node1 docker]# echo > Dockerfile 
[root@linux-node1 docker]# cat Dockerfile 
#This is dockerfile for nginx

#基础镜像
FROM centos
#维护者信息
MAINTAINER zsq zsq@qq.com
#相关操作
RUN rpm -ivh https://mirrors.aliyun.com/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
RUN yum install nginx -y
#添加文件
ADD index.html /usr/share/nginx/html/index.html
#参数
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
#设置开放端口
EXPOSE 80
#执行命令
CMD ["nginx"]

#ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改

[root@linux-node1 docker]# touch index.html

[root@linux-node1 docker]# cat index.html 
<h1>This is test page</h1>

[root@linux-node1 docker]# docker build -t w787815/nginx /root/docker/ #使用docker build进行构建

[root@linux-node1 docker]# docker run -it --rm  w787815/nginx bash
[root@44c794f53ef1 /]# nginx

[root@linux-node1 docker]# curl 192.168.158.2
<h1>This is test page<h1>

Dockerfile参数解释

FROM

格式:FROM<image>或FROM<image>:<tag>。
解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。

MAINTAINER

格式:MAINTAINER <name>
解释:指定维护者信息。

RUN

格式:RUN <command>或 RUN["executable", "param1", "param2"]。
解释:运行命令,命令较长使可以使用\来换行。推荐使用上面数组的格式

CMD

格式:
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
解释: 
CMD指定容器启动是执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

ENTRYPOINT

格式:
   ENTRYPOINT ["executable", "param1","param2"]
   ENTRYPOINT command param1 param2(shell中执行)。
解释:和CMD类似都是配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 
  每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。 
 所以生产实践中我们可以同时使用ENTRYPOINT和CMD, 
例如:

ENTRYPOINT ["/usr/bin/rethinkdb"]
CMD ["--help"]
USER

格式:USER daemon
解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户。

EXPOSE

格式:EXPOSE<port> [<port>...]
解释:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。

ENV

格式:ENV<key> <value>
ENV <key>=<value> ...
解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定

ADD

格式:
   ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
解释:将指定的<src>复制到容器文件系统中的<dest> 
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0 
如果文件是可识别的压缩格式,则docker会帮忙解压缩

VOLUME

格式:VOLUME ["/data"]
解释:可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR

格式:WORKDIR/path/to/workdir
解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 
可以多次切换(相当于cd命令), 
 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
ONBUILD 
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

ARG

格式:ARG<name>[=<default value>]
解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。
View Code
Docker仓库
Docker的仓库是DockerHub,类似于github,github有一个开源的软件叫gitlab。Docker也有一个开源软件docker registry

[root@linux-node1 ~]# docker pull registry #pull registry镜像

[root@linux-node1 opt]# cd
[root@linux-node1 ~]# cd /opt/
[root@linux-node1 opt]# rm -rf *

#提升安全、我们做一个认证
[root@linux-node1 opt]# mkdir auth [root@linux-node1 opt]# docker run --entrypoint htpasswd registry:2 -Bbn w787815 zhou.shu2 > auth/htpasswd [root@linux-node1 opt]# cat auth/htpasswd #密码是加密的 w787815:$2y$05$f0AV12yb8AikVTTDlymMgu5r9yZCiMiVe2btRieYUL2dzbQ6M8BT2 #默认是5000端口
#把本机的6000端口映射到5000
#
--restart=always #docker server重启、容器跟着一起启动
#-v #挂载到容器的根auth目录下
#-e"REGISTRY_AUTH=htpasswd" #认证参数是httpasswd
#-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" #注册认证
#-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd #用的文件是哪些

[root@linux-node1 opt]# docker run -d -p 6000:5000 --restart=always --name registry1 -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry 1fa62130c89de73b1d5c9ebc029a1f1567133af83b4e7703b97f44f25a24bb21
[root@linux
-node1 opt]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fa62130c89d registry "/entrypoint.sh /e..." 3 minutes ago Up 3 minutes 0.0.0.0:6000->5000/tcp registry1 [root@linux-node1 ~]# docker login 127.0.0.1:6000 #本地测试登录 Username: w787815 Password: Login Succeeded #通过登录以后上传镜像 [root@linux-node1 opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE w787815/nginx latest 9363c9d402fe 11 hours ago 422 MB [root@linux-node1 opt]# docker tag 9363c9d402fe 127.0.0.1:6000/w787815/nginx [root@linux-node1 opt]# docker push 127.0.0.1:6000/w787815/nginx docker registry使用的是https,所以当用docker pull命令下载远程镜像时,如果远程docker registry是非https的时候就会报下面的错误。 [root@linux-node2 ~]# docker pull 10.10.10.188:6000/w787815/nginx Using default tag: latest Error response from daemon: Get https://10.10.10.188:6000/v2/: http: server gave HTTP response to HTTPS client

 

推荐阅读