Docker笔记

Docker是基于Go语言开发

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

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

安装Docker

环境准备

  • Linux服务器
  • Xshell

安装

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
  • 了解:卸载Docker
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默认工作路径!

阿里云镜像加速

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

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

  1. 找到镜像加速地址

img

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

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的基本命令

帮助命令

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

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

img

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

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

img

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

连接测试

img

具名挂载和匿名挂载

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

image-20200606053701490

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

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


Docker笔记
https://code666.top/articles/2020/08/12/1597246319430.html
作者
Sean
发布于
2020年8月12日
许可协议