Docker基础篇(中篇)

Docker容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:
1.数据卷可在容器之间共享或重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止

命令添加数据卷

1
docker run -it -v /宿主机绝对路径目录:/容器内目录 <镜像名>

查看数据卷是否挂载成功

1
docker inspect 容器ID

默认挂载的路径权限为读写。如果指定为只读可以用:ro

1
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro <镜像名>

:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可

:还可以通过DockerFile添加数据卷,在之后DockerFile会讲到。

数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

1.以centos镜像为模板运行容器dc01作为父容器

1
docker run -it -v /usr/centos/mycentos:/usr/centos/mycentos --name dc01 centos

在/usr/centos/mycentos目录下添加dc01.txt

1
touch dc01.txt

2.dc02、dc03继承自dc01

1
docker run -it --name dc02 --volumes-from dc01 centos
1
docker run -it --name dc03 --volumes-from dc01 centos

分别在dc02、dc03的mycentso目录下添加dc02.txt、dc03.txt

3.回到dc01容器中mycentos目录下可以看到dc02、dc03各自添加的文件都能共享了

4.删除dc01,dc02的mycentos目录下新建dc02_update.txt后,查看dc03容器内文件还是可以共享

5.删除dc02后,dc03容器内文件存在

6.此时只有一个dc03了,现在我们在dc03的mycentos目录下新建dc03-update.txt

7.新建dc04继承dc03,在dc04的mycentos目录下可以看到共享的文件

1
docker run -it --name dc04 --volumes-from dc03 centos

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

DockerFile

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建三步骤

  1. 编写Dockerfile文件
  2. docker build
  3. docker run

DockerFile内容基础知识

1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交

总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。
    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

3 Docker容器,容器是直接提供服务的。

DockerFile保留字指令

指令 说明
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录
ENV 用来在构建镜像过程中设置环境变量,例如ENV MY_PATH /usr/mytest,后续其他指令可以通过$MY_PATH使用
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件或目录复制到新的一层的镜像内的 <目标路径> 位置。
例如:
COPY src dest或COPY [“src”, “dest”]
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令。
格式:
CMD <shell 命令>
CMD [“<可执行文件或命令>”,”“,”“,…]
CMD [““,”“,…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

本地镜像发布到阿里云

登录阿里云开发者平台https://dev.aliyun.com/search.html,创建镜像仓库

控制台->搜索容器镜像服务

创建镜像仓库

选择本地仓库创建镜像

镜像创建完毕

将镜像推送到Registry(此处点开仓库列表的管理,可以看到详细步骤)

1
2
3
$ sudo docker login --username=relive27 registry.cn-beijing.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/relive/mycentos:[镜像版本号]
$ sudo docker push registry.cn-beijing.aliyuncs.com/relive/mycentos:[镜像版本号]


此时镜像就推送到阿里云

评论