1. docker镜像详解
镜像:是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
镜像操作:
#docker commit提交容器副本使之成为一个新的镜像
# 语法
docker commit -m "提交的描述信息" -a "作者" 容器ID 新创建的目标镜像的镜像名:[标签名]
以ubuntu容器安装vim为例子:
# 拉去ubuntu镜像:
docker pull ubuntu
# 启动容器
docker run -it ubuntu /bin/bash
# 新建容器并启动
docker run -it ubuntu /bin/bash
####################################容器中交互命令
#然后使用vi命令
root@4e92d1d86d2c:/# vi a.txt
bash: vi: command not found
# 依次执行下面命令安装vim
root@4e92d1d86d2c:/# apt-get update
root@4e92d1d86d2c:/# apt-get -y install vim
# 然后就可以执行vim相关的操作了
####################################容器中交互命令
# 安装完成以后,commit成新的镜像
docker commit -m "install vim" -a "tudoutiao" 4e92d1d86d2c tudoutiao/vim_ubuntu:latest
# 查看本地镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tudoutiao/vim_ubuntu latest 838825461204 25 seconds ago 163MB
ubuntu latest d5ca7a445605 12 months ago 65.6MB
# 启动新的镜像,进入交互终端就可以使用vim命令了
docker run -it tudoutiao/vim_ubuntu /bin/bash
2 将镜像推送到阿里云
2.1 登陆阿里云,点击控制台,进入容器镜像服务:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/40a567ad7cff93c6d703da4fdf8b0d39.png)
2.2 选择新建个人实例;
2.3 创建命名空间
点击“前往开通”, 设置Registry登陆密码;
再创建命名空间;
2.4 创建镜像仓库
进入管理界面获得脚本:
脚本界面:
2.5 将镜像推送到阿里云
2.6 从阿里云仓库拉镜像
3 docker容器数据卷
简单的说就是将容器内的数据保存进宿主机的磁盘中。
运行一个带有数据卷存储功能的容器实例:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
示例:docker run -d --privileged=true -v /Users/tmp/ng-html:/usr/share/nginx/html -p 80:80 nginx
查看数据卷是否挂载成功: docker inspect 容器ID
,然后查看显示信息中的Mounts部分:
数据卷读写规则(默认读写):
# 读写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
# 容器实例内部被限制,只能读不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
容器数据卷的继承:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw --name my-container-1 镜像名
docker run -it --privileged=true -v --volumes-from my-container-1 --name my-container-2 镜像名
4 DockerFile
DockerFile 是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官网介绍地址:https://docs.docker.com/engine/reference/builder/
DockerFile语法:指令都必须为大写字母并且后面至少有一个参数;指令按照从上到下,顺序执行;#井号表示注释;每条指令都会创建一个新的镜像并对镜像进行提交。
DockerFile关键字说明:
关键字 | 描述 |
---|---|
FROM | 基础镜像,当前镜像是基于哪个镜像,指定一个已经存在的镜像作为模板,第一条必须是FROM |
MAINTAINER | 镜像维护者的姓名和邮箱 |
RUN | 容器构建时需要运行的命令; 有两种格式:shell方式(示例: RUN yum -y install vim ); exec格式(示例:RUN ["可执行文件", "参数1", "参数2"] )RUN是在docker build时运行的 |
EXPOSE | 当前容器对外暴露的端口 |
WORKDIR | 指定在创建容器后,终端默认登陆进来的工作目录 |
USER | 指定该镜像以什么样的用户去执行,如果不指定则默认使用root用户 |
ENV | 用来构建镜像过程中设置环境变量,后面使用变量的时候变量名前面加一个$符号 |
ADD | 将宿主机目录下的文件拷贝进镜像并且会自动处理URL和解压tar压缩包 |
COPY | 类似ADD,拷贝文件和目录到镜像中;容器内的指定路径不用提前建好,如果路径不存在的话会自动创建 |
VOLUME | 容器数据卷 |
CMD | 指定容器启动后要干的事情,DockerFile中可以有多个CMD指令,但是只有最后一个生效,CMD中的参数会被docker run之后的参数替换; 它和RUN命令的区别:CMD是在docker run时运行,RUN是在docker build时运行; |
ENTRYPOINT | 也是用来指定一个容器启动时要运行的命令,类似CMD指令,但是该指令不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数发送给该指令知道的程序; 如果存在多个该指令,仅最后一个生效; 可以与CMD同时使用 |
5 编写一个Dockerfile文件
实践,创建一个DockerFile文件:
FROM centos:7
MAINTAINER tudoutiao<tudoutiao@163.com>
ENV MY_PATH /usr/local
WORKDIR $MY_PATH
# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig命令查看网络ip
RUN yum -y install net-tools
# 安装java
RUN yum -y install glib.i686
RUN mkdir /usr/local/java
# 安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u181-linux-x64.tar.gz /usr/local/java
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_181
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MY_PATH
CMD echo "success--------------ok"
CMD /bin/bash
然后构建镜像: docker build -t my_centos_jdk8:1.0 .
再运行镜像: docker run -it my_centos_jdk8:1.0 /bin/bash
虚悬镜像, 创建一个Dockerfile:
FROM centos
CMD echo "hi, success"
然后执行命令: docker build .
这样构建的镜像就没有仓库名和标签,就属于虚悬镜像。
查询虚悬镜像: docker image ls -f dangling=true
删除虚悬镜像: docker image prune