Docker 构建镜像

简介:

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

相关文章
|
1月前
|
存储 运维 安全
构建高效自动化运维体系:Ansible与Docker的完美结合
【2月更文挑战第31天】 随着云计算和微服务架构的兴起,自动化运维成为保障系统稳定性和提升部署效率的关键手段。本文将详细探讨如何通过Ansible和Docker的结合来构建一个高效、可靠且易于管理的自动化运维体系。首先,介绍自动化运维的必要性及其在现代IT基础设施中的作用;然后,分别阐述Ansible和Docker的技术特点及优势;最后,提供一个基于Ansible和Docker结合使用的实践案例,以及实施过程中遇到的挑战和解决方案。
|
1月前
|
运维 Kubernetes 监控
构建高效自动化运维体系:基于Docker和Kubernetes的实践指南
【2月更文挑战第30天】 在当今快速发展的云计算时代,传统的IT运维模式已难以满足业务的敏捷性和稳定性需求。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理工具构建一个高效、可靠的自动化运维体系。文章首先概述了容器化技术和微服务架构的基本概念,随后详细阐述了基于Docker的应用打包、部署流程,以及Kubernetes在自动化部署、扩展和管理容器化应用中的关键作用。最后,文中通过案例分析,展示了如何在实际场景中利用这些技术优化运维流程,提高系统的整体效率和可靠性。
|
1月前
|
运维 安全 网络安全
构建高效自动化运维体系:Ansible与Docker的完美融合
【2月更文挑战第30天】在当今快速迭代和持续部署的软件发展环境中,自动化运维成为确保效率和稳定性的关键。本文将探讨如何通过结合Ansible和Docker技术,构建一个高效的自动化运维体系。我们将分析Ansible的配置管理功能和Docker容器化的优势,并展示它们如何协同工作以简化部署流程,增强应用的可移植性,并提供一致性的系统环境。此外,文章还将介绍一些最佳实践,帮助读者在真实环境中实现这一整合方案。
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
2天前
|
存储 Ubuntu Linux
[Docker] 镜像讲解
[Docker] 镜像讲解
|
5天前
|
运维 前端开发 Devops
云效产品使用报错问题之流水线打包docker镜像时报网络代理有问题如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
8天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
13 0
|
17天前
|
应用服务中间件 Docker 容器
docker 镜像常用命令
docker 镜像常用命令
38 0
|
17天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
28 0
|
24天前
|
存储 Kubernetes API
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
61 2