Docker的安装及镜像、容器的基本操作详见博客https://blog.51cto.com/11134648/2160257
下面介绍Docker创建镜像和创建私有仓库的方法,详细如下:
创建镜像
创建镜像的方法有三种,分别是基于已有镜像创建、基于本地镜像模板创建以及基于Dockfile创建。下面介绍这三种镜像的方法
1.基于已有镜像创建
实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
命令格式:docker commit [选项] 容器ID/名称 仓库名称:标签
(1)首先需要查看启动已有镜像的容器的ID号
docker ps -a
命令格式:docker commit [选项] 容器ID/名称 仓库名称:标签
常用选项: -m 说明信息
-a 作者信息
-p 生成过程中停止容器的运行
docker images | grep daoke
2.基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板文件可以从OPENVZ开源项目下载,下载地址为http://download.openvz.org/template/precreated。
(1)下载模板文件
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
docker images | grep new
3.基于Dockerfile创建
Dockfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockfile中的指令生成指定镜像。
- Dockfile结构大致分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
- Dockfile每行支持一条指令,每条指令可携带多个参数,支持使用”#“号开头的注释。
Dockerfile有十几条命令可用于构建镜像,其中常见的指令如下:
指令 | 含义 |
---|---|
FROM 镜像 | 指定所创建镜像的基础镜像 |
MAINTAINER 名字 | 指定维护者信息 |
RUN 命令 | 在所基于镜像上执行命令 |
CMD ["要运行的程序",“参数1”,“参数2”] | 指定启动容器时默认执行的命令 |
LABEL | 指定生成镜像的元数据标签信息 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD < src > |
赋值指定的< src > 路径下的内容到容器中的 |
COPY < src > |
复制本地主机的 |
ENTRYPOINT | 指定镜像的默认入口 |
VOLUME ["目录"] | 在容器中创建数据卷挂载点 |
USER 用户名/UID | 指定运行容器时的用户名或UID |
WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ARG | 指定镜像内使用的参数(例如版本号信息等) |
ONBUILD 命令 | 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令 |
STOPSIGNAL | 容器退出的信号值 |
HEALTHCHECK | 如何进行健康检查 |
SHELL | 指定使用shell时默认shell类型 |
例如基于Dockerfile创建httpd镜像,步骤如下:
(1)建立目录,作为生成镜像的工作目录
mkdir apache
cd apache
(2)创建并编写Dockerfile文件
vim Dockerfile
#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER The porject
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
(3)编写执行脚本内容
vim run.sh
#!/bin/bash
rm -rf /run/httpd/* #清理httpd缓存
exec /usr/sbin/apachectl -D FOREGROUND #启动apache服务
(4)创建测试页面
echo "web test" > index.html
需要注意的是Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件都必须在工作目录下同一级。
命令格式:docker build [选项] 路径
常用选项: -t 指定镜像的标签信息
docker build -t httpd:centos . #注意别忘了末尾有"."
docker run -d -p 1216:80 httpd:centos #其中-p选项实现从本地端口1216到容器中的80端口的映射
本机的ip地址是192.168.100.138,访问容器中的Apache服务。
firefox http://192.168.100.138:1216
创建私有仓库
使用registry镜像来搭建本地私有仓库。
1.下载registry镜像
docker pull registry
2.在/etc/docker/目录下创建一个json文件,定义私有仓库地址
vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.100.138:5000"]}
3.重启docker服务
systemctl start daemon-reload
systemctl restart docker.service
4.使用下载好的registry镜像启动一个容器
- 默认情况下仓库存放于容器内的/tmp/registry目录下。
- -v选项可以将本地目录挂载到容器内的/tmp/registry下使用,这样就不会容器被删除后镜像也会随之消失。
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
5.将上传的镜像标记
docker tag httpd:centos 192.168.100.138:5000/httpd
6.上传做标记的镜像
docker push 192.168.100.138:5000/httpd
7.获取私有仓库列表
curl -XGET http://192.168.100.138:5000/v2/_catalog
curl -XGET http://192.168.100.138:5000/v2/httpd/tags/list
8.删除做标记的镜像
docker rmi 192.168.100.138:5000/httpd
docker images
9.从私有仓库下载标记的镜像
docker pull 192.168.100.138:5000/httpd