
Docker使用经验和简介
前言:
本文将从实践角度给出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 支持,极大地提升了开发和运维的效率。