先复习一下 docker 的基本操作:
1. 使用镜像启动一个容器,并且容器在后台运行
命令:
docker run -d -P [镜像名]
示例:
docker run -d -P nginx
参数说明:
-d 是让容器在后台运行。
-P 是随机的端口映射。命令的执行结果,会返回启动的容器的完整 ID(64位数字和字母组成)。示例中,会自动将宿主机的一个随机端口映射到生成的容器中的80端口(nginx 的默认端口是 80)。
2. 查看容器日志
命令:
docker logs [容器名或者ID]
3. 启动容器并设置指定的映射端口
命令:
docker run -d -p [宿主机的端口]:[容器的端口] --name [给新容器指定名称] [镜像名或者ID]
示例:
docker run -d -p 3333:80 --name nginx-demo nginx
参数说明:
-p 用来设置指定的映射端口。做了端口映射之后,通过访问宿主机IP+映射到宿主机的端口,就能访问到docker中的服务。
4. 查看容器映射了哪些端口
命令:
docker port nginx-demo
5. 启动容器并设置指定的IP和映射端口
命令:
docker run -d -p [宿主机IP]:[宿主机端口]:[容器端口]
说明:
这个命令适用于宿主机存在多个 IP 地址的情况。
6. 启动容器并指定容器的端口,但不指定宿主机的端口
命令:
docker run -d -p [宿主机IP]::[容器端口]
说明:
这个命令适用于宿主机存在多个 IP 地址的情况。
7. 启动容器并指定容器使用的协议
命令:
docker run -d -p [宿主机端口]:[容器端口]:udp
说明:
-p 默认使用的是 tcp 协议。可以指定使用 udp 协议。
接下来本篇文章要讲的核心内容来了
8. 容器的数据存储
必须知道的常识:
容器的数据默认都存储在容器的卷里面,如果容器删除,数据也就没有了。
容器技术提供了一种方式,可以将宿主机的卷挂载到容器里面,这样就可以将容器的数据保存到宿主机上。
挂载参数是 -v,有两种使用方式:
【方式一】
-v /data
意思是:将宿主机的某目录挂载到容器的 /data 目录下。如果镜像(或者容器)中默认没有 /data 目录,挂载完成后会自动在容器中创建该目录。
登录容器,查看 /data 的磁盘挂载情况:
问题:
宿主机的哪个卷挂载到容器上了呢?
验证:
先在容器的 /data 目录创建一个文件 hehe。回到宿主机,使用 inspect 命令查看容器的详细信息,在 Mount 这段信息中找到 Source 这个部分。
进入 Source 后面的路径,可以查看到刚才创建的文件 hehe 。
进入宿主机的目录 /var/lib/docker/volumes/,通常可以看到该目录下有很多卷。每一个与宿主机进行了卷挂载的容器,它挂载的卷都在这个目录下。即 使用命令 docker inspect [容器名]或[容器ID] | grep Source 查到的路径名称与这里的目录名称是可以匹配上的。如下图所示:
结论:
挂载宿主机的卷到容器但不指定具体是哪个卷,这个时候系统会随机在宿主机的目录 /var/lib/docker/volumes/ 里面找一个卷挂载到容器上。
【方式二】
-v src:dst
意思是:将宿主机的目录 src 挂载到容器的 dst 目录下。这是更好的使用方式。
示例:
-> 在宿主机本地创建一个目录用于挂载给容器:
mkdir /data/docker-volume-nginx
-> 启动容器并挂载刚才创建的目录到容器的目录 /data 下:
docker run -d --name nginx-test2 -v /data/docker-volume-nginx/:/data nginx
-> 进入刚才创建的目录,在里面创建一个文件 mmm:
touch mmm
-> 登录容器,在 /data 目录中,看到刚才在宿主机中创建的目录 mmm:
sh /data/shell/docker_in.sh nginx-test2