Docker 镜像创建、私有仓库搭建和数据管理

Docker 镜像的创建方法

Docker 镜像除了是 Docker 的核心技术之外也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。

创建镜像的三种方法 :

  • 基于已有的镜像创建
  • 基于本地模板创建
  • 基于 Dockerfile 创建 (推荐)

基于已有的镜像创建 :

基于已有的镜像创建主要使用 docker commit 命令。实质就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。

命令格式 :docker commit [选项] 容器ID/名称 仓库名称:[标签]

-m:说明信息

-a:作者信息

-p:生成过程中停止容器的运行

[[email protected] ~]# docker images        #已有的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos/httpd        latest              e23d3fcb4169        2 weeks ago         296MB
[[email protected] ~]# docker create -it centos/httpd /bin/bash      #创建容器
8fc4cfb9a461d14526e44b3767810d893eec46363e30591ddaf644430ad03f66
[[email protected] ~]# docker ps -a        #查看进程
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8fc4cfb9a461        centos/httpd        "/bin/bash"         24 seconds ago      Created                                 keen_bhabha
[[email protected] ~]# docker commit -m "new" -a "haike" 8fc4cfb9a461 haike:test  #创建新的镜像
sha256:e429fccbc44f20d1302fd1a77905d06b8614323c2da321607095c41c5f8ac58d
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
haike               test                e429fccbc44f        17 seconds ago      296MB
centos/httpd        latest              e23d3fcb4169        2 weeks ago         296MB

基于本地模板创建 :

通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址 http://openvz.org/Download/template/precreated

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz   #下载 debian 模板压缩包

cat debian-7.0-x86-minimal.tar.gz | docker import - haike:new   #导入

docker images | grep new

基于 Dockerfile 创建 :

使用 Dockerfile 自动生成镜像,Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令, Docker 程序将读取 Dockerfile 中的指令生成指定的镜像。

Dockerfile 结构大致分为四个部分 :基础镜像信息、维护者信息、镜像操作指令和容器指定启动时执行指令。

1.编辑 Dockerfile 文件 :

mkdir  apache
cd  apache

vim Dockerfile    #固定格式

#基于的基础镜像
FROM centos       #第一行必须指明所基于的镜像名称(本地不存在会自动从公共仓库下载)
#维护镜像的用户信息
MAINTAINER The porject <[email protected]>
#镜像操作指令安装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"]

Dockerfile 操作指令

指令 含义
FROM 镜像 指定新镜像所基于的镜像,第一条指令必须为FORM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER名字 说明新镜像的维护人信息
RUN 命令 在所基于的镜像上执行命令,并提交到新的镜像中
CMD["要运行的程序","参数1","参数2"] 指定启动容器时要运行的命令或脚本,Dockerfile只能有一条CMD命令,如果指定多条则只执行最后一条
EXPOSE 端口号 指定新镜像加载到Docker时需要开启的端口
ENV 环境变量 变量值 设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录 将本地主机上的源文件/目标复制到目标地点,源文件/目录要与Dockerfile位于相同目录中
VOLUME ["目录"] 在容器中创建一个挂载点
USER 用户名/UID 指定运行容器时的用户
WORKDIR 路径 为后续的RUN、CMD、ENTRYPOINT 指定工作目录
ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所需要运行的命令

2.编写执行脚本 :

vim run.sh

#!/bin/bash
rm -rf /run/httpd/*   #清除缓存
exec /usr/sbin/apachectl -D FOREGROUND   #启动 httpd 服务

3.创建测试首页 :

echo "web test" > index.html
[[email protected] apche]# ls    #三个文件必须在同一文件夹下
Dockerfile  index.html  run.sh

4.生成镜像 :

docker build -t httpd:centos .   #注意有一个空格点   -t :指定镜像的标签信息

5.使用新的镜像运行容器 :

[[email protected] apche]# docker run -d -p 1213:80 httpd:centos    #-p实现本地端口1213映射到容器80端口
ca6935190dcd0335a10ef008426df718a8443b1d7512057728894bdf3773996f
[[email protected] apche]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
ca6935190dcd        httpd:centos        "/run.sh"           8 seconds ago       Up 7 seconds        0.0.0.0:1213->80/tcp   modest_ritchie
8fc4cfb9a461        centos/httpd        "/bin/bash"         About an hour ago   Created                                    keen_bhabha

6.测试网页访问 :


构建私有仓库

1.使用 registry 搭建 :

[[email protected] ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete
c12c92d1c5a2: Pull complete
4fbc9b6835cc: Pull complete
765973b0f65f: Pull complete
3968771a7c3a: Pull complete
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for registry:latest

2.创建 json 文件 :

vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.217.149:5000"]}   #本地IP地址

systemctl restart docker.service    #重启服务

3.将本地目录挂载到容器内 :

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
#本地 容器  镜像名称    

4.更改上传镜像标签 :

docker tag centos/httpd 192.168.217.149:5000/httpd  

5.上传更改过标签镜像 :

[[email protected] ~]# docker push 192.168.217.149:5000/httpd
The push refers to a repository [192.168.217.149:5000/httpd]
f343a0957e4a: Pushed
a0478e9c2d36: Pushed
4da51a5114d3: Pushed
bcc97fbfc9e1: Pushed
latest: digest: sha256:e90736de0cd0c46c20dc8fb91e0c7a3f98863e8f3efde97a8d7bd455e5ac6e54 size: 1155

6.查看私有仓库 :

[[email protected] ~]# curl http://192.168.217.149:5000/v2/_catalog
{"repositories":["httpd"]}

Docker 数据管理

在 Docker 中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就涉及到容器的数据管理操作。

数据卷

数据卷是一个提供使用的特殊目录,位于容器中,可以将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。

1.挂载容器 :

[[email protected] ~]# docker run -v /var/www/:/data1 --name test -it centos /bin/bash
[[email protected] /]#
#宿主机目录/var/www 挂载容器中的/data1  目录不存在会自动创建   --name:给容器创建名称  -v:创建数据卷

2.测试同步 :

[[email protected] /]# cd data1/
[[email protected] data1]# ls
cgi-bin  html
[[email protected] data1]# mkdir tset01
[[email protected] data1]# ls
cgi-bin  html  tset01
[[email protected] data1]# exit
exit
[[email protected] ~]# cd /var/www/
[[email protected] www]# ls
cgi-bin  html  tset01

数据卷容器

容器之间共享数据,最简单的方法就只使用数据卷容器。

[[email protected] ~]# docker run --name test01 -v /data1 -v /data2 -it centos /bin/bash
#在test01容器里创建两个文件夹
[[email protected] /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[[email protected] /]# exit
exit
[[email protected] ~]# docker run -it --volumes-from test01 --name db1 centos /bin/bash
#在db1容器里使用--volumes-from 命令挂载test01的目录
[[email protected] /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[[email protected] /]# cd data1
[[email protected] data1]# ls
[[email protected] data1]# mkdir test   #创建文件夹测试
[[email protected] data1]# ls
test
[[email protected] data1]# exit
exit
[[email protected] ~]# docker exec -it test01 /bin/bash
#test01 容器需要创建、开启才能进入 已完成忽略
[[email protected] /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[[email protected] /]# cd data1/
[[email protected] data1]# ls
test

原文地址:http://blog.51cto.com/13640803/2160495

时间: 2024-11-11 20:42:32

Docker 镜像创建、私有仓库搭建和数据管理的相关文章

Docker镜像创建及建立私有仓库

Docker镜像创建方法 创建镜像的方法有三种,分别是基于已有的镜像创建.基于本地模板创建.基于Dockerfile 创建,下面着重介绍这三种创建镜像的方法. ? 基于已有镜像创建 首先将镜像加载到容器,将容器里面运行的程序及运行环境打包起来生成新的镜像,需要记住该容器的ID号. 命令格式: docker commit [选项] 容器ID/名称 仓库名称:[标签] 常用选项: -m:说明信息 ? -a:作者信息 ? -p:生成过程中停止容器的运行 # docker create -it nick

Docker 镜像创建方法

Docker 镜像创建方法 Docker镜像创建方法 创建镜像的方法有三种,分别是基于已有的镜像创建.基于本地模板创建.基于Dockerfile 创建,下面着重介绍这三种创建镜像的方法. 一.基于已有镜像创建 首先将镜像加载到容器,将容器里面运行的程序及运行环境打包起来生成新的镜像,需要记住该容器的ID号.命令格式: docker commit [选项] 容器ID/名称 仓库名称:[标签] 常用选项: -m:说明信息 ?-a:作者信息 ?-p:生成过程中停止容器的运行 例子: docker cr

Docker 18.03私有仓库搭建

我们在使用Docker时 下载镜像一般都是在外网下载并使用.可是当我们没有外网时我们不得不自己搭建私有仓库.流程图:docker 版本[[email protected] ~]# docker versionClient:Version: 18.03.1-ceAPI version: 1.37Go version: go1.9.5Git commit: 9ee9f40Built: Thu Apr 26 07:20:16 2018OS/Arch: linux/amd64Experimental:

docker镜像创建

关于docker镜像的构建有四种形式:     官方下载    dockerfile创建    yum安装    容器commit生成 作为比较核心的东西,镜像的好坏直接影响docker的使用体验 首先说下四种方式的区别: ①官方下载就是docker pull 自己需要的镜像,当然这个是按照镜像的名字去下载,这里就有一个问题,别人写的镜像跟自己的需求不一定是完全吻合的. ②然后是dockerfile写镜像,这个是在官方镜像的基础上去添加自己想要的东西,构成自己的镜像,个人感觉是一种折中的方案.但

在Docker中创建私有仓库

仓库简介 随着创建的镜像日益增多,就需要有一个保存镜像的地方,这就是仓库.目前有两种仓库:公共仓库和私有仓库.最方便的就是使用公共仓库上传和下载镜像,下载公共仓库中的镜像不需要注册,但上传镜像到公共仓库是需要注册的.公共仓库中填写完成仓库的ID号.邮箱以及登录仓库的密码并在邮件中进行激活就可以上传自己的镜像. 那么怎么构建属于自己的私有仓库呢?可以使用registry来搭建本地私有仓库. 步骤 下载registry镜像 # docker pull registry 下载完成后的状态: Using

通过已有Nginx镜像创建私有仓库

想搭建一个私有的Docker仓库,查看了各种资料,大多是使用Nginx做代理,可是由于对于Nginx不熟悉,各种关于权限认证的问题,折腾了两天也没有搞定,后来无意在网上看到一篇使用已有镜像的方法,终于搞定了,原文参考:http://cloud.51cto.com/art/201412/458680_all.htm 测试环境 192.168.40.71   CoreOS   仓库服务器 192.168.40.83   CoreOS    客户机 仓库服务器配置 执行下面的命令,启动registry

jenkins-python3.6.8-ansible2.5 docker镜像创建

dockerfile FROM openjdk:8-jdk #debain 9 #将debain源替换成阿里源 RUN echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib" > /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/debian/ stretch main non-fr

Docker(四)镜像创建

Docker镜像创建 Docker镜像创建的方法 1:基于已有镜像创建 基于已有景象创建主要使用docker commit 命令.实质就是把一个容器里面运行程序以及程序的运行环境打包起来生成新的镜像 命令格式:docker commit [选项] 容器ID/名称 仓库名称:[标签] 常用命令选项: -m:说明信息 -a:作者信息 -p:生成过程中停止容器的运行 例: 首先启动一个镜像,在容器里修改,然后将修改的镜像生成新的镜像,需要记住id号 [[email protected] ~] dock

Docker学习笔记六:Docker搭建企业级私有仓库

前言 Docker不仅是一个强大的服务器部署工具,而且它还有一个官方的Docker Hub registry用于储存Docker镜像.上传镜像到Docker Hub是免费的,上传的镜像文件同时也对公共领域开放,而这可能不是我们想要的. 本文介绍如何配置一个私有的Docker registry,在此上传的镜像是私密的,你可以从另一个联网的主机以安全的方式下载此registry上的镜像. 本文仅介绍registry的创建,而不讨论应用的容器化.有关Docker镜像创建的操作可参考这篇Docker入门