首页 > 其他分享 >Docker基础

Docker基础

时间:2023-10-23 14:57:42浏览次数:47  
标签:容器 tomcat -- 基础 ID 镜像 Docker docker

目录

1. docker 介绍

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

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

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

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口

  • 特性:
  1. 隔离环境(系统,网络,文件系统)与应用
  2. 解决依赖与版本问题
  3. 易于分发,开箱即用
  4. 节点与容器快速扩容和缩容
  5. 镜像制作简单便捷,管理方便
  • namespace:进程隔离

  • cgroup:资源限制 它最主要的作用,就是限制一个进程
    组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

  • 在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式
    组织在操作系统的 /sys/fs/cgroup 路径下

  • Docker和虚拟机技术比较:

    • 传统虚拟机:虚拟硬件,运行一个完整的操作系统,然后在系统上安装和运行app
    • docker:容器内的应用直接运行在宿主机,容器没有自己的内核,也没有虚拟硬件,容器间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
  • Docker的基本组成:

    • 镜像 (image):镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件做需要的所有的内容,包括代码,运行时,库,环境变量和配置文件

    • 容器 (container):镜像运行起来之后,就是容器。也可以理解它就是一个服务,这个服务可以由多个服务组成,比如某个镜像提供的是一个启动服务的安装包,将其运行成容器后,它会拉起几个其他程序来提供一个完整的服务

    • 仓库 (repository):用来存放镜像,仓库分为公有仓库Docker Hub和私有仓库Harbor

2. docker 安装

# 需内核版本 3.10以上 (uname -r)

# 1. 安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2


# 2. 添加docker的CE版(社区版)的阿里云yum源
yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 3. 安装docker
# 安装最新版本
yum -y install docker-ce
# 安装指定版本
# yum list docker-ce.x86_64  --showduplicates | sort -r  # 从高到低列出docker版本然后选择版本安装


# 4. 配置镜像加速
tee  /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors":[
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
}
EOF


# 5. 启动docker并设置为开机自启动
systemctl daemon-reload
systemctl enable docker --now

3. docker 常用命令

3.1 docker信息

docker version   # 查看docker容器版本
docker info      # 查看docker容器信息,包括镜像和容器的数量
docker --help    # 查看docker容器帮助

3.2 镜像操作

  1. 查看镜像

    docker images			  # 列出本地images
    docker images xxx         # 查看指定images
      
    # 常用可选项
    -a, --all             	  # 列出所有镜像信息
    -q, --quiet           	  # 只显示镜像ID
    
  2. 搜索镜像镜像

    docker search 镜像名称     # 从镜像仓库搜索镜像
    
    # 常用可选项
    -f, --filter filter       # 过滤,例如 docker search nginx --filter "STARS=3000" (搜索收藏大于3000的nginx镜像)
    
  3. 下载/上传镜像

    docker pull 镜像名称[:tag] # 拉取镜像
    docker push 镜像名称	   # 上传镜像
    
  4. 删除镜像

    docker rmi 镜像名称/镜像ID
    	
    # 常用可选项
    -f, --force		# 强制删除
    
  5. 镜像增加tag信息

    docker tag 镜像ID os/centos7:1
    
  6. 显示指定镜像的历史创建

    docker history Image_name
    
    # 常用可选项
    -H, --human    # 以可读的格式打印镜像大小和日期
        --no-trunc # 显示完整的提交记录
    
  7. 获取镜像的元信息(检查镜像或者容器的参数,默认返回 JSON 格式)

    docker inspect --format '{{.RepoDigests}}' 镜像/容器
    
    # 常用可选项
    -f, --format string    # 指定返回值的模板文件
    

3.3 容器启动和状态管理

  1. 创建一个容器进程但不启动

    docker create Image_name
    
  2. 创建并运行一个容器

    docker run -d  -it 镜像名称 --name 指定容器名称 -e XXX=xxx /bin/bash
    
    
    # 常用可选项
    -d		# 后台运行
    -i		# 可以进行命令交互
    -t		# 制作一个伪终端用于登陆
    -v		# 挂载volume卷
    -p		# 映射端口 (主机端口:容器端口)
    -P		# 映射随机端口
    -e		# 设置环境变量
    -m		# 可以使用的最大内存
    --rm    # 容器任务完成后自动删除,用来测试
    --cpus	# 可以使用的最大cpu数
    --omm-kill-disable	# 禁用OMM Killer
    --name	# 容器命名
    
    --log-opt max-size=10m # 日志文件的最大大小, 默认为-1(无限制)
    --log-opt max-file=3   # 可以存在的最大日志文件数。如果滚动日志会创建多余的文件,则会删除最早的文件。仅在max-size设置时有效。一个正整数。默认为1。
    

3.4 容器相关操作

  1. 启动/停止/强制停止/重启/删除/暂停/恢复容器

    docker [start|stop|kill|restart|rm|pause|unpause] 容器ID或容器名称
    docker rm $(docker ps -q -f status=exited) # # 删除exited状态的容器
    
    # 常用选项
    rm -f             # 强制删除
    rm -l 连接名       # 移除容器间的网络连接
    rm -v 容器         # 删除容器,并删除容器挂载的数据卷
    
  2. 查看容器

    docker ps 
    
    
    # 常用选项
    -q    	# 查看正在运行的容器的ID
    -a    	# 查看正在运行+历史运行过的容器
    -s    	# 显示运行容器总文件大小
    -l    	# 显示最近创建容器
    -n 3  	# 显示最近创建的3个容器
    
  3. 查看容器中的进程

    docker top 容器ID或容器名称
    
  4. 查看容器日志

    docker logs -f -t --tail=20 Container_ID
    -f  跟踪日志输出
    -t  显示时间戳
    --tail  仅列出最新N条容器日志
    
  5. 容器状态相关

    # 实时监测容器的变化情况
    docker events 
    
    # 监听容器的退出状态并返回状态码
    docker wait 容器ID或容器名称
    
    # 检查容器资源使用情况
    docker stats 容器ID或容器名称
    
    # 查看容器进程与源镜像做对比,发生了改变的文件或文件夹
    docker diff 容器ID或容器名称
    
    # 查看容器与宿主机端口映射关系
    docker port 容器ID或容器名称
    
  6. 获取容器的元信息

    # 查看容器日志文件
    docker inspect --format='{{.LogPath}}' 容器ID或容器名称
    
    # 查看容器pid
    docker inspect --format '{{ .State.Pid }}' 容器ID或容器名称
    
  7. 容器终端操作

    # 容器中打开新的交互模式终端
    docker exec -i -t  Container_ID  /bin/bash
    
    # 以交互模式在容器中执行命令,结果返回到当前终端屏幕
    docker exec -i -t Container_ID ls -l /tmp   
    
    # 以分离模式在容器中执行命令,程序后台运行,结果不会反馈到当前终端
    docker exec -d Container_ID touch cache.txt 
    
  8. 容器文件复制

    # 将容器中的文件copy至本地
    docker cp 容器ID:路径  本地路径
    
    # 将本地文件copy至容器
    docker cp 本地路径 容器ID:路径 
    
  9. 直接进入容器(不分配新终端)

    docker attach  容器ID 
    快捷键:Ctrl + q + p  # 仅退出容器,不关闭
    
  10. 修改容器名称

    docker rename 容器ID或容器名称 新名称
    
  11. 调整容器资源限制

    docker update -m (内存限制) -c (cpu限制) 容器ID或容器名称
    

4. docker 镜像

4.1 镜像加载原理

  • UnionFS联合文件系统

    • UnionFS联合文件系统是一种分层、轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
    • UnionFS联合文件系统是docker镜像的基础,镜像可以通过分层来继承,基于基础镜像可以制作各种具体的应用镜像
    • 一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所以底层的文件和目录
  • docker镜像加载

    • docker镜像:由一层一层的文件系统组成,这种层级的文件系统就是UnionFS
    • bootfs(boot file system):主要包含bootloader和kernel, bootloader 主要是引导加载kernel,当我们加载镜像的时候,会通过bootloader加载kernal,Docker镜像最底层是bootfs,当boot加载完成后整个kernal内核都在内存中了,bootfs也就可以卸载,值得注意的是,bootfs是被所有镜像共用的,许多镜像images都是在base image(rootfs)基础上叠加的。
    • rootfs (root file system):在bootfs之上包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等等

    对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了

Docker的镜像层都是只读的,当容器启动时,会在镜像的最上层加载一个容器层

容器层是可写的


4.2 镜像操作

4.2.1 commit

# 将一个运行中的容器的当前状态保存为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID  目标镜像名:[TAG]

4.2.2 export 和 import

# 对当前的容器状态建立快照,并持久化为tar文件
docker export 容器ID > test.tar

# 将导出的tar包文件系统生成一个新的镜像
docker import test.tar 镜像名称

4.2.3 save 和 load

# 镜像打包/镜像还原
docker save  base/tomcat8 os/centos7 -o images.tar 
docker load -i images.tar 或者 docker load < images.tar

5. docker 数据卷

Docker提供三种不同方式将数据从宿主机挂载到容器中:volumesbind mountstmpfs

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
  • bind mounts: 可以存储在宿主机系统的任意位置
  • tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统

5.1 volumes/bind mounts

-v--mount区别:-v没有源时自动创建并挂载,--mount没有则报错

# 1. 创建volumes
docker volume create tomcat_volume

# 2. 查看所有volumes
docker volume ls

# 3. 删除volumes
docker volume rm 卷名

# 4. 查看volumes详细信息
docker volume inspect 卷名

# 5. 启动两个容器挂载同一个volume
mkdir /data/webapps;echo "test" > /data/webapps/test.html

# volumes方式挂载     
# docker run -dit  --mount src=tomcat_volume,dst=/usr/local/tomcat/webapps --name=tomcat-node01  tomcat:9.0

# bind-mount方式挂载
# docker run -dit  --mount type=bind,src=/data/webapps/,dst=/usr/local/tomcat/webapps --name=tomcat-node01  tomcat:9.0

# -v方式挂载 (-v 是bind方式,可通过 docker inspect 容器 查看挂载类型)
docker run -dit  -v /data/webapps/:/usr/local/tomcat/webapps --name=tomcat-node01  tomcat:9.0 

# --volumes-from挂载 (挂载和指定容器相同的数据卷)
docker run -dit --volumes-from tomcat-node01 --name=tomcat-node02 tomcat:9.0

匿名挂载:

  • 没有声明宿主机目录或卷名:docker run -dit -v /usr/local/tomcat/webapps tomcat:9.0

  • Docker会默认在宿主机上创建一个临时目录/var/lib/docker/volumes/[VOLUME_ID]/_data,然后把它挂载到容器的 /usr/local/tomcat/webapps目录上,VOLUME_IDVOLUME NAME(docker volume ls) 的名字一样

具名挂载:

  • 声明卷名和容器目录:docker run -dit -v tomcat_webapps:/usr/local/tomcat/webapps tomcat:9.0

  • Docker会默认在宿主机上创建一个临时目录/var/lib/docker/volumes/tomcat_webapps/_data,然后把它挂载到容器的 /usr/local/tomcat/webapps 目录上,VOLUME_IDVOLUME NAME(docker volume ls) 的名字一样

不创建卷挂载:

  • 声明宿主机目录和容器目录:docker run -dit -v /data/webapps/:/usr/local/tomcat/webapps tomcat:9.0

  • 宿主机没有时自动创建/data/webapps/,然后把它挂载到容器的 /usr/local/tomcat/webapps 目录上,不创建volume(docker volume ls没有显示)

挂载权限:

  • ro: 挂载后挂载的内容在容器内只读

    docker run -dit -v tomcat_webapps:/usr/local/tomcat/webapps:ro tomcat:9.0

  • rw:挂载后挂载的内容在容器内可写

    docker run -dit -v tomcat_webapps:/usr/local/tomcat/webapps:rw tomcat:9.0

# mysql 持久化示例

# 1.运行myql容器并将本地目录映射到容器
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql-node01 mysql:5.7

# 2.本机连接容器mysql并创建test库
mysql -uroot -p123456  -h 192.168.10.111 -P3310
# create database test

# 3.删除容器重新运行查看test库是否存在

5.2 tmpfs

docker run -dit --mount type=tmpfs,dst=/tmp --name=tomcat-node04  tomcat:9.0

docker exec xx  df | grep -w tmp
tmpfs                      932652       0    932652   0% /tmp

5.3 修改容器数据存储位置

  • 方式一:修改docker启动配置文件(/lib/systemd/system/docker.service)

    ExecStart=/usr/bin/dockerd --graph=/data/docker/

  • 修改docker启动配置文件(/etc/docker/daemon.json)

    {
    "live-restore": true,
    "graph": [ "/data/docker/" ]
    }

标签:容器,tomcat,--,基础,ID,镜像,Docker,docker
From: https://www.cnblogs.com/ican97/p/17782410.html

相关文章

  • Docker网络
    目录1.网络类型1.1link(已不建议使用)1.2container(已不建议使用)1.3none1.4host1.5bridge/自定义网络(推荐)2.自定义网段网络3.bridge与自定义网段网络通信4.部署Redis集群示例1.网络类型1.1link(已不建议使用)link:--link连接的容器名或ID使用了link机制后,......
  • Docker-Compose
    目录1.简介2.Composeyml规则3.Compose示例3.1Python-web应用3.2wordpress应用1.简介DockerCompose是Docker官方的开源项目,作用是通过docker-compose.yml定义运行多个容器官方文档Compose概念:Services:容器,应用,例如:web、redis、mysql...Project:一组关联的容......
  • MarkDown语法基础
    markdown基础语法编辑器推荐vscode支持大量的插件,包括makrdown语法展示效果的插件。当安装这个插件之后,能够将文档和显示效果分成两个页面,就可以一边编辑代码,一边查看显示效果了,更大的优点是,纯文本状态下,无需考虑显示效果,加载速度更高,如果使用typora的话,当笔记达到两万字左右就......
  • docker-compose
    Compose简介Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟OpenStack中的Heat十分类似。其代码目前在https://github.com/docker/compose上开源。Compose定位是「定义和运行多个Docker容器的应用(Definingandrunnin......
  • JdbcTemplate基础【项目demo】【基础知识】【简单明了,一眼就会】
    jdbcTemplateDemo以便更好的应用。注意:实际大型项目中service层为复杂的逻辑处理,请自行编写。JdbcTemplate例子源码(含sql):http://www.shicishu.com/down/JdbcTemplate_Demo.rar第一部分:层级关系说明:1、controller层:对外接口层。(一般调用service层。)2、service层:逻辑处理层、(审核......
  • docker-compose 安装 etcd
    目录docker-compose.yamldocker-compose.yamlversion:"3"services:etcd:hostname:etcdimage:bitnami/etcd:3deploy:replicas:1restart_policy:condition:on-failure#ports:#-"2379:2379"......
  • html基础内容
    1.认识htmlhtml是超文本标签语言,其中超文本代表它不仅仅只有文本、还可能会有视频、图片、音频等、标签语言代表它是由一个一个标签组成的语言。html中有双标签和单标签。单标签:由一个标签组成。比如:<hr>、<br>双标签:由开始标签和结束标签组成。比如:<h1></h1><h1>表示开始标......
  • 神经网络基础篇:逻辑回归的代价函数
    逻辑回归的代价函数(LogisticRegressionCostFunction)为什么需要代价函数:为了训练逻辑回归模型的参数参数\(w\)和参数\(b\),需要一个代价函数,通过训练代价函数来得到参数\(w\)和参数\(b\)。先看一下逻辑回归的输出函数:为了让模型通过学习调整参数,需要给予一个\(m\)样本的训练......
  • Docker镜像管理
    Usage:dockerimageCOMMANDManageimagesCommands:build从Dockerfile中构建镜像history显示镜像历史信息,如元数据等。。。importImportthecontentsfromatarballtocreateafilesystemimage。inspect详细镜像的详细信息load......
  • Java 入门 01~08 & Java 基础 01~04
    Java入门01~081.java的Helloword​ 创建helloWord.java文件->Javac编译完成后->java运行在终端{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}2.语言分类​ 编译型:完整编译以后可直接执行的。......