Docker虚拟化镜像制作
一个完整的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开始制作镜像
- 基于CentOS Linux干净系统(初始化安装完成),将整个系统打包成tar文件即可:
# cd /root# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7-base.tar /# ls
anaconda-ks.cfg centos7-base.tar
- 将制作完成的基础镜像拷贝到远程服务器,并且导入至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
- 基于导入的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方式
- 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包。
- 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
- 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虚拟化镜像制作相关推荐
- 【Docker】镜像制作及使用Dockerfile制作镜像
Docker镜像制作 1.镜像构成 2.使用容器制作镜像 Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响. 1.将springboo ...
- alpine(Go环境)Docker基础镜像制作
安装glibc :https://github.com/sgerrand/alpine-pkg-glibc/ 设置时区 RUN echo -e "https://mirror.tuna.ts ...
- Docker的镜像制作与整套项目一键打包部署
Dockerfile常用指令介绍 指令 描述 FROM 构建的新镜像是基于哪个镜像.例如:FROM centos:6 MAINTAINER 镜像维护者姓名或邮箱地址.例如:MAINTAINER Mr. ...
- Docker学习笔记1 :镜像制作
参考资源: http://blog.csdn.net/kongxx?viewmode=contents http://my.oschina.net/feedao/blog ============== ...
- Docker 镜像制作和管理
2 Docker 镜像制作和管理 2.1 Docker 镜像说明 2.1.1 Docker 镜像中有没有内核 docker run --rm apline uname -r #内核 2.1.2 为什么 ...
- Docker基础管理和镜像制作
目录 docker执行规则 有前台的进程才能进去页面 下载镜像存在位置 操作系统的镜像是不运行的需要有前台才能进行 列: 清除dangling的镜像,dangling images表示T ...
- 系统制成docker镜像_Docker学习以及镜像制作流程
一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- 浅谈Docker:DockerLinux安装,镜像管理命令,镜像制作命令,容器管理命令,数据卷,DockerFile,Docker-compose
什么是Docker? Docker 概念 • Docker 是一个开源的应用容器引擎 • 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) • ...
- 实战 | Docker ubuntu:18.04 镜像制作
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 ...
最新文章
- Couchbase 介绍 - 更好的 Cache 系统
- 用c语言get统计字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- element UI 单选框设置默认选中值
- fla 走迷宫游戏 源码_迷宫新玩法,果断一试
- 【原】npm 常用命令详解
- python测试题 - 列表,字典,字符串
- 解决sodu echo写入文件是权限不足-bash: test.txt: Permission denied
- [swift] LeetCode 49. Group Anagrams
- 《深入浅出数据分析》笔记一
- VS2015+Access2016编写数据库程序
- 网站服务器后缀名,服务器域名,域名后缀
- GenericObjectPoolConfig属性
- 刨根究底字符编码之八——Unicode编码方案概述
- openssl 1.0.2 漏洞修复指南
- 安卓手机如何投屏到电视上_如何将手机投屏到电视上?原来这么简单好用
- 【seaborn】jointplot 改变图片长宽比,非方形
- 华为nova手机打开开发者模式
- TX2超详细,超实用刷机教程(亲测有效,所有步骤都是博主亲自实践过)
- 工作日志:502 Bad Gateway异常分析
- Jasper(1)——入门
热门文章
- app测试的重点关注内容
- 将与NetApp合资成立联想凌拓 联想AI、IoT战略终成闭环
- 阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例
- 常见中文编码方式介绍
- Headroom.js
- 【STM32实战】机械臂快递分拣系统(二)——机械臂控制程序(上位机)编写
- 数据结构第二版(朱昌杰版)栈和队列二
- 排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?
- 零基础入门python小甲鱼-小甲鱼零基础入门学习Python百度云下载 | 宅男君
- 针对B端产品引发的设计思考