Docker 学习
一、Docker的基本组成
1.1 镜像(image)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
1.2 容器(container)
1 从面向对象角度
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
2 从镜像容器角度
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
1.3 仓库(repository)
仓库(Repository)是集中存放镜像文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
二、Docker的安装
略
参考:
三、Docker的常用命令
3.1 帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
3.2 镜像命令
docker images: 列出本地主机上的镜像
docker search 某个XXX镜像名字 :从镜像源查找镜像
docker pull 某个XXX镜像名字 [:TAG] :下载镜像 (没有TAG就是最新版)
docker system df :查看镜像/容器/数据卷所占的空间
docker rmi 某个XXX镜像名字ID :删除镜像 删除单个 docker rmi -f 镜像ID 删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除全部 docker rmi -f $(docker images -qa)
3.3 容器命令
有镜像才能创建容器, 这是根本前提
3.3.1 新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字" 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; 也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P随机映射,小写p 指定端口映射
例子:
使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令: docker run -it centos /bin/bash
3.3.2 列出当前所有正在运行的容器
docker ps [OPTIONS]
3.3.3 退出容器
exit
: run进去容器,exit退出,容器停止ctrl+p+q
: run进去容器,ctrl+p+q退出,容器不停止
3.3.4 启动已停止运行的容器
- docker start 容器ID或者容器名
3.3.5 重启容器
- docker restart 容器ID或者容器名
3.3.6 停止容器
- docker stop 容器ID或者容器名
3.3.7 强制停止容器
- docker kill 容器ID或容器名
3.3.8 删除已停止的容器
docker rm 容器ID
一次性删除多个容器实例
- docker rm -f $(docker ps -a -q)
- docker ps -a -q | xargs docker rm
3.4 强调重要命令
3.4.1 启动守护式容器(后台服务器)
- docker run -d 容器名
3.4.2 查看容器日志
- docker logs 容器ID
3.4.3 查看容器内运行的进程
- docker top 容器ID
3.4.4 查看容器内部细节
- docker inspect 容器ID
3.4.5 进入正在运行的容器并以命令行交互
- docker exec -it 容器ID /bin/bash
exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
- docker attach 容器ID (不推荐)
attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
3.4.6 从容器内拷贝文件到主机上
- docker cp 容器ID:容器内路径 目的主机路径
3.4.7 导入和导出容器
导出容器的内容留作为一个tar归档文件
- docker export 容器ID > 文件名.tar
从tar包中的内容创建一个新的文件系统再导入为镜像
- cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
六、DockerFile
五、Docker网络
六、Docker-compose容器编排
Docker-Compose是Docker官方的开源项目, 负责实现对Docker容器集群的快速编排。
docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?
如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具
例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose核心概念
一文件 docker-compose.yml
两要素 服务(service)
- 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器 工程(project)
- 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose使用的三个步骤
编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
Compose常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml 文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程