数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录,这里感觉很难解释,直接引用黑马教程的视频截图,感觉很详细
如上图所示,通过创建数据卷,作为一个中间人,来分别对应容器和系统文件里的配置文件,当修改文件系统里的文件被修改时,容器里对应的文件也会被修改,同理修改容器文件时,系统文件里的内容也会被修改,所有的操作都是通过连接数据卷来实现的
每创建一个数据卷,都会在系统文件/var/lib/docker/volumes目录下创建对应的数据卷目录,比如上图创建了一个html数据卷,就在/var/lib/docker/volumes目录下创建了一个/html目录
数据卷作用- 将容器与数据分离,实现解耦和
- 通过数据卷可以在多个容器间实现共用和共享
- 数据卷会一直存在,直到没有容器使用
- 对数据卷的修改不会影响镜像
docker volume[command]
数据卷命令都是以docker volume 开头,后面接具体的命令操作
docker volume create html #创建一个名叫html的数据卷 docker volume inspect #显示一个或多个volume信息 docker volume ls #列出所有数据卷 docker volume prune #删除未使用的volume docker volume rm #删除一个或多个指定的volume挂载数据卷
挂载数据卷就是在创建容器时将容器里的某个文件和数据卷对应起来,完成数据卷的挂载,举例如下:
创建一个nginx容器,镜像可以去官网下载,然后我们通过挂在数据卷,修改index.html文件
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx # -v是新知识,意思是挂载一个数据卷,命名为html,关联的文件位置是/usr/share/nginx/html #因为镜像是dockerHub官网下载的,所以这个目录位置可以去官网看 #如果事先没有通过docker volume create html创建数据卷,系统也会智能的根据-v条件创建一个对应的数据卷 # mn指的是自定义的容器名称 # -p后面将主机端口和容器端口映射,左面是主机端口,右面是容器端口 # -d后台运行容器 # nginx 镜像名字
这时候我们就不需要像以前那样去容器内部修改文件了,直接在外部使用vi index.html 命令修改文件
修改后保存退出,然后访问ip自己设置的ip,效果如下
目录挂载还有一种方式是直接自定义目录或者文件与容器内的指定目录或文件相对应,我们称之为目录挂载
docker run --name mn -p 80:80 -v tmp/test:/usr/share/nginx/html -d nginx # -v tmp/test:/usr/share/nginx/html 冒号左边是自定义的宿主机目录,冒号右面的是容器内的目录 # 同理 -v tmp/test2/index.html:/usr/share/nginx/html/index.html 冒号左边是自定义的宿主机文件,冒号右面的是容器内的文件 #理论上是这样的,但我还没试过!!!
总的来说数据挂载耦合度低,并且直接交给docker管理,缺点是docker管理目录,目录较深不好找
目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
镜像结构,镜像是分层结构,每一层成为一个Layer- baseImage层:包含基本的系统函数库、环境变量、文件系统,是最底层结构
- Entrypoint:入口,是镜像中应用启动的命令
- 其他:在baseImage基础上添加依赖、安装程序、完成整个安装和配置
在创建镜像之前,首先对Dockerfile进行介绍,dockerfile就是一个文本文件,其中包含一个个的指令,阿斯顿用指令来说明要执行什么操作来构建镜像,每一个指令都会形成一层Layer,文件内容如下:
FROM ubuntu:16.04 #指定基础镜像 ENV JAVA_DIR=/usr/local #配置环境变量 配置jdk的安装目录 #复制jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar #安装jdk 解压后重命名 RUN cd $JAVA_DIR && tar -xf ./jdk.tar.gz && mv ./jdk1.8.0_144 ./java8 #配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin #暴露端口 EXPOSE 8090 #入口 java项目启动命令 ENTRYPOINT java -jar /tmp/app.jar
- 创建镜像步骤如下:
- 创建一个空文件夹,这里取名叫做docker-demo
- 将自己准备好的java项目打包成架包,上传到该文件夹中
- 准备好jdk文件,可以去网上找一个jdk1.8.tar.gz,上传到docker-demo中
- 编写一个该文件夹编写一个DockerFile文件
- 在docker-demo文件夹中运行如下命令
docker build -t javaweb:1.0 . #这里是创建一个名为javaweb的镜像,版本取名1.0,后面有一个空格后的'.',这个点表示的是dockerfile所在的目录
该镜像把dockerfile文件里的配置变量以及安装jdk等步骤都已经完成了,所以我们可以直接使用该镜像来简化步骤,编辑dockerfile如下
FROM java:8-alpine #指定基础镜像,基于java8-alpine镜像 #复制java项目的包 COPY ./docker-demo.jar /tmp/app.jar #暴露端口 EXPOSE 8090 #入口 java项目启动命令 ENTRYPOINT java -jar /tmp/app.jar
这样做可以简化一些构建镜像时的重复步骤
DockerComposeDocker Compose可以基于Compose文件帮我们快速的部署分布式应用,无需手动一个个的创建和运行容器。 Compose是一个文本文件,通过指令定义集群中的每个容器如何运行
具体网上查询,挺复杂的,先有个概念,用到的时候再去看
Docker镜像仓库镜像仓库分为公有和私有两种:
公共仓库:比如DockerHub、阿里云镜像服务等
私有仓库:用户本地自己搭建的镜像仓库
搭建本地仓库方式有两种:
- 简化版镜像仓库 Docker Registry是一个基础版的Docker镜像仓库,具备仓库管理的完整功能,但没有图形化界面 。搭建命令如下
docker run -d --restart=always --name registry #自定义容器名字 -p 5000:5000 #端口号 -v registry-data:/var/lib/registry #数据卷挂载 registry #镜像名称,如果没有该镜像会自动下载 #本质上就是根据registry镜像创建了一个容器然后通过 vi /etc/docker/daemon.json 命令修改,配置Docker信任地址
然后保存退出,重新加载刚才的文件并重启docker,命令如下
systemctl daemon-reload #重新加载文件 systemctl restart docker #重启docker
-
第二种方法需要通过DockerCompose来部署带有图形化界面的仓库,感觉好麻烦就没去弄,需要的时候网上去找 要创建一个docker-compose.yml文件并做如下配置
version: '3.0' services: registry: image: registry volumes: - ./registry-data:/var/lib/registry ui: image: joxit/docker-registry-ui:static ports: - 8080:80 environment: - REGISTRY_TITLE=小鱼 #这里是仓库名字 - REGISTRY_URL=http://registry:5000 depends_on: - registry #表示依赖于上面那个registry镜像
上传:
#先重命名要推送的镜像 docker tag nginx:latest 192.168.65.129:5000/nginx:1.0 #这个命令是把nginx:latest镜像重命名为192.168.65.129:5000/nginx:1.0 ,其中这个ip是主机ip,端口是创建私有仓库设置的端口,后面是名字和版本,可以随便取 docker push 192.168.65.129:5000/nginx:1.0 #开始推送到私有仓库
因为我创建的是非图形化界面,所以即使访问私有仓库后也不可见,效果如下
但实际上我可以把刚才的镜像给拉取下来,证明了我是上传成功了的
拉取命令
docker pull 192.168.65.129:5000/nginx.1.0



