docker教程-docker镜像

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 登陆阿里云,点击控制台,进入容器镜像服务:在这里插入图片描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值