【编程不良人】Docker学习总结(一)
本博客将记录博主学习b站编程不良人的Docker的总结,虽然以前也有使用过docker,但都是一些最基本的用法,这次将会全面认真的学习Docker。
Docker学习总结(二)
Docker学习总结(三)
01:docker的引言
什么是docker
- 官方定义:
[scode type="share"]We help developers and development teams build and ship apps.
(我们帮助开发人员以及开发团队构建和发布应用)
We have a complete container solution for you - no matter who you are and where you are on your containerization journey.[/scode] - 总结:Docker就是容器技术 ===> 应用容器技术 容器里面运行软件环境
- Docker 使用 Google 公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及OverlayFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离进程(操作系统隔离),因此也称其为容器。
为什么是docker
- Docker将程序以及使用软件环境直接打包在一起,无论在哪个机器上都保证了环境一致
[scode type="green"]一致的运行环境,更轻松的迁移[/scode] - “服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了”
[scode type="green"]对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源[/scode] - “公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器”
[scode type="green"]通过镜像复制N多个环境一致的容器[/scode]
02:docker与传统虚拟机对比
虚拟机缺点:
- 虚拟机运行软件环境之前必须经自身携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是:
[scode type="yellow"]虚拟内存 -> 虚拟物理内存 -> 真正物理内存[/scode]
Docker优势
- Docker是不携带操作系统的,所以Docker的应用就非常的轻巧
- Docker引擎分配资源直接是 虚拟内存 ---> 真正物理内存
03:docker安装
[scode type="yellow"]注意windows10安装需要开启Hyper-V(1903版本以上无需开启)[/scode]
docker在linux系统安装,或类unix系统,通用安装方式:bash脚本安装
curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh --mirror Aliyun
启动、停止、重启docker服务
systemctl status | start | stop | restart docker
查看当前docker信息
docker info
配置docker开机自启动
systemctl enable docker
建立docker组 并使用root用户
sudo groupadd docker sudo usermod -aG docker $USER
测试docker安装是否正确
docker run hello-world
04:Docker的核心概念和核心架构图
镜像 image images
- 定义:一个镜像代表着一个软件,如:mysql镜像、redis镜像、nginx镜像
特点:只读
容器 container
- 定义: 基于某个镜像运行一次就是生成一个程序实例,一个程序实例称之为一个容器
特点:可读可写
仓库 repository
- 定义: 用来存储docker中所有镜像具体位置
- 远程仓库:docker在世界范围维护一个唯一的远程仓库
- 本地仓库:当前自己机器中下载镜像存储位置
05:Docker配置镜像加速
- 创建阿里云账号 -> 登录 -> 管理控制台 -> 在产品服务中搜索,容器服务在搜索列表中找到 容器镜像服务
在打开页面中找到镜像加速器,并选择相应的系统,依次执行页面中的bash命令,例如我的ubuntu:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
- 通过docker info查询最后新增的镜像
06:Docker的helloworld应用
docker入门案例
docker run hello-world
[scode type="yellow"]docker run 镜像名[/scode]
根据run后面镜像运行一个容器,在运行之前先在自己的本地仓库中查找对应的镜像,找到直接使用,找不到自动取远程仓库下载。
07:Docker镜像中相关操作
辅助命令
docker info
docker version
docker --help || docker
docker [option] command(具体命令)
操作镜像Images的相关命令
查看本地仓库中存在哪些镜像(+名字过滤)
docker images [REPOSITORY] docker images -q (只显示镜像id)
下载新的镜像
docker pull 镜像名称:版本号 或者 docker pull 镜像名:@DIGEST(摘要)
不通过dockerbub,通过命令行搜索需要镜像
docker search mysql
将打包tar镜像文件导入到自己的docker仓库中
docker load -i 文件名
删除镜像
docker image rm REPOSITORY:TAG | ID docker image rm -f REPOSITORY:TAG | ID (强删,把容器也删掉) (简化)docker rmi REPOSITORY:TAG | ID docker rmi -f $(docker images -q) 删除所有镜像和容器
08:容器基本操作
帮助命令
docker run --help
通过镜像运行一个容器
docker run REPOSITORY:TAG | ID
完整运行命令:启动容器 指定名称 后台运行 端口映射(-p xxxx:xxxx可以写多个)
docker run -d(后台运行) -p 宿主机端口:容器端口 --name 别名 REPOSITORY:TAG | ID
例子:
docker run -d -p 3307:3306 --name mymysql mysql:5.7
查看当前运行的容器
docker ps
docker ps -a 查看所有容器(运行 & 非运行) docker ps -q 返回正在运行容器id docker ps -qa 返回所有容器的id
开启/重启/停止/立即停止容器
docker start/restart/stop/kill ID | NAMES
删除容器
docker rm ID | NAMES docker rm -f ID | NAMES (删除正在运行的容器) docker rm -f $(docker ps -aq) (删除所有容器)
查看容器内服务运行的日志
docker logs ID | NAMES docker logs -f ID | NAMES (实时日志) docker logs -tf ID | NAMES (加入时间戳实时日志) docker logs --tail n ID | NAMES (查看容器尾部n行日志)
查看容器内运行的进程
docker top ID | NAMES
产看容器的详细信息与细节
docker inspect ID | NAMES
与容器内部进行交互(进入容器)
docker exec -it ID | NAMES bash (进入容器,并与容器内部命令终端进行交互) exit 退出
操作系统与容器的传输文件
docker cp ID | NAMES : 容器内部资源路径 宿主机中路径 (从容器复制文件到宿主机) docker cp 文件 | 目录 ID | NAMES : 容器内部资源路径 (从宿主机复制文件到容器)
数据卷 Volume
- 作用:
[scode type="blue"]实现宿主机系统与容器之间的文件共享(关联映射)[/scode] 数据卷使用(自定义数据卷目录):
docker run -d -p 8080:8080 --name tomcat01 -v 宿主机路径(绝对):容器内目录 tomcat:8.0-jre
数据卷使用(自动数据卷目录):
docker run -d -p 8080:8080 --name tomcat01 -v aa:容器内目录 tomcat:8.0-jre
- 注意:
[scode type="blue"]1.aa代表一个数据卷名字,名称可以随便写,docker在不存在时自动创建这个数据卷同时自动映射宿主机中某个目录
2.同时在启动容器时会将aa对应容器目录中全部内容复制到aa映射目录中
3.自动创建的目录一般在/var/lib/docker/volumes下[/scode]
[scode type="yellow"]如果你对数据卷中宿主机的文件只进行读操作,建议用自动数据卷目录(主要对数据文件进行保护和备份,例如mysql、redis、es)
如果你需要对数据卷中宿主机的文件进行写操作,建议用自定义数据卷目录[/scode] 将容器打包成一个新的镜像(可以通过docker images来查看)
docker commit -m "描述信息" -a "作者信息" 容器id或名称 打包的镜像名称:标签
生成tar文件
docker save 镜像名:标签 xxxx.tar
数据卷详细
- 数据卷的特点:
[scode type="blue"]数据卷可以在容器之间共享和重用[/scode]
[scode type="blue"]对数据卷的修改会立即影响到对应容器[/scode]
[scode type="blue"]对数据卷的更新修改,不会影响镜像[/scode]
[scode type="blue"]数据卷默认会一直存在,即使容器被删除[/scode] 设置容器对数据卷只读(宿主机可以改变数据卷,容器不可以)
docker run -d -p 8990:8080 --name tomcat -v /root/apps:/usr/local/tomcat/webapps:ro tomcat:8.0-jre8
数据卷相关操作
docker volume ls (查看所有数据卷) docker volume inspect 卷名 (查看某个数据卷的细节) docker volume create 卷名 (创建数据卷) docker volume rm 卷名 (删除某个数据卷) docker volume prune (删除所有未使用的数据卷)