Docker是基于Go语言开发
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
安装Docker 环境准备
安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # 1. 卸载旧版本 $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 2. 需要的安装包 $ sudo yum install -y yum-utils # 3. 设置镜像的仓库 $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # aliyun镜像:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 4. 安装Docker引擎 docker-ce社区版 ee企业版 $ sudo yum install docker-ce docker-ce-cli containerd.io # 5. 启动Docker $ sudo systemctl start docker # 6. 测试 $ sudo docker run hello-world # 或者 $ docker version
1 2 3 4 5 6 # 1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io# 2. 删除资源 rm -rf /var/lib/docker# /var/lib/docker docker默认工作路径!
阿里云镜像加速
登录阿里云找到容器服务
https://cr.console.aliyun.com/cn-shanghai/instances/repositories
找到镜像加速地址
配置使用(内网)
1 2 3 4 5 6 7 8 sudo mkdir -p /etc/ docker sudo tee /etc/ docker/daemon.json <<-'EOF' { "registry-mirrors" : ["https://feg2odup.mirror.aliyuncs.com" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
docker run的流程和Docker原理 run的流程
Docker原理
Docker是怎么工作的?
Docker是一个CS结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个进程。
Docker为什么比VM快?
Docker有比虚拟机更少的抽象层。由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
Docker利用的是宿主机的内核,VM需要是Guest OS。
Docker的基本命令 帮助命令 1 2 3 docker version # 显示docker的版本信息 docker info # 显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help # 命令的帮助命令
帮助文档的地址: https://docs.docker.com/engine/reference/commandline
镜像命令 docker images 查看所有本地主机上的镜像 https://docs.docker.com/engine/reference/commandline/images/
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@VM_44_45_centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE# 解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的大小# 可选项 -a, --all 列出所有镜像 -q, --quiet 只显示镜像ID
docker search 从镜像仓库搜索镜像 https://docs.docker.com/engine/reference/commandline/search/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@VM_44_45_centos ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9574 [OK] mariadb MariaDB is a community-developed fork of MyS… 3478 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 702 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 76 # 可选项 -f, --filter filter 根据提供的条件过滤输出 --format string 使用Go模板进行漂亮的打印搜索 --limit int 最大搜索结果数(默认为25) --no-trunc 不截断输出 [root@VM_44_45_centos ~]# docker search mysql --filter=STARS=3000 # 搜索出来的镜像的STARS大于3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9574 [OK] mariadb MariaDB is a community-developed fork of MyS… 3478 [OK]
docker pull 下载镜像 https://docs.docker.com/engine/reference/commandline/pull/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # 下载镜像 docker pull 镜像名[:tag] [root@VM_44_45_centos ~]# docker pull mysql Using default tag: latest # 如果不写tag,默认就是最新版 latest: Pulling from library/mysql afb6ec6fdc1c: Pull complete # 分层下载,docker image的核心 联合文件系统 0bdc5971ba40: Pull complete 97ae94a2c729: Pull complete f777521d340e: Pull complete 1393ff7fc871: Pull complete a499b89994d9: Pull complete 7ebe8eefbafe: Pull complete 597069368ef1: Pull complete ce39a5501878: Pull complete 7d545bca14bf: Pull complete 211e5bb2ae7b: Pull complete 5914e537c077: Pull complete Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d # 签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址# docker pull mysql 等价于 docker pull docker.io/library/mysql:latest # 指定版本下载 [root@VM_44_45_centos ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql afb6ec6fdc1c: Already exists 0bdc5971ba40: Already exists 1393ff7fc871: Already exists a499b89994d9: Already exists 7ebe8eefbafe: Already exists 4eec965ae405: Pull complete .....# 指定版本下载,只下载不存在的区
docker rmi 删除镜像 https://docs.docker.com/engine/reference/commandline/rmi/
1 2 3 4 5 6 7 [root@VM_44_45_centos ~]# docker rmi -f 镜像id # 删除指定的镜像 [root@VM_44_45_centos ~]# docker rmi -f 镜像id 镜像id 镜像id # 删除多个指定的镜像 [root@VM_44_45_centos ~]# docker rmi -f $(docker images -aq) # 删除全部的镜像# 可选项 -f, --force 强制删除镜像 --no-prune 不要删除未标记的父级(Do not delete untagged parents)
容器命令
说明:有了镜像才能创建容器
1 [root@VM_44_45_centos ~]# docker pull centos
新建容器并启动 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 docker run [可选参数] image# 参数说明 --name="Name" 容器名字 tomcat01 tomcat02,用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 -p 容器端口 容器端口 -P 随机指定端口 -v 绑定挂载目录: -v<host>:<container>:[rw|ro],如-v /data/:/usr/share 将本机的/data/,挂载到镜像中的/usr/share目录 --rm 用完后删除# 测试,启动并进入容器 [root@VM_44_45_centos ~]# docker run -it centos /bin/bash [root@05f838079470 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var# 从容器中退回主机 [root@05f838079470 /]# exit exit [root@VM_44_45_centos ~]#
列出所有运行中的容器 1 2 3 4 5 6 7 8 9 docker ps [可选参数] # 列出当前正在运行中的容器 -a # 列出当前正在运行的容器+带出历史运行过的容器 -n=? # 显示最近创建的容器 -q # 只显示容器的编号 [root@VM_44_45_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@VM_44_45_centos ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05f838079470 centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago compassionate_elbakyan
退出容器 1 2 exit # 直接容器停止并退出 ctrl + P + Q # 容器不停止退出
删除容器 1 2 3 docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除用 rm -rf docker rm -f $(docker ps -aq) # 删除所有的容器 docker ps -a -q|xargs docker rm # 删除所有的容器
启动和停止容器的操作 1 2 3 4 docker start 容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前容器
常用的其他命令 后台启动容器 1 2 3 4 5 6 7 8 # docker run -d 镜像名 [root@VM_44_45_centos ~]# docker run -d centos 2bf37ed894d5a0f8d0da6b58b1a654aeba4f3704355d120333973c74f5edc565 [root@VM_44_45_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# 问题 docker ps 发现centos停止了 # 常见的坑,docker容器使用后台运行必须要有一个前台进程,docker发现没有应用就会自动停止。
查看日志 1 2 3 4 5 6 7 # docker logs -f -t --tail 容器 # 显示日志 -tf # 显示日志 --tail number # 要显示的指定行数 [root@VM_44_45_centos ~]# docker logs -f -t --tail 10 eb787f727ad3
查看容器中的进程信息 1 2 3 4 5 # docker top 容器id [root@VM_44_45_centos ~]# docker top 8708f175564e UID PID PPID C STIME TTY TIME CMD root 23596 23579 0 02:08 pts/0 00:00:00 /bin/bash
查看镜像元数据 1 2 3 4 5 6 7 8 9 # docker inspect 容器id [root@VM_44_45_centos ~]# docker inspect 8708f175564e [ { "Id": "8708f175564e36130b51c4bbb6e76b95d55d3eefacd9673cfeaaff67d3727660", "Created": "2020-06-02T18:08:35.722966388Z", "Path": "/bin/bash", "Args": [], .............
进入当前正在运行的容器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # 我们通常容器都是使用后台方式运行,需要进入容器,修改一些配置 # 方式一 docker exec -it 容器id bashShell # -it以交互的方式执行# 测试 [root@VM_44_45_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8708f175564e centos "/bin/bash" 20 hours ago Up 20 hours boring_morse [root@VM_44_45_centos ~]# docker exec -it 8708f175564e /bin/bash [root@8708f175564e /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@8708f175564e /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun02 pts/0 00:00:00 /bin/bash root 14 0 0 14:21 pts/1 00:00:00 /bin/bash root 28 14 0 14:22 pts/1 00:00:00 ps -ef# 方式二 docker attach 容器id# 测试 [root@VM_44_45_centos ~]# docker attach 8708f175564e 正在执行当前的代码...# docker exec # docker attach
从容器内拷贝文件到主机上 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 docker cp 容器id:容器内路径 主机的路径# 查看当前主机目录 [root@VM_44_45_centos data]# ls docker-demo docker_study# 进入docker容器 [root@VM_44_45_centos data]# docker attach 4315a469cbba [root@4315a469cbba /]# cd /home [root@4315a469cbba home]# ls# 在容器内新建一个文件 [root@4315a469cbba home]# touch test.java [root@4315a469cbba home]# ls test.java [root@4315a469cbba home]# exit exit [root@VM_44_45_centos data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@VM_44_45_centos data]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4315a469cbba centos "/bin/bash" 2 minutes ago Exited (0) 20 seconds ago serene_zhukovsky# 将文件拷贝到主机上 [root@VM_44_45_centos data]# docker cp 4315a469cbba:/home/test.java /data [root@VM_44_45_centos data]# ls docker-demo docker_study test.java
案例(部署nginx)
Docker 安装nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # 1、搜索镜像 [root@VM_44_45_centos data]# docker search nginx --filter=STARS=1000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 13276 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1815 [OK]# 2、下载镜像 [root@VM_44_45_centos data]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx afb6ec6fdc1c: Already exists dd3ac8106a0b: Pull complete 8de28bdda69b: Pull complete a2c431ac2669: Pull complete e070d03fd1b5: Pull complete Digest: sha256:883874c218a6c71640579ae54e6952398757ec65702f4c8ba7675655156fcca6 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest# 3、运行测试 [root@VM_44_45_centos data]# docker run -d --name nginx01 -p 80:80 nginx 7b380f17820e71700955bd14102665cc95bcb2c521a3c347685ac6765209378f [root@VM_44_45_centos data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b380f17820e nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:3344->80/tcp nginx01 [root@VM_44_45_centos data]# curl localhost:3344 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ......# 4、先把下面将要挂载的目录复制(省略) ...# 5、将Nginx的配置文件、静态目录、日志目录挂载到宿主机上(方便于管理) [root@VM_44_45_centos data]# docker run -d -p 3344:80 -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/conf.d:/etc/nginx/conf.d --name nginx01 nginx# 检查是否挂载成功 [root@VM_44_45_centos data]# docker ps -a | grep nginx01
案例(部署tomcat)
Tomcat安装
1 2 3 4 5 6 7 8 9 10 11 12 13 # 下载 [root@VM_44_45_centos /]# docker pull tomcat:9.0# 启动运行 [root@VM_44_45_centos /]# docker run -d -p 3355:8080 --name tomcat01 tomcat# 测试 # 进入容器 [root@VM_44_45_centos /]# docker exec -it tomcat01 /bin/bash# 挂载 ...
Docker镜像 镜像是什么 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
Docker镜像加载原理
UnionFS(联合文件系统)
Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统你那个,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。
Docker镜像加速原理
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system) 主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roorfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etx 等标准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
分层理解
分层的镜像
pull一个镜像,观察下载的日志输出,可以看到是一层一层的下载
Q:为什么Docker镜像要采用这种分层的结构呢?
A:最大的好处是可以资源共享!比如有多个镜像都是从相同的base镜像构建而来,那么宿主机只需要在磁盘保留一份base镜像,同时内存中也只需要加载一份base镜像。
查看镜像分层的方式可以通过docker image inspect命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@VM_44_45_centos ~]# docker image inspect tomcat:9.0 [ ...... "Layers": [ "sha256:8c02234b86056c009036ff0c31efb9a726412392d9872dacf95103767ac3b101", "sha256:7cc1c2d7e744369899e8affd52f9be62076b1ef0205f02ed11547bb5327e5a43", "sha256:760e8d95cf58e8696de9ba210ef58522750aee7a1f24c15695f493582002c08e", "sha256:88cfc2fcd059f99b165d045b00500d40892c5afaa7181a95d9936350320c8f9c", "sha256:155d997ed77ca415391df55e0b61fd4552031f1a1e9615c8bcf9531192ba755c", "sha256:d39111fb260233cfbf79a3799d5e8a7a8577d4e1d0100cb8af3c35a414588b2f", "sha256:bfbfe00b44fcc8ab8627a89f71f210884e024faa0954f3883892d85881d2d419", "sha256:eb4497d7dab71be45526bf784a292e7f0b2ad841140db842969dca223f7f1bed", "sha256:5e71d8e4cd3d7b1737233c9ce89c9f2e99c98aec281ac161e46889abce774ce9", "sha256:b0ac242ce8d37f08b3dd161909980663f26bc00cef82681ddd9a7634ed1bc53b" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } } ]
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
这一层就是容器层,容器层之下都叫镜像层
commit镜像 1 2 3 4 docker commit 提交容器成为一个新的副本# 命令与git类似 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
commit tomcat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1、启动一个默认的tomcat [root@VM_44_45_centos webapps]# docker exec -it 90f4809e06b3 /bin/bash 2、拷贝一个文件到webapps root@90f4809e06b3:/usr/local/tomcat# cp -r webapps.dist/ webapps root@90f4809e06b3:/usr/local/tomcat# ls webapps webapps webapps.dist 3、提交自己的一个镜像 [root@VM_44_45_centos webapps]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90f4809e06b3 tomcat:9.0 "catalina.sh run" 21 hours ago Up 21 hours 8080/tcp friendly_archimedes [root@VM_44_45_centos webapps]# docker commit -a="sean" -m="move webapps dir" 90f4809e06b3 tomcat02:1.0 sha256:2a59671c27969358c320dbfc8186004741068f0f9a9302e74d76a498eea74507 [root@VM_44_45_centos webapps]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02 1.0 2a59671c2796 5 seconds ago 652MB tomcat 9.0 1b6b1fe7261e 2 weeks ago 647MB
容器数据卷 什么是容器数据卷
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
比如:启动一个容器mysql,如果我们把容器给删除了,那么就相当于删库跑路了。这时我们可以在docker中挂载mysql数据存储目录到宿主机。这就叫容器数据卷
使用数据卷(指定路径挂载)
方式一:直接使用命令来挂载 -v
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 docker run -it -v 主机目录:容器目录# 测试 # 1、查看到宿主机没有目录 [root@VM_44_45_centos home]# ls# 2、运行容器并挂载目录 [root@VM_44_45_centos home]# docker run -it -v /home/test:/home centos /bin/bash# 3、查看home目录已经生成test 目录 [root@VM_44_45_centos home]# ls test# 4、在容器内的home目录新建test.java文件 [root@1e7e4764e4ce home]# touch test.java# 5、查看宿主机/home/test目录 [root@VM_44_45_centos home]# ls test/ test.java# 可以通过docker inspect 容器id 来查看容器的详细信息 [root@VM_44_45_centos home]# docker inspect 1e7e4764e4ce [ { "Id": "1e7e4764e4ce861ceea7978e10213e0b3b1318d5576021c3403fc7126ef03b35", ..... "Mounts": [ # 挂载 -v 卷 { "Type": "bind", "Source": "/home/test", # 宿主机地址 "Destination": "/home", # docker容器内的地址 "Mode": "", "RW": true, "Propagation": "rprivate" } ], .....
好处:以后可以在宿主机上修改文件,容器内会自动同步
实战:安装MYSQL 1 2 3 4 5 6 7 8 9 10 11 12 13 # 获取镜像 [root@VM_44_45_centos home]# docker pull mysql:5.7# 启动容器并挂载数据卷 -d 后台运行 -p 端口映射 -v 卷挂载 -e 环境配置 [root@VM_44_45_centos home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 2e276b49d823b70dd482ea446e1a325340daeb4379df9821a7e2656d88b2dacd# 查看宿主机映射路径 [root@VM_44_45_centos mysql]# ls conf/ [root@VM_44_45_centos mysql]# ls data/ auto.cnf ca-key.pem ca.pem client-cert.pem client-key.pem ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mysql performance_schema private_key.pem public_key.pem server-cert.pem server-key.pem sys
连接测试
具名挂载和匿名挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 # 匿名挂载 -v 容器内路径 docker run -d -P --name nginx02 -v /etc/nginx nginx# 查看所有的 volume [root@VM_44_45_centos mysql]# docker volume ls DRIVER VOLUME NAME local 7212f13559d93a32e78a86034610fd9ed4f3c2289b9cc3808e065b0c1bf01317# 类似于上面这种,我们在-v的时候只写了容器内路径,没有写容器外路径,VOLUME NAME等于一长串sha256码的就是匿名挂载 # 具名挂载 [root@VM_44_45_centos mysql]# docker run -d -P --name nginx03 -v sean-nginx:/etc/nginx nginx 3db34bfee62c91d09089a23b044c36f904e83e5757e7c0fbeeddd55d5f7e209c [root@VM_44_45_centos mysql]# docker volume ls DRIVER VOLUME NAME local 7212f13559d93a32e78a86034610fd9ed4f3c2289b9cc3808e065b0c1bf01317 local sean-nginx# 具名挂载通过 -v 卷名:容器内路径 # 查看一下卷信息 [root@VM_44_45_centos mysql]# docker volume inspect sean-nginx [ { "CreatedAt": "2020-06-04T23:20:34+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/sean-nginx/_data", "Name": "sean-nginx", "Options": null, "Scope": "local" } ]
所有的docker容器内的卷,没有指定目录的情况下都是在*/var/lib/docker/volumes/sean-nginx/xxxx*目录
我们可以使用具名挂载来方便的找到我们的一个卷,大多数情况是使用具名挂载
1 2 3 -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v 宿主机路径:容器内路径 # 指定路径挂载
拓展
1 2 3 4 5 6 7 8 9 # 通过 -v 容器内路径:ro rw改变读写权限 ro readonly # 只读 rw readwrite # 可读可写# 一旦设置了容器权限,那么容器对我们挂载出来的内容就有限定了 docker run -d -P --name nginx02 -v sean-nginx:etc/nginx:ro nginx docker run -d -P --name nginx02 -v sean-nginx:etc/nginx:rw nginx# ro 说明这个路径只能通过宿主机来操作,容器内部是无法操作的
初识Dockerfile Dockerfile就是用来构建docker镜像的构建文件,命令脚本!通过这个脚本可以生成镜像
方式二:通过编写Dockerfile文件
1 2 3 4 5 6 7 # 文件中的内容 指令(大写) 参数 FROM centos VOLUME ["volume01","volume02"] CMD echo "------end------" CMD /bin/bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@VM_44_45_centos docker-test-volume]# docker build -f dockerfile1 -t sean/centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 470671670cac Step 2/4 : VOLUME ["volume01","volume02"] ---> Running in 667d83504b0a Removing intermediate container 667d83504b0a ---> 88c1a07895bb Step 3/4 : CMD echo "------end------" ---> Running in fdceeadf46e1 Removing intermediate container fdceeadf46e1 ---> 77da9d3f92ba Step 4/4 : CMD /bin/bash ---> Running in 70378c11cb57 Removing intermediate container 70378c11cb57 ---> c31187ff4644 Successfully built c31187ff4644 Successfully tagged sean/centos:1.0
这个卷和外部一定有同步的目录,上面采用的是匿名挂载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # 查看卷挂载的目录 [root@VM_44_45_centos ~]# docker inspect 3bf4fd4d8659 [ { "Id": "3bf4fd4d8659d943ee681a4cbd1a63341357e8169e6823ad5ce49e1033b1f7f2", ...... "Mounts": [ { "Type": "volume", "Name": "452b5c0870eb5b054a60b9dbbf77e3a7d16f38ca1436529d498a0d0d4ddfe98d", "Source": "/var/lib/docker/volumes/452b5c0870eb5b054a60b9dbbf77e3a7d16f38ca1436529d498a0d0d4ddfe98d/_data", "Destination": "volume02", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "95334e48572a748264e5233cd58b18d372dd18963084bb1f00399d1f8f17e116", "Source": "/var/lib/docker/volumes/95334e48572a748264e5233cd58b18d372dd18963084bb1f00399d1f8f17e116/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], ......
容器数据卷共享 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # 1、在容器3bf4fd4d8659挂载目录创建一个文件 [root@3bf4fd4d8659 volume01]# ls /volume02 a.js# 2、新建一个容器并挂载容器3bf4fd4d8659的目录 [root@VM_44_45_centos _data]# docker run -it --name docker02 --volumes-from 3bf4fd4d8659 sean/centos:1.0 [root@a0dbf384c616 /]# ls -l total 56 lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x 5 root root 360 Jun 5 21:58 dev drwxr-xr-x 1 root root 4096 Jun 5 21:58 etc drwxr-xr-x 2 root root 4096 May 11 2019 home lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------ 2 root root 4096 Jan 13 21:48 lost+found drwxr-xr-x 2 root root 4096 May 11 2019 media drwxr-xr-x 2 root root 4096 May 11 2019 mnt drwxr-xr-x 2 root root 4096 May 11 2019 opt dr-xr-xr-x 150 root root 0 Jun 5 21:58 proc dr-xr-x--- 2 root root 4096 Jan 13 21:49 root drwxr-xr-x 11 root root 4096 Jan 13 21:49 run lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 May 11 2019 srv dr-xr-xr-x 13 root root 0 Mar 28 2019 sys drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr drwxr-xr-x 20 root root 4096 Jan 13 21:49 var drwxr-xr-x 2 root root 4096 Jun 5 21:33 volume01 drwxr-xr-x 2 root root 4096 Jun 5 21:42 volume02# 3、容器docker02与容器3bf4fd4d8659会进行文件同步 [root@a0dbf384c616 /]# ls volume02 a.js
–volumes-from:只要通过这个就可以容器间的数据共享了
结论: 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器为止。但是一旦持久化到本地,本地的数据是不会删除的
DockerFile P26
MAINTAINER