docker镜像
创建镜像
镜像概述
docker镜像是docker容器技术的核心,也是应用打包构建发布的标准格式。一个完整的镜像可以支撑多个容器的运行。
镜像构建方式
- 基于已有的容器创建镜像
- 基于本地模板创建镜像
- 基于dockerfile创建镜像
镜像构建
-
基于已有容器创建镜像 好比于一个容器的导入与导出
基于现有镜像创建主要使用docker commit 命令,也就是将一个容器里运行的程序以及环境打包成一个新的镜像
格式:docker commit (选项) 容器 ID/名称 仓库名称:[标签]-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行[root@localhost ~]# docker run -it centos:7 /bin/bash #启动并进入容器 [root@94ae368b757b /]# touch whml 创建一个文件 [root@localhost ~]# docker commit -m "whml test images" -a "whml" 94ae368b757b centos:new -m :说明信息 -a :作者 #打包成一个名字叫做centos:new的镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos new 4eedfa364e2a About a minute ago 589MB [root@localhost ~]# docker run -it centos:new /bin/bash [root@672f7166243b /]# ls whml
-
基于本地模板导入镜像
也就是别人导出一个新的镜像,自己在导入使用 -
基于Dockerfile创建镜像
Docker镜像结构:镜像是由多层堆叠构成的(可以使用命令docker history 镜像:标签来查看),Docker镜像默认存储在/var/lib/docker/目录中。容器其实就是在镜像最上面加了一层读写层。 docker 镜像特点:
- dockerfile中的每一个指令都会创建一个新的镜像层
- 镜像层可以被缓存和复用,类似于快照
- 当Dockerfile中的指令被修改,复制的文件变化或者构建镜像时指定的变量更换,那对应的镜像层换粗也将会失效
- 某一层的镜像缓存失效,后面所有的镜像缓存层都会失效
- 镜像层是不可变的,如果某一层中添加一个文件,然后某一层中删除它,则镜像中依然会包含该文件,只是这个文件在docker容器中不可见了
dockerfile介绍:
Dockerfile是一种可以被Docker程序解释的脚本,由多条指令堆叠组成,每条指令都对应linux下的一条命令。
Dockerfile结构:基础镜像信息,维护者信息,镜像操作,容器启动执行指令Dockerfile详解
-
Dockerfile 的指令根据作用分为:构建指令:构建生成镜像中使用的,不会在image容器上执行,设置指令:设置image属性。
-
from 镜像:Tag
构建指令,必须指定且需要在dockerfile文件中其他指令的前面,后续的指令都依赖于改指令指定的image,from指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库 -
MAINYAINER 作者信息
执行docker inspect可以查看 -
RUN指令
run可以运行任何被基础image支持的命令。 -
CMD[“要运行的程序”,“参数1”,“参数2”]
设置指令,容器启动时要执行的操作,只能在文件中存在一次,多条只执行最后一条 -
ENTRYPOINT(设置container启动执行的操作)
设置指令,指定容器启动时执行的命令,可以多次所设置,但只有最后一个有效。 -
USER 用户名/UID
设置指令,设置启动容器的用户,默认是root -
EXPOSE端口(暴露端口)
-
ENV环境变量,变量值
在image中设置一个环境变量,可以通过docker inspect 查看 或者docker run --env key=value 设置修改环境变量 -
Copy 源文件 目标文件
copy命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,可以将文件直接复制到镜像中,将目录中的内容复制到镜像中不包括目录 -
ADD源文件 目标文件
更高级的复制,相对于copy,可以压缩文件并把它们添加到镜像中,还可以从URL拷贝文件到镜像中,但是会创建更多的镜像层,镜像的size会更大。 -
Volume ["目录"]
关联数据卷的 -
workdir
设置指令相当于cd命令。 -
onbuild命令
指定一所生产的镜像作为一个基础镜像时所要运行的命令 -
HealthCheck
健康检查
https://www.cnblogs.com/ityouknow/p/8595384.html -
Dockerfile构建SSHD镜像(包含ssh服务,包括密钥对连接)
基于Dockerfile制作镜像,首先要建立工作目录,然后创建Dockerfile文件,需要运行的脚本,以及要复制到容器中的文件docker images #查看已有镜像 mkdir sshd #创建一个新的目录 ssh-keygen #创意一个密钥对 cp .ssh/id_rsa.pud sshd/ #将密钥对复制到目录中 cd sshd vim Dockerfile #目录中写入Dockerfile ls Dockerfile id_rsa.pud #查看目录内容 docker build -t sshd.new . #.在当前目录执行这条命令 docker images sshd:new #查看创建的镜像 docker run -p -d 2222:22 --name sshd-test --restart=always sshd:new #启动这个镜像容器,并赋值端口 netstat -lnpt | grep :22 #查看镜像端口 ssh localhost -p 2222 #用ssh连接本机localhost端口2222并进入,因为有密钥
-
Dockerfile构建httpd镜像
#开局都是要创建一个新的目录,在目录里创建一个新的Dockerfile文件 docker build -t sshd.new . #主要是Dockerfile文件内容
sshd.Dockerfile
#基于镜像
FROM centos:7
#镜像作者信息
MAINTAINER whml<whml@163.com>
#安装相关依赖包
RUN yum -y install openssh-server net-tools openssh-devel lsof telnet
#开始安装
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ADD id_rsa.pud /root/.ssh/authorized_keys
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#打开暴露端口
EXPOSE 22
#启动
CMD ["/usr/sbin/sshd" , "-D"]
- 基于Dockerfile创建mysql
- 基于Dockerfile创建Tomcat
- 基于Dockerfile创建nginx
...