Docker | 安装与使用

148 阅读8分钟

Docker 应用容器引擎

image-20240127121729134.png

Docker是一个开源的应用容器引擎,基于 Go 语言开发并遵循了 Apache2.0 协议开源。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

  • 虚拟化
    • 在计算机中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
    • 在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用。
    • 虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等等。
  • 容器
    • 容器就是将软件打包成标准化单元,以用于开发、交付和部署。是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。

Docker

  1. 使用场景

    • 打包应用程序简化部署
    • 脱离底层硬件任意迁移
  2. 容器优点

    • 灵活:即使是最复杂的应用也可以集装箱化。
    • 轻量级:容器利用共享主机内核。
    • 可互换:即时部署更新和升级。
    • 便捷式:在本地构建、部署到云,任何地方运行。
    • 可扩展:可以增加并自动分发容器副本。
    • 可堆叠:可以垂直和即时堆叠服务。
  3. 底层运行原理

    • Linux 内核容器化支持,Docker 利用了 linux 内核的一些特性,如 cgroups(控制组)、namespace(命名空间)以及文件系统的特殊挂载等技术,实现了容器的隔离和资源控制
    • Docker 基于客户端(容器)---服务端(docker 引擎)结构的系统
    • 客户端(容器)通过 socket(ip + port)向 docker 引擎发送相应的指令,docker 服务器会执行相应的命令
  4. 核心概念

    • 镜像、容器、日志等内容全部默认存储在/var/lib/docker
    • 镜像
      • 容器运行的基础,包含运行应用的程序的所有内容(资源以及配置文件等)
    • 容器
      • 从镜像创建的运行实例
    • 仓库
      • 集中保存镜像的地方(公有docker hub,私有仓库 docker)

Docker 安装

uname -a

yum install -y yum-utils device-mapper-persistent-data lvm2 
# yum-utils 提供了 yum-config-manager 工具
# device mapper,(device-mapper-persistent-data lvm2 提供存储驱动程序)是 linux 内核中支持逻辑卷管理的通用设备映射机制,实现了用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 docker-ce 并设置为开机自动启动 
yum install -y docker-ce docker-ce-cli containerd.io

systemctl start docker.service
systemctl enable docker.service

Docker 卸载

1.卸载 docker 引擎以及删除相关配置和镜像,包括所有容器和镜像。

# 卸载客户端
yum remove docker-ce-cli
# 卸载 docker 引擎以及其所依赖的存储库
yum remove docker-ce docker-ce-cli containerd.io

2.删除所有 docker 安装过程中产生的文件

rm -rf /var/lib/docker

3.卸载完成后,使用如下命令确认是否已经不再运行

service docker status

Docker 设置镜像

mkdir -p /etc/docker
​
tee /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
​
systemctl daemon-reload
systemctl restart docker

Docker 管理

1.查看docker版本信息

docker version

2.docker信息

docker info
[root@bogon ~]# docker info
Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.11.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.21.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0  # 容器数量
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0      # 镜像数量
 Server Version: 24.0.7     # Server 版本
 Storage Driver: overlay2   # docker 使用的是 overlay2 文件驱动
  Backing Filesystem: xfs   # 宿主机上的底层文件系统
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs    # cgroups 驱动
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f
 runc version: v1.1.10-0-g18a0cb0
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-957.el7.x86_64      # 宿主机相关信息
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.683GiB
 Name: bogon
 ID: 0908797b-f4a0-415b-b964-f546ac96b76b
 Docker Root Dir: /var/lib/docker   # 数据存储目录
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
################################ end
# docker 在启动时检测到 linux 内核参数被禁用。这些参数用于在 docker 容器与宿主机之间配置网络桥接。
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

3.解决WARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled

  • 编辑/etc/sysctl.conf文件
    • sudo vi /etc/sysctl.conf
  • 将以下两个内核参数的值设置为 1
    • net.bridge.bridge-nf-call-ip6tables = 1
    • net.bridge.bridge-nf-call-iptables = 1
  • 更改生效。这里没有生效
    • sudo sysctl -p
  • 重启生效

Docker操作

  1. 搜索镜像 docker search nginx

  2. 拉取镜像 docker pull nginx

  3. 查看 /var/lib/docker

    • container 存放容器信息
    • image 存放镜像信息
    • overlay2 存放具体的镜像底层文件
    • 查看下载的镜像文件信息 cat /var/lib/docker/image/overlay2/repositories.json
  4. 查看本地镜像 docker images

    • REPOSITORY 镜像属于的仓库
    • TAG 镜像的标签,标记同一个仓库中的不同镜像
    • IMAGE ID 镜像的唯一ID号
    • CREATED 镜像创建时间
    • VIRTUAL SIZE 镜像大小
  5. 镜像详细信息 docker inspect nginx

  6. 为本地镜像添加新标签 docker tag ngixn:latest nginx:web

  7. 删除镜像docker rmi id

  8. 将镜像保存成为本地文件 docker save -o nginx nginx:latest 默认当前目录

  9. 将镜像文件导入到镜像库中 docker load [-i] 本地存储的镜像名称

  10. 上传到镜像仓库

    • 改标签名 docker tag nginx:lastest 新标签名(robertchao/nginx:web,username在前)
    • 登录 docker login
    • 上传 docker push 标签名
  11. 限制CPU和内存

    • 对于Docker中的容器不加以限制,那么会导致宿主机的负载过大导致宕机的可能,会影响到宿主机的功能。

    • docker container run --help memory

    • 配置容器最大使用内存 --memory bytes

    • 配置磁盘内存存储大小 --memory-swap

    • 设置容器不被kill --oom-kill-disable false

      • 容器在使用内存超过限制之后,docker有权利将容器杀死,但有些容器服务很重要,不能被杀死
    • 最大使用CPU核数 --cpus 1

    • 最大使用CPU核数区间 --cpuset-cpus '0-1'

    • CPU相对权重 --cpu-shares 30 设置使用30%CPU

Docker管理容器

  1. 创建容器

    • 将镜像加载到容器的过程,新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进城来启动程序。

    • docker create [options] 镜像

      • -i : 容器开启标准输入
      • -t : 分配一个终端
      • -it : 实现和容器交互的作用,运行一个交互式会话 shell
      • docker create -it nginx:latest
  2. 管理容器

    • 开启或关闭容器
    • docker start/stop 容器ID
  3. 创建并启动

    • docker run
  4. docker 的生命周期

    • create : 已创建还未运行的容器

    • running : 正在运行中的容器

    • restarting : 容器正在重启中

    • removing : 容器正在迁移中

    • paused : 容器已暂停状态

    • exited : 停止容器运行

    • dead : 操作系统出现的异常或断点导致

    • 暂停和停止的区别:

      • paused : 命令挂起指定的容器中的所有进程为暂停
      • stop : 杀掉正在运行的docker容器,默认是 10s 后
  5. 进入容器

    • docker exec -it 容器ID /bin/bash
  6. 拷贝文件

    • 复制到容器中

      • docker cp 文件路径 容器ID:文件路径
    • 从容器复制到宿主机

      • docker cp 容器ID:文件路径 文件路径
  7. 容器的导出与导入

    • 导出 docker export 容器ID/名称 > 文件名
    • 导入 cat 文件名 | docker import - 镜像名称:标签
  8. 删除容器

    • docker stop 容器ID
    • docker rm 容器ID #删除已经终止状态的容器
    • docker rm -f 容器ID #强制删除正在运行的容器
  9. 批量操作

# 批量停止容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash     
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
​
# 批量删除所有容器
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash          
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm# 批量删除镜像
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash  
​
# 删除none镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi    
​
# 批量清理后台停止的容器
docker rm $(docker ps -a -q)