Commit

Docker镜像都是只读的,当容器启动时一个新的可写层被加载到了顶部,这一层就是容器层,容器之下的都是镜像层
提交镜像

# 提交修改过的镜像 --author --message
docker commit -a [名称] -m [注释] [容器id] [REPOSITORY]:[TAG]

将一个容器变成一个新的镜像

容器数据卷

数据安全,容器的持久化和同步操作
保护重要数据不会因为容器删除而丢失

# 本地目录与容器内目录内的文件会互相同步 --volume
# 可以配置多个
docker run -it -v [本地目录]:[容器内目录] [镜像id/仓库名]

docker inspect [容器id] 中的Mounts
source主机内的地址
destination 为容器内地址

设置权限

# readonly 只读
docker run -it -v [本地目录]:[容器内目录]:ro [镜像Id/仓库名]
# readwrite 可读可写
docker run -it -v [本地目录]:[容器内目录]:rw [镜像Id/仓库名]

匿名挂载
只指定容器内的路径就是匿名挂载

# 一般不建议匿名挂载
docker run -it -v [本地目录] [镜像Id/仓库名]

具名挂载

# 并且指定名称的就是具名挂载
docker run -it -v [指定名称]:[本地目录] [镜像Id/仓库名]

查看挂载的所有数据卷

# 查看所有数据卷
docker volume ls
# 其中Mountpoint就是挂载的真实地址
docker volume inspect [具名挂载的名称]

Dockerfile

通过脚本生成镜像
创建一个dockerfile文件
建议命名为Dockerfile,这样build命令就无须-f指定dockerfile
指令需要全部大写,每个指令都会创建并提交一个新的镜像层(最后运行的时候最外层嵌套一层可写容器层)

# 基础构建
FROM centos
# 作者
MAINTAINER youname<youemail@xx.com>
# 定义环境变量
ENV MYPATH /usr/local
# 通过环境变量配置工作环境(进入改容器后的目录)
WORKDIR $MYPATH
# 传递多个参数用[]
ENTRYPOINT ["ls","-a"]
# 安装vim
RUN yum -y install vim
# 安装net-tools
RUN yum -y install net-tools
# 暴露端口
EXPOSE 80
# 打印
CMD echo $MYPATH
# 使用bash执行脚本
CMD /bin/bash

使用dockerfile

# 构建 --file --tag
# .号的含义为构建上下文
docker build -f [dockerfile目录] -t [镜像名]:[TAG] .

DockerFile:构建文件,定义了生成镜像的一切步骤
Docker镜像:通过DockerFile构建生成镜像并最终发布
Docker容器:通过镜像运行起来提供服务

ENTRYPOINT 与 CMD的区别
使用ENTRYPOINT只有最后一个ENTRYPOINT 会执行,run时可以追加参数

FROM centos
# docker run [容器Id] -l时执行 ls -al
# docker run [容器Id] pwd执行多个命令会导致无法正常运行
ENTRYPOINT ["ls","-a"]

使用CMD只有最后一个CMD会执行,run时无法追加参数

FROM centos
# docker run [容器Id] -l时报错,无法追加参数
# docker run [容器Id] ls -al才能正常执行
# docker run [容器Id] pwd 只能执行pwd命令
CMD ["ls","-a"]

指令

FROM 基础镜像
MAINTAINER 镜像作者的姓名联系方式(姓名+邮箱)
RUN 镜像构建的时候需要运行的命令
ADD 往基础镜像中添加内容(自动解压)
WORKDIR 镜像的工作目录
VOLUME 挂载的目录
EXPOSE 暴露的端口
CMD 容器运行时会运行的命令(只有最后一个会生效)
ENTRYPOINT 容器运行时会运行的命令(可以追加命令)
ONBUILD 当构建一个被继承Dockerfile时会运行ONBUILD指令
COPY 将文件拷贝到镜像之中
ENV 构建时设置的环境变量

构建过程

# 查看本地镜像的构建历史
docker history [镜像名/镜像Id]:[版本号]

容器服务

登录
首先需要DockerHub账户

# 登录 --username
docker login -u [用户名]
$ Password: [密码]
# 之后可以无需用户名密码登录
docker login
# 退出登录
docker logout

提交镜像
提交至DockerHub

# 可以先用docker tag改变名称后提交
docker push [REPOSITORY]:[TAG]

使用阿里云镜像服务

容器镜像服务 -> 默认实例 ->命名空间->创建命名空间
默认实例->镜像仓库->创建镜像仓库 选择命名空间 本地仓库
可以在 默认实例->访问凭证 中修改密码

# 登录阿里云Docker Registry
docker login -u=[用户名] registry.cn-shanghai.aliyuncs.com
$ Password: [密码]
# 推送镜像
docker tag [镜像Id] registry.cn-shanghai.aliyuncs.com/[命名空间]/[REPOSITORY]:[TAG]
docker push registry.cn-shanghai.aliyuncs.com/[命名空间]/[REPOSITORY]:[TAG]

归档

一般不使用归档而是直接通过push命令推送到云端容器

# 归档
docker save [本地地址] [镜像名/镜像Id]
# 导出
docker load [本地地址] -i [指定导入的镜像]

未完待续...