Docker镜像的创建及上传

Docker镜像的创建及上传

Docker镜像介绍

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

创建镜像的方法有三种,分别是基于已有镜像、基于本地模版以及基于Dockerfile创建。

基于已有镜像创建

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

下面启动一个已经有的镜像,在里面容器修改后,将修改后的容器提交成为新的镜像。

[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              5182e96772bf        6 days ago          200 MB

启动一个容器

[[email protected] ~]# docker run -itd 5182e96772bf /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
4faf98f1c6619212c3205b0a7830617ff69d457c0882ed0ca4e71430fc549406

这里提示ipv4的路由功能没有开启,所以,我们需要开启ipv4的路由转发功能。

[[email protected] ~]# sysctl -p
net.ipv4.ip_forward = 1


将已经创建的容器停止并且删除,重新启动一个容器。

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
4faf98f1c661        5182e96772bf        "/bin/bash"         32 seconds ago      Up 30 seconds
[[email protected] ~]# docker stop 4faf98f1c661
4faf98f1c661
[[email protected] ~]# docker rm 4faf98f1c661
4faf98f1c661

重新创建并启动一个容器

[[email protected] ~]# docker run -itd 5182e96772bf /bin/bash
cbeb511d2b9a7a5a25ad532a1bb8183eb4008248fad3d545eaeb7f4f57f4660a

进入到容器中,查看有没有安装httpd服务。

[[email protected] ~]# docker exec -it cbeb511d2b9a /bin/bash
[[email protected] /]# rpm -q httpd
package httpd is not installed

可以看到没有安装,我们使用yum安装httpd服务后,将这个容器里面运行的程序及环境重新打包生成新的镜像。

[[email protected] /]# yum install httpd -y
[[email protected] /]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
#显示已经安装好httpd

我们使用docker commit命令创建一个新的镜像,其中有几个常用选项:

  • -m:说明信息
  • -a:作者信息
  • -p:生成过程中停止容器的运行
    [[email protected] ~]# docker commit -m "nwe" -a "test" cbeb511d2b9a apache:test
    sha256:96aaf92c7b04b6d91fcaea0d15ad7715d575dac82971458320d54d449eedc174
    [[email protected] ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    apache              test                96aaf92c7b04        12 seconds ago      319 MB
    docker.io/centos    latest              5182e96772bf        6 days ago          200 MB

    可以看到现在本地有两个镜像了,其中一个就是我们修改后,重新创建的。我们测试用这个镜像创建并启动容器,访问容器的apache服务。

    [[email protected] ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
    5ea867891f2b        96aaf92c7b04        "/bin/bash"         8 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   upbeat_spence
    cbeb511d2b9a        5182e96772bf        "/bin/bash"         39 minutes ago      Up 39 minutes                            inspiring_davinci
[[email protected] ~]# docker exec -it 5ea867891f2b /bin/bash
[[email protected] /]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
[[email protected] /]# /usr/sbin/apachectl -D FOREGROUND
Passing arguments to httpd using apachectl is no longer supported.
You can only start/stop/restart httpd using this script.
If you want to pass extra arguments to httpd, edit the
/etc/sysconfig/httpd config file.
AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using 172.17.0.3. Set the ‘ServerName‘ directive globally to suppress this message

基于本地模版创建

通过导入操作系统文件可以生成镜像,模版可以从OPENVZ开源项目下载,下面就是使用docker导入命令将下载的debian模版压缩包导入到本地镜像的例子。

[[email protected] ~]# wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
--2018-08-13 19:59:32--  http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
正在解析主机 download.openvz.org (download.openvz.org)... 185.231.241.69
正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:88436521 (84M) [application/x-gzip]

[[email protected] ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:test
sha256:2850c25d855bb1c545ab41de6f194754fbfcd5664edb78773aa7da7acf86ea7c
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daoke               test                2850c25d855b        11 seconds ago      215 MB
apache              test                96aaf92c7b04        5 hours ago         319 MB
docker.io/centos    latest              5182e96772bf        6 days ago          200 MB

导入操作完成后,就会返回镜像的ID信息,查看本地镜像列表可以看到新创建的镜像信息。

基于Dockerfile创建

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

  • ADD 命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。
  • CMD和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。
  • EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。
  • MAINTAINER这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。
  • RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
  • FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。
  • ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。
[[email protected] ~]# vim Dockerfile 

FROM centos
#基于的基础镜像centos,若本地没有,则去仓库下载
MAINTAINER test
#维护该镜像的用户信息,随意填写
RUN yum install httpd -y
#镜像操作安装apache软件包
EXPOSE 80
#开启80端口
ADD index.html /var/www/html/index.html
#复制网页首页文件
ADD run.sh /run.sh
#将启动脚本添加到镜像中
RUN chmod 777 /run.sh
#修改脚本执行权限
CMD ["/run.sh"]
#启动容器时执行脚本

[[email protected] ~]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

[[email protected] ~]# vim index.html
this is test

[[email protected] ~]# docker build -t httpd:centos .
#在Dockerfile文件目录下,运行命令,注意后面的点,一定要有
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               centos              ef950765e1bb        2 minutes ago       319 MB
daoke               test                2850c25d855b        24 minutes ago      215 MB
docker.io/centos    latest              5182e96772bf        6 days ago          200 MB
#可以看到第一个就是我们刚才创建的镜像

将新创建的镜像加载到容器中运行

[[email protected] ~]# docker run -d -p 1200:80 httpd:centos
519bf067d1ad0e06aeb030530d3bcb517be1424ed41c0635d6aca28784c80143

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
519bf067d1ad        httpd:centos        "/run.sh"           24 seconds ago      Up 23 seconds       0.0.0.0:1200->80/tcp   pedantic_elion

可以看到镜像已经在容器中运行,访问虚拟机IP以及端口即http://192.168.58.159:1200,成功访问首页。

将镜像上传到公有仓库中

随着创建的镜像日益增多,就需要一个保存镜像的地方,这就是仓库。目前有两种仓库:公共仓库和私有仓库。最方便的就是使用公共仓库和下载镜像,下载公共仓库的镜像不需要注册,但是上传镜像到公共仓库需要注册,在填完username和passwaord后就可以上传自己的镜像了。

[[email protected] ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don‘t have a Docker ID, head over to https://hub.docker.com to create one.
Username: lightblueyx
Password:
Login Succeeded

[[email protected] ~]# docker tag httpd:centos lightblueyx/httpd:centos
[[email protected] ~]# docker push lightblueyx/httpd:centos
The push refers to a repository [docker.io/lightblueyx/httpd]
cdf567d92322: Pushed
619278fd492d: Pushed
7e054e58afc8: Pushed
abf29fcf5046: Pushed
1d31b5806ba4: Pushed
centos: digest: sha256:6ce997f142e7757853296a314ea4de4309785867988ddc06dae57d5bacc428e6 size: 1362

将镜像上传到私有仓库中

可以使用registry来搭建本地私有仓库,首先需要构建私有仓库的服务器上下载registry镜像。

[[email protected] ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/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 docker.io/registry:latest

之后需要在/etc/docker目录下面创建一个json文件,否则在往自定义的私有仓库中上传镜像的时候会报错,然后重新启动docker服务。

[[email protected] ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.58.159:5000"]}
[[email protected] ~]# systemctl restart docker.service 

然后使用下载好的registry镜像启动一个容器,默认情况下仓库存放于容器内的/tmp/registry目录中,使用-v选项可以将本地目录挂载到容器内的/tmp/registry下使用,这样就不怕容器被删除后镜像也随之消失。在本地启动一个私有仓库服务,监听端口和json文件端口一致。

[[email protected] ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
b592e059d495c1498f364d4c4c676b18ee3b8e8468fbc054fc598835b7cb2a5a

使用docker tag命令将要上传的镜像标记为192.168.58.159:5000/daoke.

[[email protected] ~]# docker tag daoke:test 192.168.58.159:5000/daoke
[[email protected] ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
httpd                       centos              ef950765e1bb        46 minutes ago      319 MB
lightblueyx/httpd           centos              ef950765e1bb        46 minutes ago      319 MB
192.168.58.159:5000/daoke   latest              2850c25d855b        About an hour ago   215 MB
daoke                       test                2850c25d855b        About an hour ago   215 MB
docker.io/centos            latest              5182e96772bf        6 days ago          200 MB
docker.io/registry          latest              b2b03e9146e1        5 weeks ago         33.3 MB

使用docker push上传标记的镜像。

[[email protected] ~]# docker push 192.168.58.159:5000/daoke
The push refers to a repository [192.168.58.159:5000/daoke]
3a1d67a7fe13: Pushed
latest: digest: sha256:7eaeca4042df243bcec277baf4867b04ad6e0b1f112b8324e05655f216dc919f size:

在本地可以查看到上传的镜像。

[[email protected] ~]# cd /data/
[[email protected] data]# ls
registry

原文地址:http://blog.51cto.com/10693404/2159451

时间: 2024-10-06 13:34:07

Docker镜像的创建及上传的相关文章

docker镜像的创建

获得更多资料欢迎进入我的网站或者 csdn或者博客园 昨天讲解了docker的安装与基本使用,今天给大家讲解下docker镜像的创建的方法,以及push到Docker Hub docker安装请点击右边:ubuntu15.04下安装docker 修改已有镜像 启动已下载镜像 peace@peace:~$ sudo docker run -t -i ubuntu:12.04 /bin/bash root@909634e032f9:/# cd /home #进入home目录建立文件夹 1.c roo

Docker镜像的创建、存出、载入

创建镜像的方法有三种:基于已有镜像的容器创建.基于本地模板导入.基于Dockerfile创建,本博文讲解前两种. 基于已有镜像的容器创建 该方法是使用docker commit命令,其命令格式为: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 主要参数选项包括: -a ,–author=”” 作者信息 -m,–message=”” 提交信息 -p,–pause=true 提交是暂停容器运行 比如,先创建一个运行bash的ubuntu容器

使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上

一个用于构建和推送Docker镜像的Maven插件. 使用Maven插件构建Docker镜像,将Docker镜像push到DockerHub上,或者私有仓库,上一篇文章是手写Dockerfile,这篇文章借助开源插件docker-maven-plugin 进行操作 以下操作.默认你已经阅读过我上一篇文章: Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo http://www.ymq.io/2018/01/11/Docker-deploy-spring-bo

代码操作Sharepoint文档库(创建、上传附件)

代码操作Sharepoint文档库(创建.上传附件) 做项目中遇到客户需求,根据Infopath表单生成Excel并上传到Sharepoint指定文档库中 创建文档库 SPSite site = new SPSite(siteurl); SPListItem item = site.AllWebs["网站名"].Lists["列表名"].Folders.Add("文档库URL", SPFileSystemObjectType.Folder); i

GitHub 快速上手 ---- 创建、上传项目

1.在GitHub上建立项目 按步骤依次进行,在github上创建代码库 创建后项目在github上的地址:https://github.com/linlin1314/QY 2.上传代码 需要把github上的项目clone到本地,在本地的这个项目修改.再次提交 建立一个仓库:(一般进入所需要上传文件夹目录) 1 git init 选择要添加进仓库的文件: 1 git add . 一般如果你想分享这个文件夹里的所有代码,就在 add后面加".",上面的例子就是这样,如果传指定的,只需要

git 服务器新建一个空项目,如何在本地创建仓库上传文件

echo "# qipai" >> README.md git init git add README.md git commit -m "first commit" git remote add origin [email protected]:rongjie184/qipai.git git push -u origin master 原文地址:https://www.cnblogs.com/wangrongjie/p/12500256.html

docker 仓库及镜像的上传下载

                                                                       Docker 仓库 仓库是集中存放镜像文件的场所.有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分.实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag). 一个 Docker Registry 中可以包含多个仓库(Repository):每个仓库可以包含多个标签(Tag):每个标签对

构建自定义docker镜像,上传至docker hub

docker 优势 (外部参考) Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后 发布到任何流行的Linux机器上,便可以实现虚拟化.Docker改变了虚拟化的方 式,使开发者可以直接将自己的成果放入Docker中进行管理.方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成. 安装docker(请参考外部链接) [Ubuntu Docker 安装](http://www.runoob.com/dock

docker教程——docker镜像打包上传

在开始使用URLOS进行docker应用开发之前,我们先来了解一下docker镜像的打包方法.首先,安装URLOS,安装完成之后,docker也随之安装到了主机里.执行以下命令安装URLOS: curl -SO https://www.urlos.com/install && chmod 544 install && ./install 简单制作一个属于自己的nginx镜像 基本流程:1.从docker云端拉取一个ubuntu-16.04的镜像:2.更新这个镜像,并安装ng