Docker笔记

2020-08-12

Docker是基于Go语言开发

文档地址:https://docs.docker.com/

仓库地址:https://hub.docker.com/

安装Docker

环境准备

  • Linux服务器
  • Xshell

安装

# 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
  • 了解:卸载Docker
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

# 2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker默认工作路径!

阿里云镜像加速

  1. 登录阿里云找到容器服务

https://cr.console.aliyun.com/cn-shanghai/instances/repositories

  1. 找到镜像加速地址

img

  1. 配置使用(内网)
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的流程

img

Docker原理

Docker是怎么工作的?

Docker是一个CS结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个进程。

img

Docker为什么比VM快?

  1. Docker有比虚拟机更少的抽象层。由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。

  2. Docker利用的是宿主机的内核,VM需要是Guest OS。

在这里插入图片描述

Docker的基本命令

帮助命令

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/

[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/

[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/

# 下载镜像 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/

[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)

容器命令

说明:有了镜像才能创建容器

[root@VM_44_45_centos ~]# docker pull centos

新建容器并启动

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 ~]# 

列出所有运行中的容器

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

退出容器

exit	# 直接容器停止并退出
ctrl + P + Q	# 容器不停止退出

删除容器

docker rm 容器id	# 删除指定的容器,不能删除正在运行的容器,如果要强制删除用	rm -rf
docker rm -f $(docker ps -aq)	# 删除所有的容器
docker ps -a -q|xargs docker rm	# 删除所有的容器

启动和停止容器的操作

docker start 容器id	# 启动容器
docker restart 容器id	# 重启容器
docker stop 容器id	# 停止当前正在运行的容器
docker kill 容器id	# 强制停止当前容器

常用的其他命令

后台启动容器

# 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发现没有应用就会自动停止。

查看日志

# docker logs -f -t --tail 容器

# 显示日志
 -tf			# 显示日志
 --tail number	# 要显示的指定行数
[root@VM_44_45_centos ~]# docker logs -f -t --tail 10 eb787f727ad3

查看容器中的进程信息

# 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

查看镜像元数据

# docker inspect 容器id
[root@VM_44_45_centos ~]# docker inspect 8708f175564e
[
    {
        "Id": "8708f175564e36130b51c4bbb6e76b95d55d3eefacd9673cfeaaff67d3727660",
        "Created": "2020-06-02T18:08:35.722966388Z",
        "Path": "/bin/bash",
        "Args": [],
        .............

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行,需要进入容器,修改一些配置

# 方式一
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		# 进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

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、搜索镜像
[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安装

# 下载
[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一个镜像,观察下载的日志输出,可以看到是一层一层的下载

img

Q:为什么Docker镜像要采用这种分层的结构呢?

A:最大的好处是可以资源共享!比如有多个镜像都是从相同的base镜像构建而来,那么宿主机只需要在磁盘保留一份base镜像,同时内存中也只需要加载一份base镜像。

查看镜像分层的方式可以通过docker image inspect命令

[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镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部

这一层就是容器层,容器层之下都叫镜像层

img

commit镜像

docker commit 提交容器成为一个新的副本

# 命令与git类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

commit tomcat

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

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

# 获取镜像
[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

连接测试

img

具名挂载和匿名挂载

# 匿名挂载
-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*目录

我们可以使用具名挂载来方便的找到我们的一个卷,大多数情况是使用具名挂载

-v 容器内路径			# 匿名挂载
-v 卷名:容器内路径		   # 具名挂载
-v 宿主机路径:容器内路径	 # 指定路径挂载

拓展

# 通过 -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文件

# 文件中的内容	 指令(大写) 	参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "------end------"
CMD /bin/bash
[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

image-20200606053701490

这个卷和外部一定有同步的目录,上面采用的是匿名挂载。

# 查看卷挂载的目录
[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、在容器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

评论
发表评论