Docker 镜像管理

318 阅读6分钟

Docker 镜像管理


image-20240127121729134.png

Docker是一个容器化平台,通过操作系统级别的虚拟化技术,实现软件的打包和容器化运行。借助Docker,开发人员能够将应用程序以容器的形式进行部署。

概念


Docker、镜像、容器、仓库的概念

Docker利用容器来运行应用,容器从镜像创建运行的实例

  • 镜像(image) :镜像是Docker的基本概念,它是一个轻量且独立的可执行软件包。可以将镜像看作是一个包含了完整运行环境的模板,其中包括应用程序、库和依赖

    • 可以使用 docker pull 命令从Docker Hub或其他镜像仓库中获取镜像
    • 可以使用 docker build 命令通过Dockerfile构建自定义镜像
  • 容器(container) :容器是基于镜像创建的运行实例,容器是轻量级的,共享主机操作系统的内核,可以更高效地运行多个容器。

    • 可以使用 docker run 命令来创建并启动一个容器
    • 可以使用 docker startdocker stopdocker restart 命令来分别启动、停止和重启容器
  • 仓库(repository) :是集中存放镜像文件的场所。

    • Docker Hub(hub.docker.com/):全球最大的Docker镜像仓库,包含了大量的官方和社区维护的镜像,但是在国内访问速度较慢。
    • 阿里云容器镜像服务(cr.console.aliyun.com/):阿里云提供的Docker镜像仓库服务,包含了丰富的官方和开源镜像,访问速度较快。
    • 腾讯云容器镜像服务(cloud.tencent.com/product/tcr):腾讯云提供的Docker镜像仓库服务,支持私有仓库和公有仓库,访问速度较快。
    • 华为云容器镜像服务(console.huaweicloud.com/cr):华为云提供的Docker镜像仓库服务,支持私有仓库和公有仓库,访问速度较快。
  • DockerfileDockerfile是一个文本文件,用于定义如何构建Docker镜像。它包含一系列的指令和配置项,例如基础镜像、运行命令、复制文件、设置环境变量等。

    • 通过编写Dockerfile,可以创建包含自定义配置和应用程序的镜像。
  • 数据卷(volume) :数据卷是用于持久存储数据的特殊目录或文件。数据卷可以在容器之间共享和重用,使得数据持久化且不受容器状态的影响。

    • 可以使用 -v 参数来创建和管理数据卷。

安装Docker


一键安装脚本

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo systemctl enable docker
sudo systemctl start docker
docker version
if [ $? -eq 0  ];then
echo "docker successful  installation!"
fi# 添加国内镜像
touch /etc/docker/daemon.json
echo "{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com"
  ]
}" > /etc/docker/daemon.json
​
sudo systemctl daemon-reload
sudo systemctl restart docker

Dockerfile 自定义镜像


Dockerfile 是一个文本文件,用来描述如何从一个基础镜像(例如 ubuntu 或 alpine)构建出一个新的镜像,包括安装依赖、复制文件、设置环境变量、暴露端口等操作。使用 Dockerfile 可以让开发者清晰地记录应用程序的配置和依赖,以及保证应用程序在不同的环境中运行的一致性。

# 基于官方 Tomcat 8 镜像构建自定义镜像
FROM tomcat:8
 
# 将本地的 webapp 目录复制到 Tomcat 默认的 webapps 目录下
COPY ./webapp /usr/local/tomcat/webapps/ROOT
 
# 安装 Nginx
RUN apt-get update && \
    apt-get install -y nginx
 
# 配置 Nginx
COPY ./nginx.conf /etc/nginx/nginx.conf
 
# 设置工作目录
WORKDIR /var/www/html
 
# 运行 Nginx
CMD ["nginx", "-g", "daemon off;"]
  • 构建镜像
docker build -t my-tomcat-nginx .

image-20240201231326513.png

image-20240201231355626.png

  • 运行构建好的镜像
docker run -p 8005:80 my-tomcat-nginx

image-20240201231432973.png

image-20240201232158900.png

镜像管理


1 构建Docker镜像

  • Dockerfile相同的目录中运行以下命令
docker build -t tomcat-nginx-app:v1 .
  • . 表示用当前目录的Dockerfile文件来构建
  • tomcat-nginx-app:v1 表示镜像名称(REPOSITORY)以及版本(TAG)
docker images
  • 创建成功之后使用Docker images来查看镜像

2 保存镜像到本地磁盘

  • 初步操作构建好之后,可能会更改镜像,却又怕源镜像丢失
docker save -o tomcat_nginx.tar my-tomcat-nginx:v1
  • 本地文件名为tomcat_nginx.tar文件

image-20240201231626579.png


  • 如果是运行中的容器,进行打包,需要使用下面的命令
docker export -o tomcat_nginx2.tar 47147b60cf36
  • container_id 可以通过docker ps 查看,第一列就是

image-20240201231729258.png


  • 还原到本地仓库
docker load < tomcat_nginx.tar

image-20240201233019384.png

3 给Docker镜像打标签

docker tag <镜像 ID 或 镜像名称> robertchao/tomcat8-nginx-app:v1
​
docker tag 99f200a0f7f1 robertchao/tomcat8-nginx-app:v1
  • 完成之后,使用Docker images来查看镜像。

image-20240201232108885.png

4 将镜像推送到 Docker Hub

  • 前提是需要有 Docker Hub 账户。如果您还没有账户,请创建一个。
docker login
  • 在推送到 Docker Hub 之前,需要使用 Docker Hub 用户名给镜像打标签。
docker tag <镜像 ID 或镜像名称> robertchao/tomcat-jdk8-app:v1
  • 推送镜像
docker push robertchao/tomcat-jdk8-app:v1

5 下载指定名称的镜像

docker pull <镜像名称>
​
docker pull tomcat

6 使用Docker镜像运行容器

docker run -d -p <对外访问的端口>:<应用程序运行的端口> <镜像名称>

-d:用于以分离模式运行容器

-p:用于指定端口

例如:docker run -d -p 8080:8080 tomcat

7 删除镜像

  • 删除所有未使用的镜像 (慎用)
docker image prune
docker image prune -a
7.1 使用 ID 删除镜像
  • 获取镜像 ID
docker images -a -q
  • 根据 ID 删除所有镜像
docker rmi $(docker images -a -q)
  • 使用 -f 标志来强制删除
docker rmi -f $(docker images -a -q)
7.2 删除特定的Docker镜像
  • 获取镜像的 ID
docker images -a -q tomcat
​
7a2f1e6fcdd3
  • 删除此镜像
docker rmi -f $(docker images -a -q tomcat)

image-20240201232759932.png

8 删除容器

  • 停止特定的容器
docker stop <容器 ID>
  • 删除指定的容器
docker rm <容器 ID>
  • 删除所有已停止的容器
docker container prune

image-20240201232613182.png

9 将本地文件内容拷贝到容器

docker cp a.py container_id:/dir
  • 命令:docker cp
  • 宿主机文件:a.py,路径是当前目录
  • 容器文件夹:container_id:/dir,拷贝到container_id/dir文件夹下

Docker Compose简化部署


docker-compose 是一个工具,可以让开发者使用一个 YAML 文件(通常命名为docker-compose.yml)来描述多个容器之间的配置,包括镜像、端口、环境变量、挂载卷、网络等。使用 docker-compose 可以让开发者一次性地启动或停止所有相关的容器,以及方便地管理容器之间的通信。

  • 使用 docker-compose 来定义和运行多个容器之间的依赖和协作关系,减少多个容器运行docker run命令的繁琐和出错率
version: '1'
services:
  hsm-api:
    image: tomcat-nginx-jdk8
    container_name: socket_mina
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/logs:/home/logs
      - /opt/pro/upload:/opt/pro/upload
    restart: always
    command: java -Xms512m -Xmx512m -Duser.timezone=GMT+8 -Dfile.encoding=utf-8 -jar /home/app/socker_mina.jar
    ports:
      - "80:8659"
    environment:
      - TZ=Asia/Shanghai
      - LOG_PATH_PREFIX=/home/logs
      - UPLOAD_DIR=/opt/pro/upload
    network_mode: "zentaonet"
    # 依赖于redis和mysql,在启动本服务之前会先启动依赖的服务
    depends_on:
      - redis
      - mysql

Docker Compose语法和配置选项解释

  • 版本(version): Docker Compose文件的版本,用于指定使用哪个版本的语法。
  • 服务(services) :用于定义各个服务的配置。每个服务都是一个独立的容器。
    • context:构建上下文路径,表示构建时查找Dockerfile文件的位置。 [一般省略]

    • dockerfile:指定使用的Dockerfile文件名。默认为 Dockerfile[一般省略]

    • image:指定要使用的镜像名称。可以是公共镜像(例如 nginxmysql等),也可以是本地构建的私有镜像。

    • build:用于指定构建镜像所需的Dockerfile的路径。可以是相对于Docker Compose文件的相对路径,或者是包含Git URL的完整路径。

    • ports:定义容器和主机之间的端口映射关系。可以是单个端口,也可以是一个范围。格式为 [主机端口]:[容器端口]

      • ports: - "8080:80" 表示将容器内的 80 端口映射到主机的 8080 端口。
      • 多端口映射,使用-表示集合
    • volumes:定义容器和主机之间的文件卷绑定关系。格式为 [主机路径]:[容器路径],可以指定只读或可写。例如,volumes: - "./data:/app/data:ro" 表示将主机上的 ./data 目录挂载到容器内的 /app/data 路径,并以只读方式访问。

    • environment:设置容器中的环境变量。可以是一个键值对或一个列表。例如,environment: - MYSQL_ROOT_PASSWORD=mysecretpassword 设置了一个名为 MYSQL_ROOT_PASSWORD 值为 mysecretpassword 的环境变量。

    • depends_on:指定服务之间的依赖关系。例如,depends_on: - db 表示该服务依赖于名为 db 的服务,在启动时会先启动 db 服务。

    • command:定义容器启动时要执行的命令。例如,command: bundle exec rails server 表示在容器启动时执行 bundle exec rails server 命令。

  • 网络(networks) :用于定义网络配置。
    • driver:指定网络使用的驱动程序。常见的驱动程序有 bridgeoverlaymacvlan 等。
    • driver_opts:用于指定特定驱动程序的选项。例如,driver_opts: myoption: value 可以设置自定义选项。
  • 数据卷(volumes) :用于创建和管理数据卷。
    • external:指定数据卷是否为外部数据卷,意味着数据卷由外部创建和管理。
  • 命令(command) :定义容器启动时要执行的命令。
  • 链接(links) :定义服务之间的链接关系,使一个服务可以通过名称引用另一个服务

Docker Compose 命令

  • 启动应用(up)

    • -d 选项,用于后台运行应用程序
docker-compose up -d
  • 停止应用(down)

    • 删除所有:停止容器,移除网络,删除容器
docker-compose down
  • 停止服务(stop)
docker-compose stop
  • 启动服务(start)
docker-compose start
  • 查看服务状态(ps)
docker-compose ps
  • 构建镜像(build)
docker-compose build
  • 查看日志(logs)

    • -f 参数来保持日志的跟踪
docker-compose logs -300f