• Docker 常用命令使用


    目录

    一、Docker简介

    1.1Docker 是什么

    1.2Docker应用场景

    1.3Docker基本组成

    1.4容器VS虚拟机

    1.5 Docker 安装

    1.6镜像获取

    二、Docker镜像管理

    2.1 镜像和容器的关系

    2.2 镜像存储位置

    2.3 镜像是什么

    2.4 管理镜像常用的命令

    2.4.1查看镜像管理命令

    2.4.2history镜像历史

    2.4.3inspect镜像的详细信息

     2.4.4拉取Nginx镜像并删除

    2.4.5镜像save 导出 和load上载

    2.5 联合文件系统(UnionFS)

    2.6 写时复制(cow)

     三、Docker容器管理

    3.1 创建一个容器常用命令

    3.2 容器资源限制

    3.3 容器配置扩容

    3.4管理容器常用的命令

    3.5 容器核心实现技术简介

    3.5.1 容器实现核心技术:Namespace

    3.5.2容器实现核心技术:CGroups

    3.5.3Docker 核心组件的关系


    一、Docker简介


    1.1Docker 是什么

    • 使用广泛的开源容器引擎
    • 一种进程级的虚拟化技术
    • 依赖于Linux内核技术:Namespace(资源隔离)和cgroups(资源限制)
    • 简单的应用程序打包工具

    1.2Docker应用场景

    • 应用程序的打包和发布
    • 应用程序隔离
    • 持续集成
    • 部署微服务
    • 快速搭建测试环境
    • 提供PaaS产品(平台即服务)

    1.3Docker基本组成

    1.4容器VS虚拟机

    1.5 Docker 安装

    官方地址:Docker Documentation | Docker Documentation

    CentOS安装地址:Install Docker Engine on CentOS | Docker Documentation

    1. yum install -y yum-utils
    2. yum-config-manager \
    3. --add-repo \
    4. https://download.docker.com/linux/centos/docker-ce.repo
    5. yum install docker-ce docker-ce-cli containerd.io -y
    6. vi /etc/docker.daemon.json
    7. {
    8. "registry-mirrors": ["https://tpqjuvmc.mirror.aliyuncs.com"]
    9. }
    10. #
    11. systemctl enable docker
    12. systemctl start docker
    13. systemctl status docker

    docker info

    1.6镜像获取

    Docker Hub 是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认公共镜像下载镜像地址 https://hub.docker.com

    配置镜像加速器和harbor 仓库地址

    1. [root@offline-client ~]# cat /etc/docker/daemon.json
    2. {
    3. "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
    4. "insecure-registries": ["winner-test.harbor.com"]
    5. }


    二、Docker镜像管理


           Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

            image 是二进制文件。实际开发中,一个image 文件往往通过继承另一个image文件(镜像层共享),加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入Apache服务器,形成你的 image。

    2.1 镜像和容器的关系

    1. # 拉取nginx镜像
    2. docker pull nginx
    3. # 对nigix镜像,创建web1容器
    4. docker run -d --name web1 nginx

    镜像拉取、启动、查看容器 

    容器导出 、文件复制到容器内部

    1. ## 容器导出
    2. [root@localhost ~]# docker export fd2f66e335c2 > nginx.tar
    3. [root@localhost ~]# ll
    4. total 132440
    5. -rw-------. 1 root root 1479 May 17 17:48 anaconda-ks.cfg
    6. -rw-r--r-- 1 root root 135611392 May 24 03:25 nginx.tar
    7. [root@localhost ~]#
    8. [root@localhost ~]#
    9. ## 文件复制到 容器的 /opt 目录下
    10. [root@localhost ~]# docker cp nginx.tar web:/opt
    11. [root@localhost ~]#
    12. ## 进入容器
    13. [root@localhost ~]# docker exec -it web bash
    14. root@fd2f66e335c2:/# ls /opt/
    15. nginx.tar
    16. root@fd2f66e335c2:/#

    2.2 镜像存储位置

     默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下,默认系统盘符需修改

    • 迁移 docker 的存储目录,或者对 /var 设备进行扩容来达到相同的目的。更多关于 dockerd 的详细参数,请点击查看 官方文档 地址。

    • 但是需要注意的一点就是,尽量不要用软链, 因为一些 docker 容器编排系统不支持这样做,比如我们所熟知的 k8s 就在内

    改动 docker 配置文件

    1. # [方式一] 改动docker启动配置文件
    2. $ sudo vim /lib/systemd/system/docker.service
    3. ExecStart=/usr/bin/dockerd --graph=/data/docker/
    4. # [方式二] 改动docker启动配置文件
    5. $ sudo vim /etc/docker/daemon.json
    6. {
    7. "live-restore": true,
    8. "graph": [ "/data/docker/" ]
    9. }

    修改 service 启动的配置文件, 重新使用 docker info 检查 是否修改成功。 

    2.3 镜像是什么

    • 一个分层存储的文件,不是一个单一的文件
    • 一个软件的环境
    • 一个镜像可以创建多个容器
    • 一种标准化的交付
    • 一个不包含Linux内核而又精简的Linux 操作系统

    2.4 管理镜像常用的命令

    2.4.1查看镜像管理命令

    使用 help 查看命令的使用

    2.4.2history镜像历史

    2.4.3inspect镜像的详细信息

    1. ### 镜像的详细信息 打印一堆
    2. [root@localhost ~]# docker inspect nginx

     2.4.4拉取Nginx镜像并删除

    1. 1. 删除所有镜像
    2. docker rmi $(docker images -q)
    3. 2. 删除所有容器
    4. docker stop $(docker ps -a -q)
    5. docker rm $(docker ps -a -q)

    2.4.5镜像save 导出 和load上载

    1. [root@offline-client docker]# docker save -o mysql:5.7.19.tar mysql:5.7.19
    2. [root@offline-client docker]# ll
    3. total 409904
    4. -rw------- 1 root root 419739136 May 14 18:54 mysql:5.7.19.tar
    5. [root@offline-client docker]# docker rmi mysql:5.7.19
    6. [root@offline-client docker]# docker load -i mysql:5.7.19.tar

    2.5 联合文件系统(UnionFS)

    镜像怎么高效存储?

          难道像虚拟机一样一个容器对应一个独立的镜像文件,这样对于密集型容器,磁盘占用率太大,所以docker引入了联合文件系统,将镜像多层文件联合挂载到容器文件系统。

    类似于创建软连接

    容器层提供一个独立的运行环境。

    2.6 写时复制(cow)

           镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,那该怎么办?

           为此,引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写得文件复制到自己的文件系统中进行修改,基于容器修改不会影响基础镜像。

     


    三、Docker容器管理


    3.1 创建一个容器常用命令

    1. [root@offline-client mysql]# docker run -itd -p 13306:3306 -m="1024M" --privileged=true \
    2. > -v /opt/mysql/conf/my.cnf:/etc/my.cnf \
    3. > -v /opt/mysql/data:/var/lib/mysql \
    4. > -v /opt/mysql/log:/var/log \
    5. > -v /opt/mysql/mysql-files:/var/lib/mysql-files \
    6. > -e MYSQL_ROOT_PASSWORD=123456 --name=mysql_hue mysql:5.7.19
    7. 8a860ca596c82c3836f72f8b4758967f16345e30c329a2570eacb89d17bb517f
    8. [root@offline-client mysql]#
    9. [root@offline-client mysql]# docker ps -a
    10. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    11. 8a860ca596c8 mysql:5.7.19 "docker-entrypoint.s…" 17 seconds ago Up 17 seconds 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp mysql_hue
    12. 9fc0e2cfe1bd gethue/hue "./startup.sh" 23 hours ago Up 23 hours 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp hue01
    13. [root@offline-client mysql]# ls

    -i : interface 交互

    -t : terminal 终端

    -d : detach 后台运行

    -p : publis 宿主机端口映射,如上执行MySQL的端口为 13306

    -m : memory容器运行内存

    -v : volume 挂载一个路径,相当于软连接

    -e : env指定容器内的环境变量

    --name 容器命名

    3.2 容器资源限制

    默认创建的容器使用宿主机所有的资源

    创建一个web容器 ,memory 限制最大100M

    1. [root@offline-client docker]# docker run -itd -m="100M" --name=web nginx:1.17
    2. ecfd8658c9c2c03d6c8f16870abb00f6e461160d825d9934c42dde371218634c
    3. [root@offline-client docker]#
    4. [root@offline-client docker]# docker stats web
    5. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    6. ecfd8658c9c2 web 0.00% 1.379MiB / 100MiB 1.38% 656B / 0B 0B / 0B 2
    7. [root@offline-client docker]# docker run -itd --name=web nginx:1.17
    8. 1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
    9. [root@offline-client docker]#
    10. [root@offline-client docker]#
    11. ### 没有做任何的限制,可以使用宿主机上的所有资源
    12. [root@offline-client docker]# docker stats web
    13. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    14. 1be2ee3f9778 web 0.00% 1.379MiB / 10.59GiB 0.01% 656B / 0B 0B / 0B 2

    3.3 容器配置扩容

    容器配置更新,从下面的命令可以看出容器的cpu 和内存是可以动态更新的。

     资源分配测试, 不错内存限制  ,使用 宿主机的全部内存

    1. [root@offline-client docker]# docker run -itd --name=web nginx:1.17
    2. 1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
    3. [root@offline-client docker]#
    4. [root@offline-client docker]# docker stats web
    5. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    6. 1be2ee3f9778 web 0.00% 1.379MiB / 10.59GiB 0.01% 656B / 0B 0B / 0B 2

     内存改小 好像不行


    分配实践后得出:大改小不行,小改大可以内存分配实践后得出:大改小不行,小改大可以

    3.4管理容器常用的命令

    3.5 容器核心实现技术简介

    3.5.1 容器实现核心技术:Namespace

    在容器化中,一台物理计算机可以运行多个不同操作系统,那就需要解决“隔离性”,彼此感知不到对方存在,互不影响。

    Linux内核从2.4.19版本引入了namespace概念,其目的是将特定的全局系统资源通过抽象的方法使得namespace中的进程看起来拥有自己隔离的资源。Docker就是借助这个机制实现容器资源隔离。

    • IPC:隔离进程间通信
    • MOUNT:隔离文件系统挂载点
    • NET:隔离网络协议栈
    • PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
    • USER:隔离用户

    3.5.2容器实现核心技术:CGroups

            Docker利用 namespace 实现容器之间资源隔离,但是namespace 不能实现对容器资源限制,比如CPU、内存。如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。

    如何对多个容器的资源使用进行限制就成了容器化的主要问题。

    解决:引入 Control Groups(简称CGroups),限制容器资源

    CGroups: 所有的任务就是运行在系统中的一个进程,而 CGroups 以某种标准将一组进程为目标进行资源分配和控制。

    例如:CPU、内存、带宽等,并且可以动态设置。

    CGroups 主要功能:

    • 限制进程组使用的资源数量(Resource limitation): 可以为进程组设定资源使用上限,例如内存
    • 进程组优先级控制(Prioritization): 可以为进程组分配特定CPU、磁盘IO吞吐量
    • 记录进程组使用的资源数量(Accounting): 例如使用记录某个进程组使用的CPU时间
    • 进程组控制(Control): 可以将进程组挂起和恢复

    3.5.3Docker 核心组件的关系

    • Docker Daemo: Dokcer 守护进程,负责与Docker Client交互,并管理镜像、容器。
    • Containerd: 是一个守护进程,向上给Docker Daemon提供接口,向下通过containerd-shim结合runC管理容器。
    • runC: 一个命令行工具,它根据OCI标准来创建和运行容器。

    --------------------------- 感谢点赞!------------------------------------

     

  • 相关阅读:
    java--进制详解
    起飞前检查
    力扣每日一题 6/28 动态规划/数组
    肖sir___面试就业课程____python
    漫谈Web3的实现之路:组织形式、产品形态和技术发展
    顺丰、菜鸟“较劲”末端物流
    学过的汇编指令整合
    Kafka系列之:安装具有安全认证的kafka-2.8.2分布式集群
    cuda-gdb 支持内置变量的实现机制
    CSS悬停卡片翻转明信片效果源码附注释
  • 原文地址:https://blog.csdn.net/qq_35995514/article/details/125470021