一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统数据支撑。Docker镜像时分层结构的,是由多个层级组成,每个层级分别存储各种软件实现某个功能。

Docker镜像作为Docker中最基本的概念,有以下特性:

1. 镜像是分层的,每个镜像都是由一个或多个镜像层组成,可通过在某个镜像加上一定的镜像层来得到新镜像;2. 每个镜像层拥有唯一镜像ID,Docker引擎默认通过镜像ID来识别镜像;3. 镜像在存储和使用时,共享相同的镜像层,在PULL镜像时,已有的镜像层会自动跳过下载;4. 每个镜像层都只读,即使启动层容器,也无法进行真正的修改,修改只会作用于最上层的容器层。

作为运维人员,我们可以制作内部的Docker镜像,Docker镜像方法有两种:

基于原始文件和目录从0开始制作镜像基于Docker官网仓库镜像制作叠加镜像
  • docker及docker-compose命令自动补全:
# source /usr/share/bash-completion/completions/docker# source /usr/share/bash-completion/completions/docker-compose# yum install -y bash-completion# source /usr/share/bash-completion/bash_completion

基于原始文件和目录从0开始制作镜像

  1. 基于CentOS Linux干净系统(初始化安装完成),将整个系统打包成tar文件即可:
# cd /root# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7-base.tar /# ls
anaconda-ks.cfg  centos7-base.tar
  1. 将制作完成的基础镜像拷贝到远程服务器,并且导入至Docker images列表中:
# cat centos7-base.tar | docker import - centos7
sha256:d25481af31ead8067dc11f2b949767ddbe82d50ecbd26a753b9a454d9656f64c# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             latest              d25481af31ea        19 seconds ago      1.43GB
  1. 基于导入的CentOS镜像启动CentOS容器:
# docker run -itd centos7:latest /bin/bash
de2579408a3e43838b2dbb8f98847f1b69407a7e344b136efc0b1149f4d71934# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
de2579408a3e# docker exec -it de cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) # docker exec -it de ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)RX packets 16  bytes 1296 (1.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

根据上面的方法,我们可以制作各种企业应用软件和程序镜像,并且将镜像方便的迁移至各个平台。


基于Docker官网仓库镜像制作叠加镜像

完全从0开始制作基础镜像通常比较繁琐、复杂,在生产环境下,可以基于Docker官网提供的各种基础镜像模板来制作镜像,这样可以节省时间、人力成本等。

基于Docker官网仓库镜像制作新镜像主要有三种方式:

Docker commit方式Docker export方式Dockerfile方式
  1. Docker commit方式:

基于基础镜像,通过Docker run启动新的容器,exec或者远程进入新容器,根据企业中的需求,部署相关的软件、修改相应的配置,然后将整个容器系统commit提交成一个全新的镜像。

# docker exec -it de bash[root@de2579408a3e /]# passwd root[root@de2579408a3e /]# mkdir /data[root@de2579408a3e /]# wget -P /data/ http://nginx.org/download/nginx-1.14.2.tar.gz[root@de2579408a3e /]# exit# docker commit de centos7:v1
sha256:556dd5d8972969c0e54d1d5733b2bc9cca4ced1de974377011b79c04ab618433# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             v1                  556dd5d89729        4 seconds ago       1.43GB
centos7             latest              d25481af31ea        25 minutes ago      1.43GB

新生成的容器中有新建的/data目录,目录下有nginx的tar包。

  1. Docker export方式:

基于基础镜像,通过Docker run启动新的容器,exec或者远程进入新容器,根据企业中的需求,部署相关的软件、修改相应的配置,然后将整个容器系统export导出成一个全新的镜像文件,然后可以该镜像文件拷贝到其它主机上,再import导入成镜像。

# docker export de -o centos7-v2.tar# ls
anaconda-ks.cfg  centos7-base.tar  centos7-v2.tar# docker import centos7-v2.tar centos7:v2
sha256:f4fddd805f795d4b0a6f08df7cc05f5a59eaac09d36e141f7b510a706b7c9856# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             v2                  f4fddd805f79        16 seconds ago      1.43GB
centos7             v1                  556dd5d89729        7 minutes ago       1.43GB
centos7             latest              d25481af31ea        32 minutes ago      1.43GB

上面两种方法,只有docker export制作的镜像默认可以拷贝到其它的平台,docker commit制作的镜像只在images列表中,而不是一个tar文件,如何将images列表中的镜像导出呢?

# docker save centos7:v1 -o centos7-v1.tar# ls
anaconda-ks.cfg  centos7-base.tar  centos7-v1.tar  centos7-v2.tar# docker load -i centos7-v1.tar
Loaded image: centos7:v1
  1. Dockerfile方式:

企业生产环境中,推荐使用Dockerfile制作镜像,Docker制作原理是基于一个基础镜像,通过编写Dockerfile文件的方式,将各个功能进行叠加,最终形成新的Docker镜像,是目前互联网企业中打包镜像最为推荐的方式。

Dockerfile 是一个镜像的表示,也是一个镜像的原材料,可以通过Dockerfile来描述构建镜像,并自动构建一个容器。

下面是Dockerfile制作镜像的指令和参数:

FROM     指定基于哪个基础镜像MAINTAINER     指定作者信息RUN     镜像操作指令CMD     指定容器启动时执行的命令,只能有一条,写多条也只有最后一条生效EXPOSE     指定镜像内服务监听的端口ENV     为后续的RUN指令提供一个环境变量ADD     将本地的一个文件或目录拷贝到容器的某个目录里COPY     将本地的一个文件或目录拷贝到容器的某个目录里,推荐使用COPY而不是ADDENTRYPOINT     指定容器启动时执行的命令,只能有一条,写多条也只有最后一条生效VOLUME     创建一个可以从本机或者其他容器挂载的挂载点USER     指定运行容器的用户或UIDWORKDIR     为后续的RUN、CMD或者ENTERPOINT指定工作目录ARG     指定镜像内使用的参数(如版本号信息等)ONBUILD     配置当前所创建的镜像作为其它镜像的基础镜像时,所执行的创建操作的命令STOPSIGNAL     容器退出的信号HEALTHCHECK     如何进行健康检查SHELL     指定使用shell时的默认shell类型

ENTRYPOINT和CMD的区别在于ENTRYPOINT可以使用CMD作为参数,通常都是用来启动后台服务。

  • 编写Dockerfile:
# cat nginx.confuser nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;events
{use epoll;worker_connections 6000;
}http
{include mime.types;default_type application/octet-stream;server_names_hash_bucket_size 3526;server_names_hash_max_size 4096;log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]''$host "$request_uri" $status''"$http_referer" "$http_user_agent"';sendfile on;tcp_nopush on;keepalive_timeout 30;client_header_timeout 3m;client_body_timeout 3m;send_timeout 3m;connection_pool_size 256;client_header_buffer_size 1k;large_client_header_buffers 8 4k;request_pool_size 4k;output_buffers 4 32k;postpone_output 1460;client_max_body_size 10m;client_body_buffer_size 256k;client_body_temp_path /usr/local/nginx/client_body_temp;proxy_temp_path /usr/local/nginx/proxy_temp;fastcgi_temp_path /usr/local/nginx/fastcgi_temp;fastcgi_intercept_errors on;tcp_nodelay on;gzip on;gzip_min_length 1k;gzip_buffers 4 8k;gzip_comp_level 5;gzip_http_version 1.1;gzip_types text/plain application/x-javascript text/css text/htm application/xml;server
{listen 80;server_name localhost;index index.html index.htm index.php;root /usr/local/nginx/html;location ~ \.php$ {include fastcgi_params;fastcgi_pass unix:/tmp/php-fcgi.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;}}}
# vim Dockerfile
## Set the base image to CentOS
FROM centos7:latest
# File Auther / Maintainer
Maintainer lzx lzx@lzxlinux.com
# Install necessary tools
RUN rpm --rebuilddb && \yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel && \yum clean all && \rm -rf /var/cache/yum/*
# Install Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
RUN tar zxf nginx-1.8.0.tar.gz && \mkdir -p /usr/local/nginx  && \cd nginx-1.8.0 && \./configure --prefix=/usr/local/nginx && \make && make install && \rm -fv /usr/local/nginx/conf/nginx.conf
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
# Expose ports
EXPOSE 80
# Set the default command to execute when creating a new container
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd           #加上tail -f防止容器启动完nginx就自动停止
  • 构建新镜像:
# docker build -t centos7:nginx .
Successfully built e20207cefc88
Successfully tagged centos7:nginx# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             nginx               e20207cefc88        4 minutes ago       1.68GB
centos7             v2                  f4fddd805f79        About an hour ago   1.43GB
centos7             v1                  556dd5d89729        About an hour ago   1.43GB
centos7             latest              d25481af31ea        About an hour ago   1.43GB
  • 运行新镜像:
# docker run -itd -p 80:80 centos7:nginx bash
38b1e0876f834b78f2f8223449c2cca42fa4ab87d047b2dc5b7831a247cab871# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

访问本地80端口,可以访问到nginx欢迎页,说明容器内nginx服务已经启动并监听80端口。


Docker虚拟化镜像制作相关推荐

  1. 【Docker】镜像制作及使用Dockerfile制作镜像

    Docker镜像制作 1.镜像构成 2.使用容器制作镜像 Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响. 1.将springboo ...

  2. alpine(Go环境)Docker基础镜像制作

    安装glibc :https://github.com/sgerrand/alpine-pkg-glibc/ 设置时区 RUN echo -e "https://mirror.tuna.ts ...

  3. Docker的镜像制作与整套项目一键打包部署

    Dockerfile常用指令介绍 指令 描述 FROM 构建的新镜像是基于哪个镜像.例如:FROM centos:6 MAINTAINER 镜像维护者姓名或邮箱地址.例如:MAINTAINER Mr. ...

  4. Docker学习笔记1 :镜像制作

    参考资源: http://blog.csdn.net/kongxx?viewmode=contents http://my.oschina.net/feedao/blog ============== ...

  5. Docker 镜像制作和管理

    2 Docker 镜像制作和管理 2.1 Docker 镜像说明 2.1.1 Docker 镜像中有没有内核 docker run --rm apline uname -r #内核 2.1.2 为什么 ...

  6. Docker基础管理和镜像制作

    目录 docker执行规则        有前台的进程才能进去页面 下载镜像存在位置 操作系统的镜像是不运行的需要有前台才能进行 列: 清除dangling的镜像,dangling images表示T ...

  7. 系统制成docker镜像_Docker学习以及镜像制作流程

    一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  8. 浅谈Docker:DockerLinux安装,镜像管理命令,镜像制作命令,容器管理命令,数据卷,DockerFile,Docker-compose

    什么是Docker? Docker 概念 • Docker 是一个开源的应用容器引擎 • 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) • ...

  9. 实战 | ​Docker ubuntu:18.04 镜像制作

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 ...

最新文章

  1. Couchbase 介绍 - 更好的 Cache 系统
  2. 用c语言get统计字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  3. element UI 单选框设置默认选中值
  4. fla 走迷宫游戏 源码_迷宫新玩法,果断一试
  5. 【原】npm 常用命令详解
  6. python测试题 - 列表,字典,字符串
  7. 解决sodu echo写入文件是权限不足-bash: test.txt: Permission denied
  8. [swift] LeetCode 49. Group Anagrams
  9. 《深入浅出数据分析》笔记一
  10. VS2015+Access2016编写数据库程序
  11. 网站服务器后缀名,服务器域名,域名后缀
  12. GenericObjectPoolConfig属性
  13. 刨根究底字符编码之八——Unicode编码方案概述
  14. openssl 1.0.2 漏洞修复指南
  15. 安卓手机如何投屏到电视上_如何将手机投屏到电视上?原来这么简单好用
  16. 【seaborn】jointplot 改变图片长宽比,非方形
  17. 华为nova手机打开开发者模式
  18. TX2超详细,超实用刷机教程(亲测有效,所有步骤都是博主亲自实践过)
  19. 工作日志:502 Bad Gateway异常分析
  20. Jasper(1)——入门

热门文章

  1. app测试的重点关注内容
  2. 将与NetApp合资成立联想凌拓 联想AI、IoT战略终成闭环
  3. 阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例
  4. 常见中文编码方式介绍
  5. Headroom.js
  6. 【STM32实战】机械臂快递分拣系统(二)——机械臂控制程序(上位机)编写
  7. 数据结构第二版(朱昌杰版)栈和队列二
  8. 排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?
  9. 零基础入门python小甲鱼-小甲鱼零基础入门学习Python百度云下载 | 宅男君
  10. 针对B端产品引发的设计思考