前言:

本文将从实践角度给出Docker的使用方法和理解经验,请注意,本文并不会深挖docker相关知识,只是立足于使用,进行探讨。

Docker简介:

个人理解,docker类似于虚拟机,每个环境都是隔离的,比如conda,我们在使用一些python的工程时,为了避免依赖冲突(类似于numpy、transformer等)我们会使用conda环境,不同的工程任务使用不同的环境去开发和研究,避免一些头疼的问题。
可以把docker理解为“隔热板”,在极端环境中能开辟出一片隔离的空间,不受外界干扰。打docker的过程就像是把所有的东西丢进隔热板,然后在任何地方或环境打开,可以达到同样的稳定运行效果,免去繁杂的环境配置。


Docker基本概念:

  • 容器(Container)

    • 容器是 Docker 中的基本单位,是一个轻量级、可执行的独立环境。每个容器都包含一个应用及其运行所需的所有依赖(包括库、配置文件等)。

    • 类比:就像你有一个隔热板,每次烹饪时,锅会放在不同的板上,容器就是这种板,锅就是运行的应用。

  • 镜像(Image)

    • 镜像是容器的模板,包含了运行容器所需的所有文件和依赖。可以把它想象成“隔热板的设计图”,每次需要一个新的环境时,可以根据这个设计图创建一个新的容器。

    • 类比:镜像就像是你厨房里的锅垫的设计图,定义了每个“隔热板”需要什么样的构造。

  • Docker 守护进程(Daemon)

    • Docker 守护进程负责管理容器的创建、运行和停止。它就像厨房的主厨,负责决定什么时候拿出锅垫、放上锅,什么时候准备切换锅垫。

    • 类比:守护进程是你厨房里的主厨,负责组织所有的烹饪步骤。

  • Docker 客户端(Client)

    • Docker 客户端是你与 Docker 守护进程沟通的工具,通常是通过命令行或者图形界面与 Docker 守护进程进行交互。

    • 类比:客户端就像是你自己,拿着菜单(命令)告诉厨师你想要做什么。

Docker安装:

Docker要求CentOS系统的内核版本高于3.10

安装前先确定本机上没有docker,有的话要卸载

sudo yum update
 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

换镜像:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
wget -O /etc/yum.repos.d/CentOS-AppStream.repo http://mirrors.aliyun.com/repo/Centos-8.repo
#下载下来之后
cd /etc/yum.repos.d/
#查一下本地的CentOS-Linux-AppStream.repo  和   CentOS-Linux-Base.repo 如果没有替换,那就去找一下刚刚下载的东西,把里面的替换就可以

建立仓库:

## 安装Docker所需要的一些工具包
sudo yum install -y yum-utils
 #如何这一步出问题,那就去更换国内的镜像源,阿里腾讯等等
## 建立Docker仓库 (映射仓库地址)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装引擎:

 sudo yum install docker-ce docker-ce-cli containerd.io

启动docker:

sudo systemctl start docker

Docker使用:

常见命令:

##列出目前所有镜像
docker images 

##列出所有运行中容器
docker ps

##列出所有容器
docker ps -a

##查找远程仓库中(如阿里云远程docker库)某个镜像
docker search <image>

##拉取镜像(以mysql为例)
##输入之后会从远程仓库拉取镜像,也就相当于下载到本地
docker pull mysql:latest

##构建镜像(除了一些中间件官方有镜像之外,我们自己也可以打镜像)
##-t 代表指定镜像名称和tag,后面的.表示本目录全部文件打成docker
docker build -t myimage:latest .

##保存镜像为tar包(-o表示out, 后面是tar名字和镜像名字)
docker save -o myimage.tar myimage:latest

##加载镜像,将tar包加载成镜像
docker load -i myimage.tar

##运行镜像为容器(基本命令 不含挂载,挂载建议使用compose)
docker run -d -p <宿主机端口>:<容器端口> <镜像名>

Dockerfile:

要构建docker镜像需要编写dockerfile,将其命名为Dockerfile,而后在同级文件夹,执行build命令即可

# 使用官方的 OpenJDK 镜像作为基础镜像
FROM openjdk:21-jdk-slim

# 设置工作目录
WORKDIR /app

# 将本地的 .jar 文件复制到容器的工作目录
COPY target/myapp.jar /app/myapp.jar

# 设置容器启动时执行的命令
CMD ["java", "-jar", "myapp.jar", "--spring.profiles.active=prod"]

# 容器运行时暴露的端口
EXPOSE 8080

Docker Compose:

Docker Compose 是一个工具,用于定义和运行多个 Docker 容器的应用程序。使用 Compose,您可以通过一个配置文件来定义所有容器的服务、网络和存储卷,并用一个简单的命令启动所有容器。它使得管理多个互相依赖的 Docker 容器变得更加容易。

Docker Compose 的核心在于 docker-compose.yml 配置文件,您可以在其中定义应用程序所需的多个服务、网络配置、卷挂载、环境变量等。

version: '3'  # 版本号,选择合适的 Docker Compose 版本

services:
  web:  # 定义 Web 服务
    image: nginx:latest  # 使用最新的 nginx 镜像
    ports:
      - "80:80"  # 映射容器的 80 端口到主机的 80 端口
    networks:
      - mynetwork  # 使用名为 'mynetwork' 的网络
    volumes:
      - ./html:/usr/share/nginx/html  # 挂载本地 ./html 目录到容器内的 nginx 静态文件目录

  db:  # 定义数据库服务
    image: mysql:8.3  # 使用 MySQL 8.3 镜像
    environment:
      MYSQL_ROOT_PASSWORD: example  # 设置 MySQL root 用户的密码
    networks:
      - mynetwork  # 使用名为 'mynetwork' 的网络
    volumes:
      - db-data:/var/lib/mysql  # 使用 Docker 卷来持久化数据库数据

networks:
  mynetwork:  # 自定义的网络配置
    driver: bridge

volumes:
  db-data:  # 自定义的卷配置

常见命令

##启动
docker compose up -d

##关闭
docker compose down 

##当前状态
docker-compose ps

##查看服务日志
docker-compose logs

##重建服务
docker-compose up --build

总结:

Docker 通过容器化技术提供了一种轻量、高效且可移植的解决方案,适用于开发、测试、生产环境中的应用部署。它通过提供一致的运行环境、快速启动、资源隔离和自动化的 CI/CD 支持,极大地提升了开发和运维的效率。