内容目录

docker镜像概述

什么是镜像

docker镜像是创建容器的模板,它封装了对应软件所需的一切,包括代码、运行环境和配置文件等。
镜像由多个文件系统层组成,这些层按顺序叠加再一起,形成了一个完整的文件系统。
一个典型的镜像通常包括以下几个层:

  • 操作系统层:包含操作系统的基本文件和目录,例如/dev、/proc、/bin、/etc等。不同的linux发行版在这一层目录结构可能会有所不同。
  • 应用程序依赖层:包含应用程序极其运行所需的依赖库和文件
  • 配置层:包含应用程序的配置文件或特定设置

一般镜像都比较小,官方提供的ubuntu镜像只有70MB,而rockylinux基础镜像也只有176MB左右,一些其他版本的镜像甚至只有几MB
那是因为镜像是直接使用的宿主机的内核,而在镜像中只提供rootfs,也就是只需要包括最基本的命令,配置文件和程序库等相关文件就可以了,所以有些镜像的体积就会比较的小。

镜像能做什么

镜像是用来打包和分发应用程序,它可以帮助开发人员方便地构建、部署和管理软件应用。
具体来说,镜像可以帮助实现以下功能:

  • 打包应用程序:镜像能够将应用程序及其依赖打包成一个可移植的文件,方便再不同的环境中运行。

  • 管理应用程序:通过镜像可以统一管理应用及其依赖项,确保它们在不同环境中运行是一致的。

  • 分发应用程序:通过镜像仓库,可以轻松的分发和共享应用程序。使得开发人员可以非常方便的获取和部署应用程序。

  • 简化环境配置:镜像包含了运行应用所需的所有配置,从而有效的避免了因环境差异导致的问题。

docker镜像实践

命令 描述信息
docker search 搜索镜像
docker pull 下载镜像
docker images 查看镜像
docker commit 构建镜像
docker save 备份镜像
docker load 恢复镜像
docker tag 镜像标签
docker push 上传镜像
docker rmi 删除镜像

搜索docker镜像

在下载镜像之前,我们需要先使用docker search命令搜索远程仓库中共享的镜像是否存在我们需要的镜像,默认搜索dockerhub官方仓库中的镜像。
命令格式:docker search [options] {imagename}

1 docker search rockylinux  # 搜索仓库中rockylinux相关的镜像
2 docker search centos  # 搜索仓库中centos相关的镜像
3 docker search nginx  # 搜索仓库中nginx相关的镜像

下载docker镜像

下面使用docker pull命令从仓库下载最新版本的centos镜像。
命令格式:docker pull [options] {imagename}:[tag]
如果不指定tag标签版本,默认latest为最新的镜像。

1 # 如果镜像已存在,命令会直接返回,否则会联网开始自动下载该镜像
2 docker pull rockylinux:9
3 # 获取第三方docker镜像仓库
4 docker pull index.tenxcloud.com/tenxcloud/httpd:latest
5 docker pull index.tenxcloud.com/tenxcloud/httpd:latest

查看docker镜像

使用docker images来查看本地所有已存在的镜像列表(包括:已下载的镜像、导入进来的镜像、自行通过dockerfile构建的镜像等)
命令格式:docker images [imagename]

docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   16 months ago   13.3kB
centos        7         eeb6ee3f44bd   2 years ago     204MB

备份docker镜像

使用docker save命令保存当前镜像。
命令格式:docker save [options] imagename:imagetag > /path/imagename.tar.gz

  • 查看本地镜像列表
docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
rockylinux    9         9cc24f05f309   9 months ago    176MB
hello-world   latest    d2c94e258dcb   16 months ago   13.3kB
centos        7         eeb6ee3f44bd   2 years ago     204MB
  • 保存rockylinux镜像到本地,打包为rockylinux.tar.gz
    docker save rockylinux:9 > /opt/rockylinux_9.tar.gz

  • 查看对应镜像占用的磁盘大小

du -sh /opt/rockylinux_9.tar.gz
173M /opt/rockylinux_9.tar.gx

删除docker镜像

无用的镜像会占用大量的磁盘空间,因此可以使用docker rmi删除镜像。
命令格式:docker rmi [options] imagename [imagename...]

  • 删除hell-world镜像,正常删除后会打印删除的各层信息,-f代表强制
    docker rmi hello-world -f

  • 批量删除镜像
    docker rmi $(docker images | awk '{print $3}'}

注意:删除docker镜像的规范的步骤如下:

  1. 先使用docker rm命令删除依赖该镜像的所有容器
  2. 然后使用dockers rmi命令删除该镜像(如果不愿意删除容器,直接添加-f参数)

恢复docker镜像

使用docker load命令可将本地的镜像导入到docker中。
命令格式:docker load [options] container.tar.gz

  1. 使用docker load命令导入镜像
    docker load < /opt/rockylinux_9.tar.gz

  2. 查看镜像是否导入成功
    docker images

docker容器概述

什么是容器

容器是镜像运行时的实例。
启动一个容器就像启动了一台虚拟机,在这个容器上就可以运行应用程序。
从本质上说,一个容器就是一个运行的进程,只是加入了隔离机制,使其与其他容器隔离。

容器的相关操作

命令 描述信息
docker run 运行容器
docker info、inspect、ps 查看容器
docker start、stop、restart、kill 启停容器
docker exec 进入容器
docker log/docker event 获取容器日志、容器事件日志

启动docker容器

  • 使用容器实现类似于虚拟机的功能,例如:创建一个新的rockylinux操作环境
    docker run -it rockylinux:9 /bin/bash

  • docker run命令执行流程刨析

    • 1.docker run表示启动一个新的容器。
    • 2.-it是打开容器的标准输入和输出
    • 3.rockylinux:9这里使用rockylinux:9作为容器启动的基础镜像
    • 4./bin/bash容器启动时运行的命令,打开容器交互终端
      总结:以rockylinux镜像作为基础镜像,启动一台容器,同时打开标准输入和输出,最后运行bash进程,使容器可交互。
  • 使用rockylinux镜像创建并运行容器执行/bin/bash "hello",然后终止容器

docker run -it rockylinux:9 /bin/echo "hello"
hello
  • 启动容器命名为myrocky,操作命令如下:
docker run --name myrocky -it rockylinux:9 /bin/bash
docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
d82b00360d62   rockylinux:9   "/bin/bash"   28 seconds ago   Up 27 seconds             myrocky
  • 启动后台运行容器通过docker run -d参数
docker run --name test -itd rockylinux:9 /bin/bash
docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
f1ed32e45c2f   rockylinux:9   "/bin/bash"   13 seconds ago   Up 12 seconds             test
  • 启动仅供测试容器,临时跑一个容器,容器退出会自动删除
    docker run --rm -it rockylinux:9 /bin/bash -c "echo hehe && sleep 2"

查看docker容器

  • docker info用来查看运行容器状态及版本信息,包括容器运行数量、镜像数量、远程仓库地址、docker版本、使用的存储驱动等信息。
docker info
 Containers: 2
  Running: 1
  Paused: 0
  Stopped: 1
 Images: 3
  • 查看容器的状态,使用docker ps命令查看当前主机容器状态以及运行容器的id
docker ps  # 查看正在运行的容器
docker ps -a  # 查看所有启动过的容器
  • 比如我们想查询单个容器的详细信息,通过docker inspect命令可以查询:容器运行状态、存储位置、网络信息、配置参数、以及容器运行启动命名等。
    docker inspect test

  • docker logs命令查询当前运行容器的日志,其实就是查看容器的标准输出日志
    docker logs -f test

进入docker容器

在实际的生产环境中,通常会将容器作为后台服务运行。
但在某些情况下,我们可能需要进入正在运行的容器进行调试或运维操作,同时又不能中断容器的服务。
这是就可以使用docker exec命令
docker exec -it test /bin/bash

启停docker容器

  • 启动docker容器
    docker start d82b00360d62

  • 停止docker容器

docker stop d82b00360d62
docker kill d82b00360d62
  • 删除docker容器
    docker rm d82b00360d62

  • 批量删除docker容器
    docker rm $(docker ps -a -q)

暴露docker容器

容器默认运行在隔离的环境中,因此外部用户无法直接访问容器内的资源。
为了使外部用户能够访问容器中的应用程序,需要在创建容器时使用--publish参数来指定哪些端口应该对外开放。

这个过程实际上是在宿主机上添加了一条iptables dnat规则,这样即使容器本身是隔离的,用户也可以通过宿主机特定的端口访问到容器内的服务。

  • -p hostport:containerport
  • -p hostip:hostport:containerport 多个容器都想使用80端口
  • -p hostip::containerport 随机端口
  • -P(大写) 随机端口
  1. 将宿主机的8080端口映射到容器的80端口
    docker run -d -p 8080:80 nginx

  2. 将宿主机的8080和8443映射到容器的80,443端口
    docker run -itd -p 8880:80 -p 8443:443 nginx

  3. 将宿主机的任意端口映射到容器的80端口
    docker run -itd -P 80 nginx

容器制作为镜像

容器制作为镜像有两种方式:

  • 手动构建镜像:其核心思想是启动一个容器,安装业务所需的服务,最后通过docker commint封装为镜像
  • 自动构建镜像:使用dockerfile来实现

需求:使用rockylinux构建一个带有sshd服务的镜像,允许外部用户通过2222端口连接至该容器

  1. 创建一个容器在后台运行,然后进入该容器中
docker run -itd --name rocky rockylinux:9 /bin/bash
docker exec -it rocy /bin/bash
  1. 在容器中安装sshd服务,然后修改默认root的登陆密码
yum install openssh-server openssh-clients -y
# ⽣成 SSH 服务器的密钥对的⼯具,确保后续能正常运⾏sshd服务
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
# 允许Root⽤户通过密码和密钥登录系统
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "1" | passwd --stdin root
  1. 将容器提交为镜像,使用commit指令实现
    docker commit rocky rockylinux_ssh:v1

  2. 启动该镜像,执行/usr/sbin/sshd -D使sshd服务能在前台一直运行
    docker run -d -p 2222:22 rockylinux_ssh:v1 /usr/sbin/sshd -D

容器的生命周期

以运行一个rockylinux的容器为例:

  • 1.docker获取rockylinux的镜像,检查本地是否存在对应的镜像,存在则使用本地镜像,不存在则上默认仓库拉取。
  • 2.docker通过rockylinux镜像创建一个新容器,并在镜像的文件系统之上添加一层可读写层来运行应用程序。
  • 3.docker通过网桥设备的网络地址池分配可用的ip挂载至容器上
  • 4.docker执行容器的启动命令,比如/bin/bash表示启动一个和本地主机可交互的进程
  • 5.执行完毕后容器就自动退出。当然也可以不终止容器,让业务一直处于前台running状态
最后修改日期: 2024年9月8日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。