1、docker容器数据卷
- 数据共享
- 数据持久化
数据卷
-
命令添加
docker run -it -v 宿主机绝对路径目录:容器内目录 [镜像名]:[标签] # 查看是否挂载成功 docker inspect [镜像名] # 上诉命令是将宿主机目录和容器内目录建立链接,两目录内数据同步 # 当容器关闭时,改变宿主机目录内数据;容器再次启动,数据会同时同步
docker run -it -v 宿主机绝对路径目录:容器内目录:ro [镜像名]:[标签] # 该命令同上命令功能相同 # 不同的是执行该命令,容器内目录只有读权限没有写权限和执行权限
-
dockerfile添加
1、编写dockerfile文件FROM centos VOLUME ['/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished" CMD /bin/bash
2、
docker build -f [dockerfile文件路径] -t="[镜像名]:[标签] ."
[注]:docker build命令后的 . 的意义
Docker 在运行时分为 Docker引擎(服务端守护进程) 以及 客户端工具,我们日常使用各种 docker 命令,其实就是在使用客户端工具与 Docker 引擎 进行交互。
那么当我们使用 docker build 命令来构建镜像时,这个构建过程其实是在 Docker引擎 中完成的,而不是在本机环境。
所以 docker build 最后的 . 号,其实是在指定镜像构建过程中的上下文环境的目录。3、
docker run -it [镜像名]:[标签]
4、用dockerfile形式构建镜像,并建立新的容器;该容器拥有两个新的文件目录
数据卷容器
当前一个命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享
这个容器叫做数据卷容器
-
创建一个数据卷容器
docker run -it --name wang0 wang/centos
-
创建其他容器挂载这个数据卷容器
docker run -it --name wang1 --volumes-from wang0 wang/centos docker run -it --name wang2 --volumes-from wang0 wang/centos
-
容器wang0、wang1、wang2数据之间共享;无论哪一方被删除,其他两方数据继续共享
利用数据卷容器备份和还原数据
- 备份
docker run --volumes-from [需要备份的容器名] -v [本地要备份到的路径] --name [备份中操作的容器名] [镜像名]:[标签] tar cvf /backup/backup.tar(备份命令)(备份到容器内的文件) [需要备份的数据卷]
eg:
docker run --volumes-from wang1 -v /wang --name wang10 centos tar cvf /wang/wang.tar mydatacontainer
- 还原
docker run --volumes-from [需要备份的容器名] -v [本地要备份到的路径] --name [备份中操作的容器名] [镜像名]:[标签] tar xvf /backup/backup.tar(备份命令)(备份到容器内的文件) [需要备份的数据卷]
2、dockerFile解析
- 1、编写dockerfile文件
- 2、docker build 构建自定义镜像
- 3、docker run 根据生成的自定义镜像构建容器
docker保留字指令
-
FROM:基础镜像,当前新镜像是基于哪个镜像的
-
MAINTAINER:镜像维护者的姓名和邮箱地址
-
RUN:容器构建时需要运行的命令
-
EXPOSE:当前容器对外暴露的端口号
-
WORKDIR:指定在容器创建后,终端默认登录进来工作目录,一个落脚点
-
ENV:用来在构建镜像过程中设置环境变量
-
COPY:拷贝宿主机内文件到镜像中。COPY将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
-
ADD:将宿主机目录下的文件拷贝到镜像里面并且ADD命令会自动处理URL和解压tar压缩包
-
VOLUME:容器数据卷,用于数据保存和持久化工作
-
CMD:指定一个容器启动时要运行的命令
dockerfile中规定只能有一条CMD命令,当有多条CMD指令时,只有最后一条指令生效;
CMD指令会被docker run之后的参数替换。 -
ENTRYPOINT:指定一个容器启动时要运行的命令
dockerfile中规定只能有一条ENTRYPOINT命令,当有多条ENTRYPOINT指令时,只有最后一条指令生效;
ENTRYPOINT指令不会被docker run之后的参数替换,但会被当做参数传给ENTRYPOINT,之后形成新的命令组合。 -
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发
案例1
FROM centos
ENV MYPATH /usr/local
# 切换登录默认目录
WORKDIR $MYPATH
# 安装vim、net-tools
RUN yum install -y vim
RUN yum install -y net-tools
EXPOSE 80
CMD /bin/bash
案例2(CMD和ENTRYPOINT的区别)
FROM centos
RUN yum install -y curl
CMD ["curl", "-s", "http://ip.cn"]
执行 docker run -it [镜像名]:[标签] /bin/bash
/bin/bash 命令会替换掉 curl -s http://ip.cn
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
执行 docker run -it [镜像名]:[标签] -i
相当于执行curl -s -i http://ip.cn
案例3(自定义tomcat)
FROM centos
COPY C.txt /usr/local/container.txt
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apach-tomcat-9.0.8.tar.gz /usr/local/
RUN yun install -y vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置tomcat和Java的环境
xxxxxxxxx
xxxxxxxxx
EXPOSE 8080
# 启动tomcat
# ENTRYPOINT ["/usr/local/apach-tomcat-9.0.8/bin/startup.sh"]
# CMD ["/usr/local/apach-tomcat-9.0.8/bin/catalina.sh", "run"]
CMD /usr/local/apach-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apach-tomcat-9.0.8/bin/logs/catalina.out
3、docker配置文件
ubuntu下docker配置文件
/etc/default/docker
centos7 如果没有/etc/sysconfig/docker这个配置文件
-
1.
vim /lib/systemd/system/docker.service
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network.target docker.socket Requires=docker.socket [Service] Type=notify EnvironmentFile=/etc/sysconfig/docker ExecStart=/usr/bin/docker -d $OPTIONS -H fd:// LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity MountFlags=slave [Install] WantedBy=multi-user.target
-
2.
vim /etc/sysconfig/docker
# /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs OPTIONS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock' DOCKER_CERT_PATH=/etc/docker # If you want to add your own registry to be used for docker search and docker # pull use the ADD_REGISTRY option to list a set of registries, each prepended # with --add-registry flag. The first registry added will be the first registry # searched. # ADD_REGISTRY='--add-registry registry.access.redhat.com' # If you want to block registries from being used, uncomment the BLOCK_REGISTRY # option and give it a set of registries, each prepended with --block-registry # flag. For example adding docker.io will stop users from downloading images # from docker.io # BLOCK_REGISTRY='--block-registry' # If you have a registry secured with https but do not have proper certs # distributed, you can tell docker to not look for full authorization by # adding the registry to the INSECURE_REGISTRY line and uncommenting it. INSECURE_REGISTRY='--insecure-registry dl.dockerpool.com:5000' # On an SELinux system, if you remove the --selinux-enabled option, you # also need to turn on the docker_transition_unconfined boolean. # setsebool -P docker_transition_unconfined 1 # Location used for temporary files, such as those created by # docker load and build operations. Default is /var/lib/docker/tmp # Can be overriden by setting the following environment variable. # DOCKER_TMPDIR=/var/tmp # Controls the /etc/cron.daily/docker-logrotate cron job status. # To disable, uncomment the line below. # LOGROTATE=false
-
3.重启docker
systemctl daemon-reload systemctl restart docker