zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Docker 常用命令使用

Docker 常用命令 使用
2023-09-11 14:22:11 时间

目录

一、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

yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo	
yum install docker-ce docker-ce-cli containerd.io -y
vi /etc/docker.daemon.json
{
    "registry-mirrors": ["https://tpqjuvmc.mirror.aliyuncs.com"]
}
# 
systemctl enable docker
systemctl start docker
systemctl status docker

docker info

1.6镜像获取

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

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

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


二、Docker镜像管理


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

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

2.1 镜像和容器的关系

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

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

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

## 容器导出
[root@localhost ~]# docker export fd2f66e335c2 > nginx.tar
[root@localhost ~]# ll
total 132440
-rw-------. 1 root root      1479 May 17 17:48 anaconda-ks.cfg
-rw-r--r--  1 root root 135611392 May 24 03:25 nginx.tar
[root@localhost ~]#
[root@localhost ~]#
## 文件复制到 容器的 /opt 目录下
[root@localhost ~]# docker cp nginx.tar web:/opt
[root@localhost ~]#
## 进入容器
[root@localhost ~]# docker exec -it web bash
root@fd2f66e335c2:/# ls /opt/
nginx.tar
root@fd2f66e335c2:/#

2.2 镜像存储位置

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

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

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

改动 docker 配置文件

​
# [方式一] 改动docker启动配置文件
$ sudo vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph=/data/docker/

# [方式二] 改动docker启动配置文件
$ sudo vim /etc/docker/daemon.json
{
    "live-restore": true,
    "graph": [ "/data/docker/" ]
}

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

2.3 镜像是什么

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

2.4 管理镜像常用的命令

2.4.1查看镜像管理命令

使用 help 查看命令的使用

2.4.2history镜像历史

2.4.3inspect镜像的详细信息

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

 2.4.4拉取Nginx镜像并删除

1. 删除所有镜像 
docker rmi $(docker images -q)

2. 删除所有容器
docker stop $(docker ps -a -q)
docker  rm $(docker ps -a -q)

2.4.5镜像save 导出 和load上载

[root@offline-client docker]# docker save -o mysql:5.7.19.tar  mysql:5.7.19
[root@offline-client docker]# ll
total 409904
-rw------- 1 root root 419739136 May 14 18:54 mysql:5.7.19.tar
[root@offline-client docker]# docker rmi mysql:5.7.19
[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 创建一个容器常用命令

[root@offline-client mysql]# docker run -itd -p 13306:3306 -m="1024M" --privileged=true \
> -v /opt/mysql/conf/my.cnf:/etc/my.cnf \
> -v /opt/mysql/data:/var/lib/mysql \
> -v /opt/mysql/log:/var/log \
> -v /opt/mysql/mysql-files:/var/lib/mysql-files \
> -e MYSQL_ROOT_PASSWORD=123456 --name=mysql_hue mysql:5.7.19
8a860ca596c82c3836f72f8b4758967f16345e30c329a2570eacb89d17bb517f
[root@offline-client mysql]# 
[root@offline-client mysql]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                         NAMES
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
9fc0e2cfe1bd   gethue/hue     "./startup.sh"           23 hours ago     Up 23 hours     0.0.0.0:8888->8888/tcp, :::8888->8888/tcp     hue01
[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

[root@offline-client docker]# docker run -itd -m="100M" --name=web nginx:1.17
ecfd8658c9c2c03d6c8f16870abb00f6e461160d825d9934c42dde371218634c
[root@offline-client docker]# 
[root@offline-client docker]# docker stats web
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
ecfd8658c9c2   web       0.00%     1.379MiB / 100MiB   1.38%     656B / 0B   0B / 0B     2

[root@offline-client docker]# docker run -itd  --name=web nginx:1.17
1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
[root@offline-client docker]# 
[root@offline-client docker]# 
### 没有做任何的限制,可以使用宿主机上的所有资源
[root@offline-client docker]# docker stats web

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS
1be2ee3f9778   web       0.00%     1.379MiB / 10.59GiB   0.01%     656B / 0B   0B / 0B     2

3.3 容器配置扩容

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

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

[root@offline-client docker]# docker run -itd  --name=web nginx:1.17
1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
[root@offline-client docker]# 
[root@offline-client docker]# docker stats web

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS
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标准来创建和运行容器。

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