本文共 3968 字,大约阅读时间需要 13 分钟。
docker默认提供了一些镜像,在github上我们也可以找到很多已经做好的镜像,但是不可避免大多数情况我们需要根据自己的需求来定制构建自己需要的镜像。
Docker可以通过从Dockerfile(包含所有命令的文本文件)中读取构建映像所需的指令来自动构建映像。 Dockerfiles遵循特定格式并使用一组特定的说明。很多软件版本也提供了Dockerfile文件。它就像一个自动化的脚本一样,帮我们设置好所需的镜像功能。
手工构建镜像
为了更好的理解Dockerfile,我们先不使用Dockerfile,纯手工构建一个docker 镜像。构建镜像就是在镜像中安装一种服务,当容器使用这个镜像运行时,就可以对外提供服务。
构建一个nginx服务的镜像:
1、创建一个容器
1 | docker run -it --name nginx1 centos |
2、进入容器,对容器进行定制
1 2 | rpm -ivh http: //mirrors .aliyun.com /epel/epel-release-latest-7 .noarch.rpm yum install nginx -y |
3、修改nginx配置文件,我们让nginx默认在前台启动,这样才能保证我们的docker容器持续运行不退出。(像nginx这中无状态的服务,docker 单进程运行完毕后就会自动退出)
1 2 3 4 5 6 7 8 | vi /etc/nginx/nginx .conf ... user nginx; daemon off; worker_processes auto; error_log /var/log/nginx/error .log; pid /run/nginx .pid; ... |
4、退出容器,提交镜像
1 | docker commit -m "nginx test images" nginx1 trying /nginx :v1 |
这里的语法类似于git的commit 参数, nginx1表示的之前创建的容器名, trying表示用户名称可以任意填写,nginx表示镜像名称,v1是tag标签,这里可以表示版本号。
查看本地提交的镜像:
1 2 3 4 5 | # docker images REPOSITORY TAG IMAGE ID CREATED SIZE trying /nginx v1 984bbb4cdad8 5 minutes ago 381.9 MB docker.io /centos latest 36540f359ca3 6 days ago 192.5 MB |
5、以定制的镜像启动容器,最后的nginx参数为nginx服务的启动命令:
1 | docker run --name testnginx -d -p 81:80 trying /nginx :v1 nginx |
查看容器运行状态:
1 2 3 | # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2f907850623 trying /nginx :v1 "nginx" 19 seconds ago Up 16 seconds 0.0.0.0:81->80 /tcp testnginx |
这样通过在外部使用ip+端口的访问方式就可以访问nginx了。
Dockerfile
Dockerfile制作容器镜像非常简单,只要按照规则书写Dockerfile文件,然后在Dockerfile存放的路径执行docker build . 即可。
警告:不要使用root目录或/目录作为build路径,因为它将会构建硬盘驱动器的所有内容传输到Docker守护程序,docker的核心思想是一个容器一个进程(one process per container),所以不要在容器中安装不必要的软件工具包,这样会使容器镜像过于庞大。
确保Dockerfile在当前目录下,如果不在也可以采用绝对路径的方式,此外Dockerfile的首字母D必须大写。在Dockerfile中#表示注释信息。
Dockerfile语法格式
1 2 3 4 5 6 7 8 | FROM 指定的基础镜像,如之前指定的centos镜像 MAINTAINER 镜像的作者信息,维护信息等 RUN 构建的时候所要执行的命令 ADD 需要增加的文件,软件包等,如果是压缩文件则会进行自动解压,可以使用多次 WORKDIR 设置当前工作目录 VOLUME 设置目录挂载 EXPOSE 开放一个端口 CMD 容器启动时执行的命令,一个dockerfile中只能有一个CMD命令,如果命名复杂,可以使用 command1 && command2 && command3 的方式 |
我们使用Dockerfile对上面手工制作的镜像重新定制一次:
创建Dockerfile目录/docker/dockerfile/,编辑一个index.html的网页文件:
1 | echo "Stay Hungry.Stay Foolish." > index.html |
编写Dockerfile:
1 | # vim /docker/dockerfile/Dockerfile |
1 2 3 4 5 6 7 8 | #build nginx image docker file FROM centos MAINTAINER trying tryingstuff@163.com RUN rpm -ivh http: //mirrors .aliyun.com /epel/epel-release-latest-7 .noarch.rpm RUN yum install nginx -y ADD index.html /usr/share/nginx/html/index .html EXPOSE 80 CMD [ "nginx" ] |
使用build命令构建镜像:
1 | # docker build -t trying/nginx_dockerfile:v1 /docker/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 | Sending build context to Docker daemon 3.072 kB Step 1 : FROM centos ---> 36540f359ca3 Step 2 : MAINTAINER trying tryingstuff@163.com ---> Running in 719632447d38 ---> 720fb072144a Removing intermediate container 719632447d38 Step 3 : RUN rpm -ivh http: //mirrors .aliyun.com /epel/epel-release-latest-7 .noarch.rpm ---> Running in eadff91a88c6 ... Step 4 : RUN yum install nginx -y ---> Running in d76ae111324c ... Step 5 : ADD index.html /usr/share/nginx/html/index .html ---> 587a9f14a14d Removing intermediate container 31055a385b89 Step 6 : EXPOSE 80 ---> Running in 8be900e770b6 ---> 83ef87f3d178 Removing intermediate container 8be900e770b6 Step 7 : CMD nginx ---> Running in c6a67d852704 ---> 676b792ab10e Removing intermediate container c6a67d852704 Successfully built 676b792ab10e |
这里-t参数指定了仓库名称和版本号,后面的路径是Dockerfile文件和添加的文件所在的路径。
查看生成的镜像:
1 2 3 | # docker images REPOSITORY TAG IMAGE ID CREATED SIZE trying /nginx_dockerfile v1 676b792ab10e 37 seconds ago 400.7 MB |
使用此镜像启动一个容器:
1 | docker run -d -p 80:80 --name nginx-dockerfile3 trying /nginx_dockerfile :v1 nginx -g 'daemon off;' |
由于在容器中没有配置nginx前台运行,所以在启动的时候指定前台启动,在实际生产中,这些配置文件都需要通过ADD去添加。
在其他机器上访问docker宿主机:
1 2 | # curl 192.168.1.33 Stay Hungry.Stay Foolish. |
在实际的生产中,对于无法解耦的复杂应用就不适合使用docker,docker 更多是提供微服务架构解决方案,对于一般的业务平台可以将虚拟机和容器混合使用。
本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1946990
转载地址:http://dtjkx.baihongyu.com/