- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像id/镜像名
容器里有了这个文件夹
宿主机也有了这个文件夹
这时候你给宿主机或者容器添加文件修改文件,二者都会同步更新。
就算容器关闭之后,重启,容器内的容器卷也会同步宿主机的内容。 - docker inspect 容器id/容器名
会发现宿主机的卷文件夹和容器的卷文件夹绑定了
这里的Mode没有值,默认是可读可写
3. 我们用第一个命令创建容器卷双方都具有读写权限,可是如何设置容器只有读的权限呢 只要在容器卷路径上加上:ro 意思是readonly
4. docker run -it -v 宿主机路径:容器路径:ro 镜像id/镜像名
运行这条命令之后 我们再docker inspect 容器id
发现Mode 的值 为ro 只读
大家可以在容器里面创建一个文件,或者修改一个文件,会发现失败。
5. 编写Dockefile
其中VOLUMES [] 表明容器有多个卷对应主机的卷文件夹,默认会给主机创建两个卷文件夹与你Dockerfile写的对应
6. 使用DockerFile构建镜像并运行
docker build -f 文件路径 -t 镜像名 .
7. 我们docker inspect 容器id
会发现每个容器卷文件夹有一个与之对应的主机文件夹
8. 容器数据卷 让一个容器继承另一个容器的数据卷,实现数据的共享与传递。
- 首先运行一个容器 命名dc01
- 然后再运行一个容器 让他容器卷继承于dc01
docker run -it --name dc02 --volumes-from dc01 yzf/centos
- 我们继续创建dc3容器继承dc1
docker run -it --name dc03 --volumes-from dc01 yzf/centos
- 这时候我们删除父容器dc01
- docker rm -f dc01
- 再进入其他两个容器dc01 dc02 会发现父容器的文件依旧在数据卷中,这时候即使你删除dc02,dc03数据卷依旧存在,不会受到影响,即使你再创建一个dc04继承dc03的容器卷,然后删除dc03,dc04的数据卷依旧是完整的,只要容器数据卷的数据在使用,那么数据还是存在的。
- 接下来介绍一下Dockefile
- dockerfile 就是用来构建镜像的文件,其中包含一系列的命令即脚本。
- 我们看下centos的管饭dockerfile
- FROM 相当于此镜像的依赖,比如tomcat的dcokerfile from jdk,这里scratch是基础镜像,LABEL 相当于说明,CMD 是命令,还有个MAINTAINER 是一些作者和邮箱信息。
- DockerFile保留字指令
- RUN 容器构建时需要运行的命令
- EXPOSE 容器对外暴露的端口号
- WORKDIR 容器创建之后,终端进去的目录,一个落脚点,默认/根目录
- ENV 设置环境变量 可以用$变量名 引用环境变量值
- ADD 将宿主机文件拷贝到镜像,并且可以自动处理url和解压缩tar包
- COPY 拷贝src目录下的文件/目录到镜像内的目录
- 语法
COPY src dest
或者COPY ["src","dest"]
- CMD 指定容器启动时要运行的命令 dockerfile中可以有多个cmd命令,但是只有最后一个生效,cmd会被docker run之后的参数替换
- 例如 docker run -d -p:8888:8080 tomcat ls -l 并不会启动tomcat 原因是tomcat默认dockerfile有一个 cmd 执行catalina.sh 但是 被ls -l覆盖所有不会启动了
- ENTRYPOINT 与cmd作用一致,但是不会被替换,会追加。
- ONBUILD 类似于触发器,父镜像在被其他镜像继承时,父镜像的onbuild会触发。
- VOLUME 容器数据卷,用于保存持久化容器产生的数据。
- DockerFile指令练习
- 编写文件
FROM centos
MAINTAINER yzf<99678@sohu.com>
ENV mypath /usr/local
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
- 构建
docker build -f /mydocker/DockerFile01 -t mycentos:1.3 .
显示如下 构建完成
- 查看镜像
docker images mycentos
- 运行
ifconfig 和 vim 都可以使用,并且 workdir也生效 容器启动后,进入了/usr/local
docker history 镜像id/镜像名
列出镜像的变更历史
因为我们的mycentos是从centos基础镜像构建而来,所以每一行指令都会生成一个镜像并且提交,然后后面的指令执行后又会包含之前的镜像生成新的镜像,所以说镜像是一层一层的。- 接下来说明一下CMD和ENTRYPOINT的区别
- 编写dockerfile(CMD)
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
- build
docker build -f /mydocker/DockerFile02 -t myip .
- 运行
docker run myip
- 编写dockerfile(ENTRYPOINT)
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
- build
docker build -f /mydocker/DockerFile03 -t myip2 .
- 运行
docker run myip2
结果 使用了ENTRYPOINT 追加参数运行之后并不会覆盖命令 而是追加,CMD会直接覆盖。
13. ONBUILD的使用
- 首先我们创建一个Dockerfile
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father onbuild..."
- 然后构建
docker build -f /mydocker/DockerFile04 -t myip_father .
- 再创建一个Dockerfile 让它继承自我们创建的镜像名
FROM myip_father
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
- 构建的时候会发现 触发了父镜像 然后打印那句话
docker build -f /mydocker/DockerFile05 -t myip_son .