docker镜像及容器的使用

Posted 徐中祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker镜像及容器的使用相关的知识,希望对你有一定的参考价值。

docker镜像及容器的使用

一.Docker三大概念

docker 中有三个核心概念:镜像,容器,仓库。
因此准确把握这三大概念对于掌握docker技术尤为重要。

1.镜像

Docker镜像就相当于是一个root文件系统.比如官方镜像ubuntu:16:04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。

镜像就是启动一个容器的模板。

2.容器

镜像和容器的关系就像是面向对象程序设计中的类和实例一样.镜像是静态的定义容器是镜像运行时的实体.容器可以被创建,启动,停止,删除,暂停等。

容器就是对外提供服务的进程。或者容器就是镜像启动起来的一个实例。

3.仓库

仓库用来保存镜像的仓库.当我们构建好自己的镜像之后需要存放在创库中.当我们需要启动一个镜像时可以在仓库中下载下来。

仓库是用来存放镜像的地方。

二.帮助命令

docker version		# 显示docker的版本信息
docker info			# 显示docker的系统信息,包括镜像和容器的的数量
docker 命令 --help

官网地址:https://www.docker.com/

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

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

命令的帮助文档:https://docs.docker.com/reference/

三.Docker的使用

1.Docker镜像

docker镜像是docker中三大概念之一,其主要作用是作为启动容器的模板。

  • docker images 查看本地主机上的所有镜像
[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
yourredis     latest    621ceef7494a   2 months ago    104MB

# 解释
REPOSITORY  镜像的仓库源
TAG		    镜像的标签
IMAGE ID    镜像的ID
CREATED     镜像的创建时间
SIZE        镜像的大小

# 可选项
docker images --help

 -a, --all    # 列出所有镜像          
 -q, --quiet  # 只显示镜像的ID     
  • docker tag 给本地镜像打标签
# 镜像标签的构成
docker.io/library/redis:latest
docker.io  : 镜像仓库的URL
library    :镜像仓库命名空间
redis	   : 镜像名称
latest	   : 镜像版本号


# 格式:
	  docker tag [镜像ID]  镜像标签

    # docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    mytomcat     latest    9b256e80cf11   12 hours ago   697MB

	# docker tag 9b256e80cf11 mytomcat:1.0
	
	# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    mytomcat     1.0       9b256e80cf11   12 hours ago   697MB
  • docker inspect 获取镜像的详细信息
# 使用镜像名字查看
[root@docker ~]# docker inspect mynginx

# 使用镜像ID查看
[root@docker ~]# docker inspect f6d0b4767a6c

# 参数: -f 格式化输出
[root@docker ~]# docker inspect -f '{{.Id}}' f6d0b4767a6c

[root@docker ~]# docker inspect -f '{{.Id}}' mynginx
  • docker search 搜索镜像
[root@docker ~]# docker search mysql
NAME   DESCRIPTION                                    STARS    OFFICIAL  AUTOMATED
mysql  MySQL is a widely used, open-source relation…  10670     [OK]       

# 解释
NAME          镜像名字
DESCRIPTION   镜像的描述信息
STARS	      镜像收藏数量
OFFICIAL      是否是官方发布的镜像
AUTOMATED	  自动构建


# 可选项
[root@docker ~]# docker search --help

  -f, --filter    # 过滤输出内容
      --limit 	  # 限制输出结果
      --no-trunc  # 不截断输出结果

# 案例
	[root@docker ~]# docker search -f is-official=true mysql
	
	[root@docker ~]# docker search -f stars=8000 mysql
	
	[root@docker ~]# docker search -f stars=8 --limit 3 mysql
	
	[root@docker ~]# docker search -f stars=8 --limit 3 --no-trunc mysql
  • docker pull 下载镜像
[root@docker ~]# docker pull mysql[镜像名:tag]

Using default tag: latest     # 如果不写版本tag 默认就是最新版latest
latest: Pulling from library/mysql
a076a628af6f: Already exists  # 分层下载 docker镜像的核心 联合文件系统
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
# 镜像ID号(镜像ID号是全球唯一)
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
# 镜像下载状态
Status: Downloaded newer image for mysql:latest
# 真实下载地址
docker.io/library/mysql:latest

# 等价的下载方式
docker pull mysql
docker.io/library/mysql:latest

# 指定版本下载
[root@docker ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists 
f6c208f3f991: Already exists 
88a9455a9165: Already exists 
406c9b8427c6: Already exists 
7c88599c0b25: Already exists 
25b5c6debdaf: Already exists 
43a5816f1617: Already exists 
1831ac1245f4: Pull complete 
37677b8c1f79: Pull complete 
27e4ac3b0f6e: Pull complete 
7227baa8c445: Pull complete 
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
  • docker rmi 删除镜像
[root@docker ~]# docker rmi c8562eaf9d81

[root@docker ~]# docker image rm mynginx

[root@docker ~]# docker rmi -f a70d36bc331a

[root@docker ~]# docker rmi -f $(docker images -a -q)  删除所有镜像
  • docker image prune 清理镜像

镜像使用一段时间之后docker会产生很多临时文件,以及一些没有被使用的镜像。

[root@docker ~]# docker image prune -a -f
  • docker history 查看镜像历史
# 使用镜像名称
[root@docker ~]# docker history nginx

# 使用镜像ID
[root@docker ~]# docker history f6d0b4767a6c
  • docker login 登录镜像仓库
注: 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。

[root@docker ~]# docker login --help
# 参数
--username|-u : 指定用户名
--password|-p : 指定密码

# 登录阿里云docker registry
[root@docker ~]# docker login --username=xu中祥 registry.cn-hangzhou.aliyuncs.com

# 登录dockerhub官方仓库
[root@docker ~]# docker login -u xuzhongxiang
Password: 
  • docker push 镜像上传
注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag
	
# 对镜像打标签
[root@docker ~]# docker tag f6d0b4767a6c registry.cn-hangzhou.aliyuncs.com/xuzhongxiang/steven:latest

# 上传镜像
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/xuzhongxiang/steven:latest
  • 保存镜像

    构建镜像一般有三种情况:

    基于容器导入

    基于本地模板导入

    基于Dockerfile创建

    1.主要参数

    -a作者信息
    -m提交信息
    -p提交时.暂停容器运行

    2.基于容器保存镜像

    主要格式:docker commit [容器ID|容器名称]

# 保存正在运行的容器直接为镜像
	
[root@docker ~]# docker run -d -it centos /bin/bash

[root@docker ~]# docker exec 5a84db79dce0 touch test

[root@docker ~]# docker commit -m "add a file" -a "xuzhongxiang" 5a84db79dce0 centos:v1

[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       v1        bc62a57d071c   6 seconds ago   209MB
centos       latest    300e315adb2f   3 months ago    209MB

​ 3.(import/export)

​ export 和 import 的针对点是容器.将本机的容器导出为镜像包。

使用 export 保存容器为镜像包
	
	# 格式:
		  docker export [容器的ID] > [包名称]
	# 案例:
		  [root@docker ~]# docker export 5a84db79dce0 >centos.tar

使用 import 导入镜像包为镜像
    
    # 格式:
 		  docker import [包名称] [自定义镜像名称]
	# 案例:
		 [root@docker ~]# docker import centos.tar test:v1

​ 4.(save/load)

​ save 和 load 针对的点是镜像.是将本机的镜像导出/导入为镜像包。

使用 save 保存镜像
	
	# 格式:
		  docker save [镜像名称|镜像ID] > [包名称]
		  
	# 案例:
		  [root@docker ~]# docker save 300e315adb2f > xiaoxu.tar

使用 save 保存多个镜像
		  [root@docker ~]# docker save -o xiaoxu-two.tar e3c0b8b5d262


使用 load 导入镜像
	# 格式:
		  docker load < [包名称]
	# 案例:
		  [root@docker ~]# docker load < xiaoxu.tar

# 注:save/load保存镜像无法自定义镜像名称,save保存镜像时如果使用ID保存则load导入镜像无名称,使用名称导入时才有名称。
[root@Centos7 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
busybox      latest    b97242f89c8a   2 months ago     1.23MB
[root@Centos7 ~]# docker save busybox:latest > busybox.tar
[root@Centos7 ~]# ll
total 150120
-rw-r--r--. 1 root root   1459200 Mar 18 17:43 busybox.tar
[root@Centos7 ~]# docker rmi b97242f89c8a
Untagged: busybox:latest
Untagged: busybox@sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f
Deleted: sha256:b97242f89c8a29d13aea12843a08441a4bbfc33528f55b60366c1d8f6923d0d4
Deleted: sha256:0064d0478d0060343cb2888ff3e91e718f0bffe9994162e8a4b310adb2a5ff74
[root@Centos7 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
[root@Centos7 ~]# docker load < busybox.tar 
0064d0478d00: Loading layer [==================================================>]   1.45MB/1.45MB
Loaded image: busybox:latest
[root@Centos7 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
busybox      latest    b97242f89c8a   2 months ago     1.23MB
  • 保存镜像三种方式的区别
1、export保存的镜像体积要小于save(save保存更完全,export保存会丢掉一些不必要的数据)
2、export可以重命名镜像名称而save则不行
3、save可以同时保存多个镜像而export则不行

2.Docker容器

在Docker中 真正对外提供服务的还是容器.容器就是对外提供服务的一个实例。

容器启动的必要条件:容器内至少有一个进程运行在前台。

  • 说明: 只有有了镜像才可以创建容器
docker pull centos
  • docker run 启动容器参数
	-d : 以守护进程的方式运行一个容器
		docker run -d [镜像名称] [cmd]
	
	-p : 指定端口映射
		docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
	
	-P : 随机端口映射
		docker run -d -P [镜像名称] [cmd]
	
	-i : 打开标准输入
	
	-t : 分配一个伪终端
		docker run -it [镜像名称] [cmd]
	
	-v : 挂载目录到容器中
		docker run -v 宿主主机目录:容器内目录  [镜像名称] [cmd]
	
	-e : 在容器中设置环境变量
		docker run -e NAME=Centos -d [镜像名称] [cmd]
	
	-h : 设置容器主机名
		docker run -h "主机名"  [镜像名称] [cmd]
		
	--rm : 容器生命周期结束时立即删除
		docker run --rm [镜像名称] [cmd]
	
	--name : 为启动的容器设置名字
		docker run -d --name [容器名称] [镜像的名称] [cmd]
		
	--link : 连接上一个容器实现网络互通.只能单向连接
		docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
		
	--network : 指定使用哪个网络
		

# docker run 运行流程
1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
3、返回容器ID
  • 启动容器案例

    格式: docker run [参数] [镜像名称] [运行容器的启动命令]

    1.测试启动并进入容器

docker run -it centos /bin/bash

# 查看容器内的centos基础版本很多命令都是不完善的
[root@63cebd387668 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

​ 2.以守护进程的方式运行一个容器

# 格式
	  docker run -d [镜像名]
	 
# 案例
	  docker run -d centos

问题 : # docker ps 发现centos 停止了

原因 : # docker容器使用后台运行.就必须要有一个前台进程.docker发现没有运行在前台的进程.就会自动停止。

​ 3.挂载目录到容器中

# 格式
	 docker run -v 宿主主机目录:容器内目录  [镜像名称] [cmd]
	 
# 案例
		# 运行并挂载目录
	 docker run -d -it -v /home/ceshi:/home centos /bin/bash
	 
		# 进入容器
	 docker exec -it c52da1f38334 /bin/bash
	 
	 	# 在容器挂载目录生成数据
	 touch /home/steven 
	 
	 	# 查看数据
     ll /home/ceshi/
     steven

​ 4.指定端口映射

# 格式
	 docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]

# 案例
	 docker run -d -it -p 1314:80 nginx /bin/bash

​ 5.在容器中设置环境变量

# 格式
	 docker run -e NAME=Centos -d [镜像名称] [cmd]
	 
# 案例
	 docker run -e NAME=Centos -d -it centos /bin/bash

​ 6.随机端口映射

# 格式
	 docker run -d -P [镜像名称] [cmd]
	 
# 案例
	 docker run -d -it -P nginx /bin/bash

​ 7.设置容器主机名

# 格式
	 docker run -h "主机名"  [镜像名称] [cmd]

# 案例
	 docker run -d -it -h "steven" redis /bin/bash
	 
# 进入容器验证
	 docker exec -it f390e62a0917 /bin/bash
	 root@steven:/data# 

​ 8.容器生命周期结束时立即删除

# 格式
	 docker run --rm [镜像名称] [cmd]
	 
# 案例
	 docker run -d --rm centos /bin/bash

​ 9.为启动的容器设置名字

# 格式
	 docker run -d --name [容器名称] [镜像的名称] [cmd]

# 案例
	docker run -d -it --name nginx01 nginx /bin/bash

​ 10.连接上一个容器,实现网络互通

# 格式
	 docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
	 
# 案例
		# 创建一个容器
	 docker run -d -it -P f6d0b4767a6c /bin/bash
	 
	    # 连接上一个创建的容器
	 docker run -d -it --link nervous_allen:test nginx /bin/bash
  • docker ps 列出所有运行的容器
[root@docker ~]# docker ps		# 列出当前正在运行的容器
CONTAINER ID   IMAGE   COMMAND   CREATED   STATUS   PORTS   NAMES

# 解释
CONTAINER ID   # 容器ID
IMAGE		   # 镜像名字
COMMAND		   # 执行的命令
CREATED		   # 创建时间
STATUS		   # 容器状态
PORTS		   # 容器端口
NAMES		   # 容器名字


# 参数
	-a		# 查看系统中所有的容器。
	-q		# 只显示容器的ID
	-n=# 显示最近创建的容器

# 案例
    docker ps -a

    docker ps -aq

    docker ps -n=2
  • docker rm 删除容器
# 格式
	docker rm [容器名称|ID]   # 不能删除正在运行的容器

# 参数
	-f : 强制删除
	docker rm -f [容器名称|ID]

# 清空所有容器
docker rm $(docker ps -a -q)

# 清空所有容器
docker ps -aq | xargs docker rm -f
  • 停止和启动容器
docker start 容器ID   # 启动容器

docker restart 容器ID # 重启容器

docker stop 容器ID    # 停止容器

docker kill 容器ID    # 强制停止当前容器
  • docker logs 查看日志
[root@docker ~]# docker logs --help

 # 格式:  
 		docker logs [选项] 容器ID
 
 # 选项:
      --details        
  -f, --follow         
      --since string   
                       
  -n, --tail string    
  -t, --timestamps    

  
  # 案例:
  		docker logs -tf 129931df491c
  		
  		docker logs -tf --tail 10 129931df491c
  • 查看容器中进程信息
# 格式:
	  docker top [容器ID | 容器名字]

    # 容器ID查看
    docker top 129931df491c

    # 容器名字查看
    docker top crazy_solomon
  • 查看容器的元数据
# 格式
	docker inspect [容器名称|ID]
	
# 案例:

		# 使用容器ID查看
	docker inspect 129931df491c

		# 使用容器名字查看
	docker inspect crazy_solomon


		# 怎么监控docker运行状态?
	docker inspect -f '{{.State.Running}}' nginx
  • 进入容器

在使用容器的过程中难免需要进入容器经行排查问题。

# 进入容器一般有四种

1、exec : 在容器外向容器内执行一个命令(官方推荐)
	# 格式
	docker exec [参数] [容器的名称|ID] [cmd]
	
	# 案例
	docker exec -it 2d81b39ab517 /bin/bash
	
	

2、attach : 在早期docker提供的进入容器的命令(缺点:当其结束时,容器也跟着结束了)
	# 格式
	docker attach [容器ID|名称]
	
	# 案例
	docker attach 2d81b39ab517


3、nsenter : 建立一个管道连接上容器主ID
	# 案例
		nsenter --target $(docker inspect -f {{.State.Pid}} 2d81b39ab517) --mount --uts --ipc --net --pid


4、ssh : 通过ssh连接

5. 总结
	nsenter 和 exec 之间的区别。exec是自带的命令.nsenter是linux提供的命令。
	exec 相当于在容器内执行了一个命令.而nsenter是仅仅进入容器之中而已。
  • 复制命令

复制命令类似于linux系统中的scp命令.是将宿主机上的内容上传到容器中。

也可以将容器中的内容下载到宿主机中。

@ 将宿主机中的文件复制到容器中
	# 格式
		 docker cp [宿主主机文件路径]  容器ID:容器内路径
	
	# 案例
		 docker cp /root/a.txt a7a92612dbe6:/


@ 将容器中的文件复制到宿主机中
	# 格式
		 docker cp 容器ID:容器内路径 [宿主主机文件路径]
	
	# 案例
		 docker cp a7a92612dbe6:/a.txt /root/

四.Docker练习

1.Docker安装Nginx

  • 搜索镜像
docker search nginx
  • 下载镜像
docker pull nginx
  • 运行nginx
# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    f6d0b4767a6c   2 months ago   133MB

# docker run -d --name nginx01 -p 1314:80 f6d0b4767a6c

# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS   NAMES
7fd375ad19f7   f6d0b4767a6c   "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:1314->80/tcp   nginx01
  • 测试访问

在这里插入图片描述

  • 进入容器
# docker exec -it nginx01 /bin/bash

# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

# cd /etc/nginx/
# ls
conf.d		koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params	koi-win  modules     scgi_params  win-utf

2.Docker安装tomcat

  • 下载镜像
# docker pull tomcat

# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
tomcat       latest    040bdb29ab37   2 months ago   649MB
  • 运行tomcat
# docker run -d --name tomcat01 -P 040bdb29ab37

# docker ps
CONTAINER ID   IMAGE          COMMAND     CREATED     STATUS          PORTS       NAMES
b57d16928848   040bdb29ab37   "catalina.sh run"        9 seconds ago    Up 8 seconds    0.0.0.0:49153->8080/tcp   tomcat01
  • 访问测试

在这里插入图片描述

访问出现问题:

1.linux命令少了 2.没有webapps网站页面

原因:镜像的原因默认是最小的镜像,所有不必要的都剔除掉保证最小运行环境

  • 进入容器
# docker exec -it b57d16928848 /bin/bash

# ls
BUILDING.txt	 NOTICE		RUNNING.txt  lib	     temp	   work
CONTRIBUTING.md  README.md	bin	     logs	     webapps
LICENSE		 RELEASE-NOTES	conf	     native-jni-lib  webapps.dist

# cp -r webapps.dist/* webapps
  • 再次访问

在这里插入图片描述

3.Docker安装es

es 暴露的端口很多

es 十分的耗内存

es 的数据一般需要放置到安全目录 挂载

–net somenetwork 网络配置

  • 启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
  • 测试
[root@docker ~]# curl localhost:9200
{
  "name" : "60e16857abca",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "qzue7kOARtiGf4KhvfVhGw",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
  • docker stats命令
docker stats  # 查看当前容器的存活状态

docker stats 60e16857abca

五.容器数据卷

1.什么是容器数据卷

  • docker的理念
将应用和环境打包成一个镜像.数据如果都在容器中那么我们容器删除.数据就会丢失

# 需求 : 数据可以持久化

MySQL把容器删了.删库跑路!

# 需求 : MySQL数据可以存储在本地

容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地。

# 卷技术 : 简单来说就是将容器内的目录挂载到Linux中

容器的持久化同步操纵.容器也是可以数据共享的。

2.使用数据卷

  • 指定路径挂载 -v
# 格式
	 docker run -v 宿主主机目录:容器内目录  [镜像名称] [cmd]
	 
# 案例
		# 运行并挂载目录
	 docker run -d -it -v /home/ceshi:/home centos /bin/bash
	 
		# 进入容器
	 docker exec -it c52da1f38334 /bin/bash
	 
	 	# 在容器挂载目录生成数据
	 touch /home/steven 
	 
	 	# 查看数据
     ll /home/ceshi/
     steven

3.Docker装MySQL

思考:MySQL的数据持久化的问题

  • 搜索镜像
docker search mysql
  • 获取镜像
docker pull mysql:5.7
  • 运行mysql

安装启动mysql需要配置密码。

docker run -d -p3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  • 使用工具连接测试

在这里插入图片描述

  • 删除mysql容器查看挂载的数据是否还在
[root@docker ~]# docker rm -f 489208bc5dca
489208bc5dca

[root@docker ~]# ll /home/mysql/data/
-rw-r----- 1 polkitd input       56 3月  31 03:57 auto.cnf
-rw------- 1 polkitd input     1676 3月  31 03:57 ca-key.pem

# 删除容器后数据依然存在

4.匿名/具名挂载

  • 匿名挂载
# 格式
	 -v [容器内路径] 
	 # 不跟主机内的目录直接跟容器内的目录它会默认生成一个目录。

# 匿名挂载案例
	docker run -d -P --name nginx01 -v /etc/nginx nginx


# 数据卷管理命令
[root@docker ~]# docker volume --help
# 命令
create     
inspect   
ls         
prune     
rm      

# 查看所有卷的情况
[root@docker ~]# docker volume ls 
local     2f8f86a38bb8d8b888d7c070dc10ff64ab4c413edfedfd1ccc5a971fb9821159

# 这种就是匿名挂载,因为在-v的时候只写了容器内的路径,没有写容器外的路径。
  • 具名挂载
# 格式
	 -v 卷名:容器内路径

# 具名挂载案例
	docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

# 查看数据卷
[root@docker ~]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx

# 查看这个卷
[root@docker ~]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-03-31T14:23:38+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/

通过具名挂载可以方便的找到数据卷,大多数情况使用*具名挂载*

  • 如何区分是匿名挂载/具名挂载/指定路径挂载
-v 容器内路径            # 匿名挂载

-v 卷名:容器内路径        # 具名挂载

-v /宿主机路径:容器内路径	 # 指定路径挂载
  • 拓展

通过 -v 容器内路径:ro rw 改变读写权限

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

ro readonly # 只读
rw readwrite # 可读可写

设置了容器的权限.容器挂载出来的内容就有限定了。
只要看到ro就说明这个路径只能通过宿主机来操作.容器内部是无法操作。

5.初识Dockerfile

Dockerfile就是用来构建 docker镜像的构建文件.相当于命令脚本。

通过这个脚本可以生成镜像.镜像是一层一层的.脚本就是一个个的命令,每个命令都是一层。

  • 创建Dockerfile

创建一个dockerfile文件.名字可以随机.建议使用Dockerfile

文件中的指令(大写)

# mkdir /home/docker-test-volume

# cd /home/docker-test-volume/

# vim dockerfile1
    FROM centos

    VOLUME ["volume01","volume02"]			# 匿名挂载

    CMD echo "---end---"

    CMD /bin/bash

@ 这里的每个命令就是镜像的一层。
  • 生成镜像
# docker build -f /home/docker-test-volume/dockerfile1 -t xuzhongxiang/centos:1.0 .

# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
xuzhongxiang/centos   1.0       009461769781   6 seconds ago   209MB
  • 启动自己的容器
# docker run -it 009461769781 /bin/bash

[root@abacac44b227 /]# ls -l
drwxr-xr-x   2 root root   6 Mar 31 08:04 volume01
drwxr-xr-x   2 root root   6 Mar 31 08:04 volume02

# 上面两个目录就是我们生成镜像的时候自动挂载的数据卷目录,这个卷和外部一定有个同步的目录

# 挂载目录生成数据
[root@fba99e6b2129 /]# cd volume01

[root@fba99e6b2129 volume01]# touch container.txt
  • 查看卷挂载的路径
[root@docker ~]# docker inspect fba99e6b2129
        "Mounts": [
            {
                "Type": "volume",
                "Name": "18dfa7f11ac50b0b206c3965bcdd574e7c0cf3ecdaa1c79cf470288598441cf4",
                "Source": "/var/lib/docker/volumes/18dfa7f11ac50b0b206c3965bcdd574e7c0cf3ecdaa1c79cf470288598441cf4/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "3fa4cd27a52a2b4b373d705db3edd313133c51962fa93918ffbee9cede3c5a6e",
                "Source": "/var/lib/docker/volumes/3fa4cd27a52a2b4b373d705db3edd313133c51962fa93918ffbee9cede3c5a6e/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

# 匿名挂载
  • 验证数据是否同步
# ll /var/lib/docker/volumes/18dfa7f11ac50b0b206c3965bcdd574e7c0cf3ecdaa1c79cf470288598441cf4/_data
	-rw-r--r-- 1 root root 0 3月  31 16:13 container.txt
	
# 同步成功

这种方式会使用的特别多因为我们同常会构建自己的镜像。

假设构建镜像的时候没有挂载卷.就要手动镜像挂载. -v 卷名:容器内路径

6.容器共享数据卷

多个容器之间同步数据

在这里插入图片描述

  • 启动第一个容器docker01
docker run -d -it --name docker01 xuzhongxiang/centos:1.0 /bin/bash
  • 启动第二个容器docker02挂载到docker01
docker run -d -it --name docker02 --volumes-from docker01 xuzhongxiang/centos:1.0
  • 进入docker01生成数据
[root@docker ~]# docker exec -it docker01 /bin/bash

[root@344c19924ee0 /]# cd volume01

[root@344c19924ee0 volume01]# touch a.txt
  • 进入docker02验证数据
[root@docker ~]# docker exec -it docker02 /bin/bash

[root@5460de82bb00 /]# ls /volume01
a.txt
  • 启动第三个容器docker03挂载到docker01
docker run -d -it --name docker03 --volumes-from docker01 xuzhongxiang/centos:1.0

# 生成数据
[root@docker ~]# docker exec -it docker03 /bin/bash
[root@99fef21f5aad /]# cd volume01
[root@99fef21f5aad volume01]# touch b.txt
  • 进入docker01验证数据
[root@docker ~]# docker exec -it docker01 /bin/bash
以上是关于docker镜像及容器的使用的主要内容,如果未能解决你的问题,请参考以下文章

Docker基础命令详解——镜像及容器操作

Docker篇之一Docker镜像及容器

Docker架构,镜像及容器

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段

Docker镜像的创建及上传

Docker基本管理(容器及镜像操作)