03-docker入门-创建 docker 镜像
方法1:从运行的容器创建
方法2:编写 DockFile 文件创建
方法1:
打包镜像
docker commit -m "Test a change" 610 ubuntu:test_change
"Test a change" 表示描述
610 表示容器 ID 号
ubuntu:test_change 表示新镜像的名字
完成以后,可以在 docker images 中查看。
后续可以发布到阿里云或者其他地方。
方法2:
编写 DockFile 文件创建(转载)
转载自 https://blog.csdn.net/linux_player_c/article/details/53125600
**************************************
编写规则
Dockerfile中的指令主要有以下几种
1.FROM
设置基础镜像的名称,可以采用“minhviet/centos-6.5”这种全称形式,minhviet为作者名称,centos-6.6为镜像名称。
eg:
FROM minhviet/centos-6.5
要点:
FROM必须是第一个非注释的命令;
2.MAINTAINER
设置创建该镜像的作者信息。
eg:
MAINTAINER zhang chi "********@qq.com"
3.CMD
CMD指令用于指定一个容器启动时需要运行的命令,这个和RUN指令有不同。RUN指令是指镜像被构建时需要运行的命令。CMD的执行可以通过exec的方式书写。
eg:
CMD["yum", "install", "vsftpd", "-y"]
要点:
1.在Dockerfile中只可以指定一个CMD命令。如果指定多个,也只有最后一个生效。
2.如果在容器启动命令run中指定了启动时的命令,则run中的指令会覆盖掉CMD的操作。
4.RUN
RUN指令是构建镜像时所需要执行的命令,他的书写方式也有两种:
(1)shell命令行形式;
RUN yum install httpd -y
(2)exec系统调用的形式。
RUN["yum", "install", "httpd", "-y"]
要点:
1.RUN的构建时在基础镜像之上按照由上到下的顺序,以层级的方式进行构建,这有些类似于git的版本控制,一旦某个RUN命令发生错误,docker将会停止构建,并且得到构建失败前最后一次正确构建的镜像ID,可以进入该镜像排查问题。
5.ADD
ADD指令用来将构建环境下的文件和目录复制到镜像中,他和COPY的功能非常类似,额外的功能是:如果ADD的内容是一个压缩文件(tar、zip等文件),ADD会自动进行解压
ADD vsftpd.conf /etc/vsftpd/vsftpd.conf
ADD tar.nginx.gz /usr/local/nginx
要点:
1.ADD的文件路径必须是build的环境内的;
2.如果ADD的是一个目录,则目录下的数据全部会复制到指定的目录中(目录本身不复制);
3.如果是压缩包会被解压缩。
6.COPY
COPY的左右和ADD功能十分相近,它也有两种不同的方式:
(1)COPY src dest (shell形式)
(2)COPY[“src”, “dest”]
eg:
COPY test_file1 test_file2 /var/www/html/
要点:
1.COPY的文件路径必须是build的环境内的;
2.当src有多个文件时,dest必须是一个目录,而且必须以/结尾。
7.VOLUME
VOLUME[“/mounttest”]
VOLUME /mounttest
VOLUME指令用来向基于镜像创建的容器添加卷,一个卷可以存在于一个或者多个容器中。功能如下:
(1)卷在容器之间可以共享和重用;
(2)一个容器可以不是必须和其他容器共享卷;
(3)即改即生效;
(4)对镜像更新没有影响;
(5)卷会一直存在直到没有容器使用它;
(6)可以一次指定多个卷;
8.WORKDIR
在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /ope/webapp
ENTRYPOINT ["rackup"]
这里设定了两个WORKDIR目录,在第一个目录执行了RUN命令,切换到另外一个WORKDIR,然后又执行了一个ENTRYPOINT命令。
WORKDIR指定的目录不存在就会被主动创建出来。
9.USER
USER指定了该镜像启动的容器会以什么样的用户去运行。
eg:
USER nginx
USER root
10.ONBUILD
ONBUILD为镜像添加触发器(trigger),当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器将会被执行。
可以认为ONBUILD的指令是紧跟在FROM之后指定的。触发器可以是任何构建指令。
11.LABEL
LABEL用于为DOCKER镜像添加元数据,元数据以键值对额形式展示。
LABEL version=“1.0”
LABEL location=“New work” type=“Data Center”
12.STOPSIGNAL
STOPSIGNAL指令用来设置停止容器是发送什么系统调用给容器。这个信号必须是内核系统调用表的合法数。
13.ARG
ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量,我们只需要在构建时使用–build-arg即可。
ARG build
ARG webapp_user=user
14.ENV
ENV指令用来在镜像构建过程中设置环境变量。
ENV RVM_PATH /home/rvm/
15.EXPOSE
此命令通知Docker容器监听指定的网络端口 , EXPOSE 指令不会让容器的端口访问host主机,如果想要这样做就需要在运行容器的时候指定 -p flag发布一个端口范围或者 -P flag发布所有打开的端口。
编写示例
这里以zabbix的server端和zabbix的agent端两个镜像进行配置。完整的架构应该是,zabbixserver、zabbixagent和mysql。这样每个容器只负责着其中一个服务,这个是微服务的一种部署方式。让整个应用程序更下的模块化。
zabbix_server
首先在宿主机创建生成镜像的根目录:/mnt/zabbix_server,进入根目录编写Dockerfile文件:
root@vs026:/# mkdir /mnt/zabbix_server/
root@vs026:/# cd /mnt/zabbix_server/
root@vs026:/mnt/zabbix_server# touch Dockerfile
Dockerfile的内容如下:
#create the zabbix server images
FROM oraclelinux:6.7 #create zabbix user
RUN useradd zabbix #install packages
RUN yum install gcc* mysql-devel libxml2-devel net-snmp* java* curl-devel -y #set work directory
WORKDIR /zabbix #copy zabbix source code
ADD zabbix-3.2.1.tar.gz /zabbix/ #set configure directory
WORKDIR /zabbix/zabbix-3.2.1 #configure
CMD ./configure --enable-serer --enable-agent --with-mysql --enable-ipv6 --with-netsnmp --with-libcurl --with-libxml2 --enable-java EXPOSE 10051
EXPOSE 10050
其中zabbix的安装包zabbix-3.2.1.tar.gz必须要放在/mnt/zabbix_server目录下,生成镜像的过程也是分层级进行的:
...... ---> 4128d1b8dc16
Removing intermediate container 6615250f8d78
Step 4 : WORKDIR /zabbix
---> Running in 7ede380f919e
---> 51715a9a86a8
Removing intermediate container 7ede380f919e
Step 5 : ADD zabbix-3.2.1.tar.gz /zabbix/
---> 18f9d0910cde
Removing intermediate container 2199e4e6fa07
Step 6 : WORKDIR /zabbix/zabbix-3.2.1
---> Running in e3fb17ad42cd
---> f4ad0c50486e
Removing intermediate container e3fb17ad42cd
Step 7 : CMD ./configure --enable-serer --enable-agent --with-mysql --enable-ipv6 --with-netsnmp --with-libcurl --with-libxml2 --enable-java
---> Running in 34fde4a1a447
---> 69100860d16e
Removing intermediate container 34fde4a1a447
Step 8 : EXPOSE 10051
---> Running in a618d5075cea
---> bbfcb3fefd2e
Removing intermediate container a618d5075cea
Step 9 : EXPOSE 10050
---> Running in 5c13c4d33b4e
---> cb9cc37d6902
Removing intermediate container 5c13c4d33b4e
Successfully built cb9cc37d6902
最后显示生成镜像成功,查看生成的镜像:
root@vs026:/mnt/zabbix_server# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhangchiwd371/zabbix_server latest cb9cc37d6902 7 minutes ago 3.094 GB
小结
熟悉了Dockfile的语法之后,我们可以根据业务的需求创建镜像,在部署容器的时候会极大的提高效率。
03-docker入门-创建 docker 镜像的更多相关文章
- nexus3使用docker运行/创建docker私有仓库/maven私有仓库
version: '3.2' services: nexus3: container_name: nexus3 hostname: nexus3 image: sonatype/nexus3:3.14 ...
- docker之创建MariaDB镜像的方法
一.基于commit命令方式创建 docker的安装 ? 1 2 3 [root@test01 ~]# yum install docker [root@test01 ~]# systemctl en ...
- Docker 入门之docker容器创建
使用docker容器的大多数人都是因为想要隔离不同运行环境的差异,使得自己的应用能更好的移植和部署.那么我们来看看掌握docker需要掌握哪些方面. 1,搭建docker环境 2,编译镜像并将其运行成 ...
- docker容器创建MariaDB镜像
基于commit命令方式创建 docker的安装 [root@test01 ~]# yum install docker [root@test01 ~]# systemctl enable docke ...
- Docker入门 - 004 Docker 容器使用
Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. docker 可以通过命令 docker command -- ...
- Docker入门 - 003 Docker 实例
Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob: ...
- Docker入门之一Docker在Window下安装
最近这几年,各个大公司都在打造自己的云平台,什么阿里云,华为云,腾讯云等等云,以及各种的微服务架构,其实在这当中Docker容器技术算是一个很重要的角色. 一.下载 在下载之前首先检查一下自己的电脑是 ...
- Docker入门-搭建docker私有仓库
Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来使用. 注册登录 可 ...
- Docker入门——理解Docker的核心概念
1 前言 相信不少人听过这么一句话: 人类的本质是复读机. 在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统.最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用 ...
随机推荐
- [LeetCode] 2. Add Two Numbers 两个数字相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- 推荐一款移动端日历App吉日历
推荐一款移动端日历App吉日历 一 应用描述 万年历.日历.农历.黄历.假期安排.天气预报.记事提醒便捷查看,一目了然! 二 功能介绍: 1.万年历:精美的日期展示,完整的节日日历随意查看,节假日.休 ...
- mongodb 系列 ~ mongo 用户验证系列
MongoClientURI connectionString = new MongoClientURI("mongodb://root:****@dds-bp114e3f1fc441342 ...
- 使用Shell上传/下载文件
来源:https://www.cnblogs.com/pcyy/p/7568820.html 1,安装lrzsz工具包 yum install lrzsz 2,安装完成后 输入rz选择文件进行上传
- 2018-2019-2 20162329 《网络对抗技术》Exp8: Web基础
目录 Exp8: Web基础 一. 基础问题回答 1. 什么是表单 2. 浏览器可以解析运行什么语言. 3. WebServer支持哪些动态语言 二. 实验过程 1. Web前端HTML 2..Web ...
- Spring Cloud Feign高级应用
1.使用feign进行服务间的调用 spring boot2X整合nacos一使用Feign实现服务调用 2.开启gzip压缩 Feign支持对请求与响应的压缩,以提高通信效率,需要在服务消费者配置文 ...
- 万亿数据下Hadoop的核心竞争力
1.前言 在大数据时代,Hadoop有着得天独厚的优势.然而,每个企业的技术储备和需求特点不同,他们希望从海量的客户数据中挖掘真正的商业价值,像Google.Facebook.Twitter等这样的企 ...
- Java连载17-赋值类运算符&字符串的连接运算符
一.赋值运算符 1.赋值类运算符包括两种: (1)基本赋值运算符:= (2)扩展的赋值运算符: += -= *= /= &= 赋值类的运算符优先级:先执行等号右边的表 ...
- jq数字翻页效果,随机数字显示,实现上下翻动效果
最近在做一个项目,需要实时展示一串数字,要有类似于日历翻页的效果,在网上找寻了一番,发现dataStatistics这个插件http://www.jq22.com/jquery-info8141能实现 ...
- Spring-Boot-操作-Redis,三种方案全解析!
在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...