docker镜像、容器、仓库介绍

docker

docker介绍

官网

Docker 是一种开源的容器化平台,用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为"容器"的单一包中,使得应用能够在任何环境下运行,不受底层系统的限制。Docker提供了一种标准化的软件交付方式,使得应用在开发、测试和生产环境中的运行更加一致。

Docker的核心概念

  • 镜像(Image):Docker镜像是容器的"模板",包含了操作系统、应用程序以及相关依赖库。镜像是只读的,用于创建和运行容器。

  • 容器(Container):容器是镜像的一个运行实例,是一个隔离的进程环境,拥有独立的文件系统、网络等资源。一个镜像可以创建多个容器,每个容器之间是相互隔离的。

  • Dockerfile:Dockerfile是一个文本文件,定义了如何构建Docker镜像。它包含了一系列指令,用于描述镜像的构建步骤,例如选择基础镜像、安装依赖、复制文件、设置环境变量等。

  • 仓库(Registry):Docker仓库用于存储和分发Docker镜像,类似于代码的版本控制系统。Docker Hub是官方的公共镜像仓库,用户也可以搭建私有仓库。

Docker的底层架构与组件

Docker的底层架构主要由以下几个核心组件组成:

Docker Daemon(守护进程):

  • Docker Daemon是Docker的后台进程,负责管理容器的生命周期、构建和运行镜像。它接受客户端(CLI)命令并执行相应操作。

Docker CLI:

  • Docker CLI是Docker的命令行界面,用于与Docker Daemon进行通信,执行容器的启动、停止、删除等操作。

Containerd:

  • Containerd是一个容器管理的守护进程,负责管理容器的生命周期。它是Docker的一部分,但也可以作为独立组件使用,直接与OCI(Open Container Initiative)兼容。

RunC:

  • RunC是一个轻量级的、符合OCI标准的容器运行时工具。RunC的核心作用是创建和启动容器,通过Namespace、Cgroups等
  • Linux内核特性实现容器的隔离与资源控制。

Libnetwork:

  • Libnetwork是Docker的网络管理库,用于处理容器的网络连接,包括创建虚拟网络、网络隔离等操作。
    图像和存储管理:

Docker支持多种存储驱动(如OverlayFS、AUFS、Device Mapper等),用于管理镜像的分层存储结构。每一层只保存了增量数据,这种分层存储可以提高资源利用率并减少冗余。

Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护程序通信,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API、通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许使用由一组容器组成的应用程序。

Docker的底层原理

Docker的底层原理主要依赖于Linux内核的几个关键技术,包括Namespace、Cgroups、Union File System等,这些技术实现了容器的隔离、资源管理和文件系统支持。

  1. Namespace(命名空间)

    Namespace是Linux内核提供的资源隔离技术,它允许系统资源(如进程ID、网络、文件系统等)被隔离到独立的命名空间中。不同命名空间内的资源是相互独立的,从而使得一个容器中的进程无法影响另一个容器中的进程。Docker主要使用了以下几种Namespace:

    • PID Namespace:隔离进程ID,使得每个容器中的进程彼此独立。
      NET Namespace:隔离网络资源,如网卡、IP地址、端口等,使得容器拥有独立的网络栈。
      IPC Namespace:隔离进程间通信(如信号、消息队列等),确保容器间通信安全。
      Mount Namespace:隔离文件系统挂载点,每个容器可以拥有独立的文件系统视图。
      UTS Namespace:隔离主机名和域名,使得容器可以设置自己的主机名。
  2. Cgroups(Control Groups)

    Cgroups是Linux内核提供的资源管理功能,可以限制和隔离进程组使用的资源(如CPU、内存、磁盘I/O等)。在Docker中,Cgroups用于限制每个容器的资源使用,确保系统稳定。比如,可以设置一个容器的CPU最大使用率不超过50%、内存不超过1GB等,从而避免单个容器过度占用资源影响其他容器。

  3. Union File System(联合文件系统)

    Docker的镜像由多层只读层叠加而成,这种分层结构依赖于Union File System的支持。常见的联合文件系统有AUFS、OverlayFS等。每层镜像都只记录了文件系统的增量,只有在容器运行时创建一个可写层。分层文件系统使得镜像可以高效共享、重复利用,提高了存储空间的利用率。

  4. 容器镜像的分层结构与存储管理

    Docker镜像的分层结构使得不同镜像可以共享相同的底层资源。在镜像构建时,Docker会为每个操作创建一个新的层,这些层按顺序叠加构成完整的镜像。在容器启动时,Docker会在镜像的顶部添加一个可写层,即"容器层",以便容器可以对文件系统进行读写操作。

Docker的运行流程

构建镜像:根据Dockerfile构建镜像,镜像分为多个只读层,每层对应Dockerfile的一条指令。

启动容器:从镜像创建容器实例,并为容器创建一个可写层。

隔离资源:启动容器时,Docker通过Namespace隔离容器的进程、网络、文件系统等资源。

分配资源:Docker通过Cgroups为容器分配资源,并监控其资源使用情况。

容器网络:Docker使用Libnetwork为容器创建网络连接,实现容器间通信和网络隔离。

文件系统管理:Docker使用联合文件系统挂载镜像层,并为容器提供可写层。

Docker的优势与应用场景

一致性:Docker打包了应用和依赖,确保在不同环境中运行的一致性,解决了"运行在我电脑上"的问题。

资源高效:相比虚拟机,容器不需要完整的操作系统和硬件模拟,启动速度快,资源占用少。

弹性伸缩:通过编排工具(如Kubernetes)管理容器集群,容器化应用易于实现水平扩展和自动恢复。

快速交付:Docker简化了软件的开发、测试、部署流程,使得开发、测试、运维团队之间的协作更加高效。

容器与虚拟机 (VM)

简单来说,虚拟机是一个完整的操作系统,拥有自己的内核、硬件驱动程序、程序和应用程序。启动虚拟机只是为了隔离单个应用程序,这会带来很大的开销。

容器只是一个独立的进程,其中包含运行所需的所有文件。如果运行多个容器,它们都共享同一个内核,这样您就可以在更少的基础设施上运行更多的应用程序。

结合使用虚拟机和容器

容器和虚拟机经常一起使用。例如,在云环境中,配置的机器通常是虚拟机。但是,具有容器运行时的虚拟机可以运行多个容器化应用程序,而不是配置一台机器来运行一个应用程序,从而提高资源利用率并降低成本。

容器和镜像的关系

容器是一个独立的进程,它从哪里获取文件和配置?如何共享这些环境?这就是容器镜像发挥作用的地方!容器镜像是一个标准化包,其中包含运行容器所需的所有文件、二进制文件、库和配置。

对于 PostgreSQL映像,该映像将打包数据库二进制文件、配置文件和其他依赖项。对于 Python Web 应用,它将包括 Python 运行时、应用代码及其所有依赖项。

镜像有两个重要原则:

  • 镜像是不可变的。镜像一旦创建,就无法修改。只能创建新镜像或在其上添加更改。

  • 容器镜像由层组成。每层代表一组添加、删除或修改文件的文件系统更改。

可以理解为镜像就是一个流水线工厂,容器就是最终加工出来的产品

docker镜像命令

安装docker:Ubuntu2410使用阿里源安装最新docker

bash 复制代码
apt -y install apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

apt-get -y install docker-ce
bash 复制代码
systemctl enable --now docker
bash 复制代码
root@huhy:~# docker version
Client: Docker Engine - Community
 Version:           27.3.1
 API version:       1.47
 Go version:        go1.22.7
 Git commit:        ce12230
 Built:             Fri Sep 20 11:40:42 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.3.1
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.22.7
  Git commit:       41ca978
  Built:            Fri Sep 20 11:40:42 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.22
  GitCommit:        7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
 runc:
  Version:          1.1.14
  GitCommit:        v1.1.14-0-g2c9f560
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker 使用 Linux 内核的 iptables 机制来处理容器的网络通信和地址转发。因此需要启用参数

加载 br_netfilter 内核模块。这是一个负责管理桥接网络过滤的模块

bash 复制代码
modprobe br_netfilter
bash 复制代码
vi /etc/sysctl.conf
bash 复制代码
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
bash 复制代码
root@huhy:~# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
  • 搜索镜像:docker search
    可以指定全称,不然就返回包含名称的所有镜像
bash 复制代码
root@huhy:~# docker search centos
NAME                           DESCRIPTION                                     STARS     OFFICIAL
centos                         DEPRECATED; The official build of CentOS.       7756      [OK]
centos/postgresql-10-centos7   PostgreSQL is an advanced Object-Relational ...   20
centos/httpd-24-centos8                                                        3
corpusops/centos               centos corpusops baseimage                      0
centos/systemd                 systemd enabled base container.                 115
centos/redis-5-centos8                                                         0
centos/postgresql-96-centos7   PostgreSQL is an advanced Object-Relational ...   45
centos/mariadb-102-centos7     MariaDB 10.2 SQL database server                6
centos/postgresql-10-centos8                                                   0
centos/mysql-80-centos8                                                        0
centos/mongodb-36-centos7      MongoDB NoSQL database server                   12
centos/nginx-112-centos7       Platform for running nginx 1.12 or building ...   16
centos/mariadb-103-centos8                                                     2
centos/postgresql-12-centos8                                                   0
centos/mysql-57-centos7        MySQL 5.7 SQL database server                   95
centos/mariadb-101-centos7     MariaDB 10.1 SQL database server                13
centos/mysql-56-centos7        MySQL 5.6 SQL database server                   23
centos/httpd-24-centos7        Platform for running Apache httpd 2.4 or bui...   46
centos/redis-32-centos7        Redis in-memory data structure store, used a...   6
centos/redis-5-centos7         Redis in-memory data structure store, used a...   0
centos/ruby-25-centos7         Platform for building and running Ruby 2.5 a...   3
centos/postgresql-12-centos7   PostgreSQL is an advanced Object-Relational ...   5
centos/php-56-centos7          Platform for building and running PHP 5.6 ap...   34
centos/postgresql-94-centos7   PostgreSQL is an advanced Object-Relational ...   16
centos/nginx-18-centos7        Platform for running nginx 1.8 or building n...   14
  • 拉取镜像:docker pull
    需要指定版本,否则默认拉取最新版本的镜像
bash 复制代码
root@huhy:~# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
root@huhy:~#
  • 查看镜像:docker images
    获取镜像的名称大小,版本、id等信息
bash 复制代码
root@huhy:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   3 years ago   231MB
  • 删除镜像:docker rmi
    通过名称或者id都可以删除:需要注意的是,删除的镜像是不能有已经启动过的容器实例,不然会失败
bash 复制代码
root@huhy:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   3 years ago   231MB
root@huhy:~# docker rmi centos
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
  • 批量删除镜像
    通过组合命令使用,先执行查看镜像,然后删除查看到的镜像
bash 复制代码
root@huhy:~# docker rmi $(docker images)
Untagged: redis:latest
Untagged: redis@sha256:a06cea905344470eb49c972f3d030e22f28f632c1b4f43bbe4a26a4329dd6be5
Deleted: sha256:f02a7f56692880b88d5fabe631da5547ae1d8c30d7050c3d004347a9fa5e5a3c
Deleted: sha256:685583ae93732862468e2a7edba217ed8165dfc730c363c30bb9405c4c81aac5
Deleted: sha256:fd8efb49fd2763acfd6a07881e62713a246858a4cdfe4b9a31c9cb3336a9c710
Deleted: sha256:3895fdb072213028eed326869c37d52d4b4003c6b0d0b4e6faf57bf18e5d439a
Deleted: sha256:7c9bf6b85511bdf143188f915e200ff94b46dc75d6d218845a939bfa8701f1e2
Deleted: sha256:ba40754911b8313098bdacb32d5044d6105f72a3b9cfe4a9ea16b8f05861614d
Deleted: sha256:93588577b39273261aea628c7f6aab541a86ff37e1f2674ee421300a2ff34d02
Deleted: sha256:1408254577b9d64420dcf7d4ba1b0df9a3ddd7a29d3d4736ad2ff4672baf4a8a
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
Untagged: nginx:latest
Untagged: nginx@sha256:28402db69fec7c17e179ea87882667f1e054391138f77ffaf0c3eb388efc3ffb
Deleted: sha256:3b25b682ea82b2db3cc4fd48db818be788ee3f902ac7378090cf2624ec2442df
Deleted: sha256:3e8a4396bcdb62aeb916ec1e4cf64500038080839f049c498c256742dd842334
Deleted: sha256:8dd6a711fbdd252eba01f96630aa132c4b4e96961f09010fbbdb11869865f994
Deleted: sha256:9368c52198f80c9fb87fc3eaf7770afb7abb3bfd4120a8defd8a8f1a68ff375d
Deleted: sha256:46834c975bf2d807053675d76098806736ee94604c650aac5fe8b5172ab008c8
Deleted: sha256:6e433330e8b1553bee0637fac3b1e66c994bb2c0cab7b2372d2584171d1c93d8
Deleted: sha256:fbc611fa4a4aff4cf0bfd963c49e2c416ff8047c9f84c2dc9328d3b833f1118d
Deleted: sha256:98b5f35ea9d3eca6ed1881b5fe5d1e02024e1450822879e4c13bb48c9386d0ad
  • 清理镜像:docker image prune
    默认情况下,docker image prune 只会删除 未被任何容器使用 的镜像。
    使用 -a 标志,删除所有没有标签的镜像。
bash 复制代码
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tmt          v1        f77539e7e45f   2 weeks ago   467MB
tomcat       latest    f77539e7e45f   2 weeks ago   467MB
nginx        latest    3b25b682ea82   7 weeks ago   192MB
root@huhy:/opt# docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: tmt:v1
untagged: tomcat:latest
deleted: sha256:f77539e7e45f7c6337c681589fe18ee6407640e4066c450fcfb8c6a4ba5575b2
untagged: nginx:latest
deleted: sha256:3b25b682ea82b2db3cc4fd48db818be788ee3f902ac7378090cf2624ec2442df
deleted: sha256:3e8a4396bcdb62aeb916ec1e4cf64500038080839f049c498c256742dd842334
deleted: sha256:8dd6a711fbdd252eba01f96630aa132c4b4e96961f09010fbbdb11869865f994
deleted: sha256:9368c52198f80c9fb87fc3eaf7770afb7abb3bfd4120a8defd8a8f1a68ff375d
deleted: sha256:46834c975bf2d807053675d76098806736ee94604c650aac5fe8b5172ab008c8
deleted: sha256:6e433330e8b1553bee0637fac3b1e66c994bb2c0cab7b2372d2584171d1c93d8
deleted: sha256:fbc611fa4a4aff4cf0bfd963c49e2c416ff8047c9f84c2dc9328d3b833f1118d
deleted: sha256:98b5f35ea9d3eca6ed1881b5fe5d1e02024e1450822879e4c13bb48c9386d0ad

Total reclaimed space: 191.7MB
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
root@huhy:/opt#
  • 保存镜像:docker save
    o, --output:指定保存的 tar 文件的名称或路径。默认为标准输出

保存单个镜像

bash 复制代码
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    f77539e7e45f   2 weeks ago   467MB
nginx        latest    3b25b682ea82   7 weeks ago   192MB
root@huhy:/opt# docker save -o nginx.tar nginx:latest
root@huhy:/opt# ls
nginx.tar
root@huhy:/opt#

保存两个镜像

bash 复制代码
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    f77539e7e45f   2 weeks ago   467MB
nginx        latest    3b25b682ea82   7 weeks ago   192MB
root@huhy:/opt# docker save -o image.tar nginx:latest tomcat:latest
root@huhy:/opt# ls
image.tar

批量保存所有镜像到一个压缩包里面

bash 复制代码
#!/bin/bash

# 设置输出文件名称
output_file="all_docker_images.tar"

# 获取所有镜像名称和标签
images=$(docker images --format "{{.Repository}}:{{.Tag}}")

# 打包所有镜像
echo "正在将以下镜像保存到 $output_file:"
echo "$images"
docker save -o "$output_file" $images

echo "所有镜像已保存到 $output_file"
bash 复制代码
root@huhy:/opt# vi images.sh
iroot@huhy:/opt# bash images.sh
正在将以下镜像保存到 all_docker_images.tar:
tomcat:latest
nginx:latest
所有镜像已保存到 all_docker_images.tar
root@huhy:/opt# ls
all_docker_images.tar  images.sh
root@huhy:/opt#
  • 导入镜像:docker load
    -i, --input:指定要加载的 tar 文件路径
bash 复制代码
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
root@huhy:/opt# docker load -i all_docker_images.tar
Loaded image: tomcat:latest
98b5f35ea9d3: Loading layer [==================================================>]  77.83MB/77.83MB
b33db0c3c3a8: Loading layer [==================================================>]  117.9MB/117.9MB
63d7ce983cd5: Loading layer [==================================================>]  3.584kB/3.584kB
296af1bd2844: Loading layer [==================================================>]  4.608kB/4.608kB
8ce189049cb5: Loading layer [==================================================>]   2.56kB/2.56kB
6ac729401225: Loading layer [==================================================>]   5.12kB/5.12kB
e4e9e9ad93c2: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:latest
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    f77539e7e45f   2 weeks ago   467MB
nginx        latest    3b25b682ea82   7 weeks ago   192MB
root@huhy:/opt#
  • 添加标签:dockr tag
bash 复制代码
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    f77539e7e45f   2 weeks ago   467MB
nginx        latest    3b25b682ea82   7 weeks ago   192MB
root@huhy:/opt# docker tag tomcat:latest tmt:v1
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tmt          v1        f77539e7e45f   2 weeks ago   467MB
tomcat       latest    f77539e7e45f   2 weeks ago   467MB
nginx        latest    3b25b682ea82   7 weeks ago   192MB

docker容器命令

  • 启动容器:docker run
    • -d:表示后台运行容器(即"分离模式"),这样容器启动后会在后台运行,不会阻塞当前终端
    • --name:指定容器的名称,方便后续管理。否则系统会随机生成一个名称
    • -p:端口映射,将主机的端口映射到容器的端口,格式是 主机端口:容器端口(如果p是大写,就是随机分配端口)
    • -v:数据卷挂载,用于将主机的文件夹挂载到容器中,这在 Web 服务中很常见,可以将 Nginx 配置文件或网页文件挂载到容器。格式是 主机路径:容器路径
    • --rm:容器停止后自动删除容器。适用于临时测试环境
    • -e:设置环境变量,用于在启动时配置容器内部的环境
    • -it:用于交互模式启动容器,加上 -t 表示为容器分配一个伪终端
    • --network:设置容器的网络模式。Docker 提供了多种网络模式,如 bridge、host、none 等,或使用自定义网络。
    • -h, --hostname:设置容器的主机名。
    • --memory:限制容器的内存使用。可以指定具体的内存大小。
    • --cpu-shares:为容器设置 CPU 共享权重,用于调度时分配 CPU 资源
    • --restart:设置容器的自动重启策略。常见的选项有:
      no:不会自动重启容器(默认行为)。
      always:容器停止时总是重启。
      unless-stopped:除非容器被手动停止,否则总是重启。
      on-failure:仅在容器非正常退出(退出码非 0)时重启

启动一个nginx容器

bash 复制代码
root@huhy:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    3b25b682ea82   5 weeks ago   192MB
root@huhy:~# docker run -itd --name nginx -p 8081:80 3b25b682ea82
6eefa8c342cfef7142fb000172727b757f1686a4d0bcc835df19e310d3d18ef9
root@huhy:~# ss -tlun | grep 80
tcp   LISTEN 0      4096         0.0.0.0:8081       0.0.0.0:*
tcp   LISTEN 0      4096            [::]:8081          [::]:*
  • 查看容器:docker ps
    • -a:列出所有容器(包括已停止的容器)
    • -q:仅显示容器 ID,不显示其他详细信息
bash 复制代码
root@huhy:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   4 minutes ago   Up 4 minutes   0.0.0.0:8081->80/tcp, [::]:8081->80/tcp   nginx
root@huhy:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   4 minutes ago   Up 4 minutes   0.0.0.0:8081->80/tcp, [::]:8081->80/tcp   nginx
root@huhy:~# docker ps -q
6eefa8c342cf
  • 查看容器详细信息:docker inspect
bash 复制代码
root@huhy:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   7 minutes ago   Up 7 minutes   0.0.0.0:8081->80/tcp, [::]:8081->80/tcp   nginx
root@huhy:~# docker inspect nginx
[
    {
        "Id": "6eefa8c342cfef7142fb000172727b757f1686a4d0bcc835df19e310d3d18ef9",
        "Created": "2024-11-11T02:35:58.084126042Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
............
  • 查看容器日志:docker logs
    • -f:跟随实时输出日志
    • --tail:查看日志的最后几行
bash 复制代码
root@huhy:~# docker logs -f nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/11/11 02:35:58 [notice] 1#1: using the "epoll" event method
2024/11/11 02:35:58 [notice] 1#1: nginx/1.27.2
2024/11/11 02:35:58 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/11/11 02:35:58 [notice] 1#1: OS: Linux 6.8.0-45-generic
2024/11/11 02:35:58 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/11/11 02:35:58 [notice] 1#1: start worker processes
  • 进入容器:docker exec
    • -i(--interactive):开启交互模式,使得容器中的命令可以接收标准输入。适用于需要交互输入的命令
    • -t(--tty):分配一个伪终端(TTY)。通常与 -i 一起使用来打开一个交互式的终端,比如 bash 或 sh
    • -e(--env):设置环境变量,为执行的命令添加指定的环境变量。可以添加多个 -e 参数
    • --privileged:允许容器有更多的权限,适用于执行一些需要高权限的操作
    • --workdir:指定容器中执行命令的工作目录(工作路径),相当于切换到指定目录再执行命令
bash 复制代码
root@huhy:~# docker exec -it nginx bash
root@6eefa8c342cf:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
root@6eefa8c342cf:/#
  • 停止容器:docker stop
bash 复制代码
root@huhy:~# docker stop nginx
nginx
root@huhy:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@huhy:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   39 minutes ago   Exited (0) 10 seconds ago             nginx
root@huhy:~#
  • 强制停止:docker kill
bash 复制代码
root@huhy:/opt# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
df30594547df   nginx     "/docker-entrypoint...."   5 seconds ago   Up 5 seconds   80/tcp    optimistic_mirzakhani
root@huhy:/opt# docker kill df30594547df
df30594547df
root@huhy:/opt# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@huhy:/opt#
  • 启动容器:docker start
bash 复制代码
root@huhy:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@huhy:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   39 minutes ago   Exited (0) 10 seconds ago             nginx
root@huhy:~# docker start nginx
nginx
root@huhy:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS                                     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   40 minutes ago   Up 3 seconds   0.0.0.0:8081->80/tcp, [::]:8081->80/tcp   nginx
root@huhy:~#
  • 暂停容器中所有进程:docker pause
bash 复制代码
root@huhy:~# docker pause nginx
nginx
root@huhy:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                   PORTS                                     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   41 minutes ago   Up 57 seconds (Paused)   0.0.0.0:8081->80/tcp, [::]:8081->80/tcp   nginx
root@huhy:~#
  • 恢复被暂停的容器:docker unpause
bash 复制代码
root@huhy:~# docker unpause nginx
nginx
root@huhy:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
6eefa8c342cf   3b25b682ea82   "/docker-entrypoint...."   51 minutes ago   Up 10 minutes   0.0.0.0:8081->80/tcp, [::]:8081->80/tcp   nginx
root@huhy:~#
  • 查看 Docker 的实时事件流:docker events
    • --since:指定从特定时间开始获取事件。时间格式可以是时间戳或格式化的日期字符串。
      例如,查看最近 1 小时的事件:
bash 复制代码
docker events --since 1h
  • --until:指定事件结束时间,和 --since 搭配使用。
    例如,查看指定时间段内的事件:
bash 复制代码
docker events --since "2023-10-01T00:00:00" --until "2023-10-01T12:00:00"
  • --filter:用于过滤特定的事件,docker events 支持多种过滤器,最常用的包括:
    event:按事件类型过滤,例如 start、stop、die 等。
    container:指定某个容器的事件。
    image:指定某个镜像的事件。
    label:按标签过滤事件。
    例如,查看特定容器的事件:
bash 复制代码
docker events --filter container=my-container
  • 容器导出为镜像:docker commit
    此命令只会记录文件系统和容器状态,不会记录启动参数和卷挂载等等,可搭配inspect使用,达到容器迁移的效果
bash 复制代码
root@huhy:/opt# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
9448eb29f64e   nginx     "/docker-entrypoint...."   14 seconds ago   Up 13 seconds   80/tcp    elated_beaver
root@huhy:/opt# docker commit 9448eb29f64e new_nginx:v1
sha256:885f36e25bdfc0dcff244ab96c0c6f4d4dd4f2e11fa7b1e38e2014e66070edac
root@huhy:/opt# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
new_nginx    v1        885f36e25bdf   5 seconds ago   192MB
nginx        latest    60c8a892f36f   7 weeks ago     192MB
  • 容器导出为快照:docker export
    Docker 支持将容器完整导出为文件快照,这个方式更适合迁移,可以间接保存所有数据
bash 复制代码
root@huhy:/opt# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
9448eb29f64e   nginx     "/docker-entrypoint...."   6 minutes ago   Up 6 minutes   80/tcp    elated_beaver
root@huhy:/opt# docker export  -o nginx_test.tar 9448eb29f64e
root@huhy:/opt# cat nginx_test.tar | docker import - my_nginx_image:latest
sha256:6bf3501bd2b49601f158c5905d4eae05f135c19eb3a89fd9f201284a7153bf28
root@huhy:/opt#
root@huhy:/opt# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
my_nginx_image   latest    6bf3501bd2b4   17 seconds ago   190MB
new_nginx        v1        885f36e25bdf   8 minutes ago    192MB
nginx            latest    60c8a892f36f   7 weeks ago      192MB

使用 docker commit:

  • 在容器中做了修改(例如安装了软件、修改配置文件),希望将这些修改保存为镜像,供后续使用。
    快速创建一个基于现有容器的自定义镜像。
    希望能够在以后使用该镜像启动新容器,并保留容器的所有修改。

使用 docker export:

  • 需要导出容器的文件系统以便迁移到其他地方(例如,将容器的文件系统导出为 tar 包,并上传到另一个机器上)。
    只关心容器内的数据,不关心容器的配置。
    备份容器的文件系统内容,但不需要容器的运行时配置。

docker仓库

Docker仓库是用于存储和管理Docker镜像的地方,可以是公共的也可以是私有的。通过Docker仓库,开发者可以方便地上传、下载和共享Docker镜像。常见的Docker仓库包括Docker Hub、Harbor、 Google ContainerRegistry(GCR)、Amazon Elastic ContainerRegistry(ECR)和 Azure ContainerRegistry(ACR)。这些仓库支持镜像的版本控制存储、分发,通常还提供镜像扫描、加密、权限管理等安全功能

Harbor官网

配置最新harbor,安装要求:docker 20.10.10-ce+ and docker-compose 1.18.0+ .

bash 复制代码
tar -xf harbor-offline-installer-v2.11.2.tgz
bash 复制代码
root@huhy:~# cd harbor/
root@huhy:~/harbor# ls
common.sh  harbor.v2.11.2.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare

在 Docker 20.10 及更高版本中,Docker 引入了 docker compose 作为一个插件命令,逐渐取代了 docker-compose。这个命令作为 Docker CLI(命令行界面)的一部分,允许直接通过 docker 命令来管理 Docker Compose 功能,而不再需要单独安装docker-compose 工具

bash 复制代码
root@huhy:~/harbor# docker compose version
Docker Compose version v2.29.7

配置daemon

bash 复制代码
vi /etc/docker/daemon.json
bash 复制代码
{
  "registry-mirrors": ["https://o90diikg.mirror.aliyuncs.com"],
  "insecure-registries" : ["0.0.0.0/0"]
}
bash 复制代码
systemctl daemon-reload
systemctl restart docker

修改yml

bash 复制代码
mv harbor.yml.tmpl harbor.yml

yml文件官网配置详解

bash 复制代码
vi harbor.yml

修改为本机IP,并注释https

bash 复制代码
hostname: 192.168.200.160

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
#https:
  # https port for harbor, default is 443
  # port: 443
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path
  # enable strong ssl ciphers (default: false)
  # strong_ssl_ciphers: false

使用默认启动

bash 复制代码
./install.sh

启动harbor时可带一些可选参数

bash 复制代码
--with-trivy             # 启用 Trivy 漏洞扫描
--with-clair             # 启用 Clair 漏洞扫描
--with-notary            # 启用镜像签名与验证(Notary)
--with-chartmuseum       # 启用 Helm Chart 仓库
--with-registry          # 启用 Docker 镜像仓库
--with-database          # 启用数据库服务(通常是 PostgreSQL)
--with-redis             # 启用 Redis 服务
--with-log               # 启用日志记录
--with-https             # 启用 HTTPS 配置
--with-clair-scanner     # 启用 Clair 扫描器
--with-clair-metadata    # 启用 Clair 元数据
--with-jobservice        # 启用任务服务
--with-core              # 启用 Harbor 核心服务
--with-portal            # 启用 Harbor Web UI

界面访问:IP(admin/Harbor12345)

界面创建公开项目

查看推送命令

推送镜像:打标签

bash 复制代码
root@huhy:~# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED       SIZE
goharbor/harbor-exporter        v2.11.2   520de0cd30c7   10 days ago   108MB
goharbor/redis-photon           v2.11.2   bb0d92ddf3ec   10 days ago   165MB
goharbor/trivy-adapter-photon   v2.11.2   0962772f9c8f   10 days ago   347MB
goharbor/harbor-registryctl     v2.11.2   075c10d45191   10 days ago   162MB
goharbor/registry-photon        v2.11.2   1365718c5208   10 days ago   84.8MB
goharbor/nginx-photon           v2.11.2   2949037133e7   10 days ago   154MB
goharbor/harbor-log             v2.11.2   9ae20475f5ca   10 days ago   163MB
goharbor/harbor-jobservice      v2.11.2   8dbbe22ef281   10 days ago   159MB
goharbor/harbor-core            v2.11.2   6c2be6bdb874   10 days ago   185MB
goharbor/harbor-portal          v2.11.2   a3440cd04321   10 days ago   162MB
goharbor/harbor-db              v2.11.2   a5fc5485967b   10 days ago   271MB
goharbor/prepare                v2.11.2   74c41ed4e2a9   10 days ago   205MB
root@huhy:~# docker tag goharbor/prepare:v2.11.2 192.168.200.160/test/goharbor/prepare:test

登录harbor

bash 复制代码
root@huhy:~# docker login -u "admin" -p "Harbor12345" "192.168.200.160"
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
root@huhy:~#
bash 复制代码
root@huhy:~# docker push 192.168.200.160/test/goharbor/prepare:test
The push refers to repository [192.168.200.160/test/goharbor/prepare]
c6844997789a: Pushed
ee793768fa5f: Pushed
659dc40ce3b7: Pushed
029c27b3f91b: Pushed
7db7ce7738f9: Pushed
771d6693db72: Pushed
9c15ef707b0c: Pushed
e8d8565c9983: Pushed
faebe453cc4b: Pushed
7e3e085aad00: Pushed
test: digest: sha256:3761801ca8f76e7df2ab1c4f7c35913cf0540a3d34510cb54274939568bcc346 size: 2413
root@huhy:~#

界面查看镜像已经推送成功

相关推荐
Python私教35 分钟前
Docker化部署Django:高效、可扩展的Web应用部署策略
前端·docker·django
wish3661 小时前
Clean Docker Images and Container by Cron Job
运维·经验分享·docker·容器·devops
现实、太残忍2 小时前
docker快速安装zookeeper
docker
Linux运维技术栈2 小时前
Docker 实战:搭建本地 Registry 私有镜像仓库及批量导入脚本
linux·docker·容器
周星星✘2 小时前
Docker使用教程
运维·docker·容器
青柚~2 小时前
Docker中配置Mysql主从备份
mysql·docker
路边小野花2 小时前
docker 创建容器后,容器内部yum不能在线拉取使用
运维·docker·容器
踏雪Vernon2 小时前
[OpenHarmony5.0][Docker][教程]OpenHarmony5.0编译环境基于WSL2封装Docker镜像教程
运维·docker·容器·鸿蒙系统
晨欣6 小时前
Docker和Docker Compose部署方式的区别以及各自适用的场景(ChatGPT-4o回答)
运维·docker·容器