共计 4247 个字符,预计需要花费 11 分钟才能阅读完成。
docker 默认提供了一些镜像,在 github 上我们也可以找到很多已经做好的镜像,但是不可避免大多数情况我们需要根据自己的需求来定制构建自己需要的镜像。
Docker 可以通过从 Dockerfile(包含所有命令的文本文件)中读取构建映像所需的指令来自动构建映像。Dockerfiles 遵循特定格式并使用一组特定的说明。很多软件版本也提供了 Dockerfile 文件。它就像一个自动化的脚本一样,帮我们设置好所需的镜像功能。
手工构建镜像
为了更好的理解 Dockerfile, 我们先不使用 Dockerfile, 纯手工构建一个 docker 镜像。构建镜像就是在镜像中安装一种服务,当容器使用这个镜像运行时,就可以对外提供服务。
构建一个 nginx 服务的镜像:
1、创建一个容器
docker run -it –name nginx1 CentOS
2、进入容器,对容器进行定制
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y
3、修改 nginx 配置文件,我们让 nginx 默认在前台启动,这样才能保证我们的 docker 容器持续运行不退出。(像 nginx 这中无状态的服务,docker 单进程运行完毕后就会自动退出)
vi /etc/nginx/nginx.conf
…
user nginx;
daemon off;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
…
4、退出容器,提交镜像
docker commit -m “nginx test images” nginx1 trying/nginx:v1
这里的语法类似于 git 的 commit 参数,nginx1 表示的之前创建的容器名,trying 表示用户名称可以任意填写,nginx 表示镜像名称,v1 是 tag 标签,这里可以表示版本号。
查看本地提交的镜像:
# 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 服务的启动命令:
docker run –name testnginx -d -p 81:80 trying/nginx:v1 nginx
查看容器运行状态:
# 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 语法格式
FROM 指定的基础镜像,如之前指定的 centos 镜像
MAINTAINER 镜像的作者信息,维护信息等
RUN 构建的时候所要执行的命令
ADD 需要增加的文件,软件包等,如果是压缩文件则会进行自动解压
WORKDIR 设置当前工作目录
VOLUME 设置目录挂载
EXPOSE 开放一个端口
CMD 容器启动时执行的命令
我们使用 Dockerfile 对上面手工制作的镜像重新定制一次:
创建 Dockerfile 目录 /docker/dockerfile/,编辑一个 index.html 的网页文件:
echo “Stay Hungry.Stay Foolish.” > index.html
编写 Dockerfile:
# vim /docker/dockerfile/Dockerfile
#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 命令构建镜像:
# docker build -t trying/nginx_dockerfile:v1 /docker/dockerfile/
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 文件和添加的文件所在的路径。
查看生成的镜像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
trying/nginx_dockerfile v1 676b792ab10e 37 seconds ago 400.7 MB
使用此镜像启动一个容器:
docker run -d -p 80:80 –name nginx-dockerfile3 trying/nginx_dockerfile:v1 nginx -g ‘daemon off;’
由于在容器中没有配置 nginx 前台运行,所以在启动的时候指定前台启动,在实际生产中,这些配置文件都需要通过 ADD 去添加。
在其他机器上访问 docker 宿主机:
# curl 192.168.1.33
Stay Hungry.Stay Foolish.
在实际的生产中,对于无法解耦的复杂应用就不适合使用 docker,docker 更多是提供微服务架构解决方案,对于一般的业务平台可以将虚拟机和容器混合使用。
更多 Docker 相关教程见以下内容:
Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 16.04 服务器上配置使用 Docker http://www.linuxidc.com/Linux/2017-06/145176.htm
Ubuntu 15.04 下安装 Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
Docker 安装实例 http://www.linuxidc.com/Linux/2017-04/142666.htm
Docker 创建基础镜像 http://www.linuxidc.com/Linux/2017-05/144112.htm
在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
Ubuntu 16.04 上 Docker 使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm
使用 Docker 分分钟启动常用应用 http://www.linuxidc.com/Linux/2017-04/142649.htm
Ubuntu 16.04 下 Docker 修改配置文件不生效解决办法 http://www.linuxidc.com/Linux/2017-05/143862.htm
Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-08/146132.htm