docker 简要笔记

文章目录

一、前提内容

linux 查询版本 通常:cat /etc/os-release

1、docker 环境准备

需要构造一个docker环境

Tips: 截止文档生成,版本为 27.5.0

这里基于rhel 来说明 ,官方部署参考网站

0、首次安装

设置 Docker 存储库

shell 复制代码
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

1、基础目录

shell 复制代码
mkdir /opt/docker

2、下载基础包

这里是基于 2025.01.16 为截止日期的最新版本docker

shell 复制代码
wget https://download.docker.com/linux/rhel/9/x86_64/stable/Packages/containerd.io-1.7.25-3.1.el9.x86_64.rpm
wget https://download.docker.com/linux/rhel/9/x86_64/stable/Packages/docker-ce-27.5.0-1.el9.x86_64.rpm
wget https://download.docker.com/linux/rhel/9/x86_64/stable/Packages/docker-ce-cli-27.5.0-1.el9.x86_64.rpm
wget https://download.docker.com/linux/rhel/9/x86_64/stable/Packages/docker-buildx-plugin-0.19.3-1.el9.x86_64.rpm
wget https://download.docker.com/linux/rhel/9/x86_64/stable/Packages/docker-compose-plugin-2.32.3-1.el9.x86_64.rpm

3、安装部署

shell 复制代码
sudo dnf install ./containerd.io-1.7.25-3.1.el9.x86_64.rpm \
  ./docker-ce-27.5.0-1.el9.x86_64.rpm \
  ./docker-ce-cli-27.5.0-1.el9.x86_64.rpm \
  ./docker-buildx-plugin-0.19.3-1.el9.x86_64.rpm \
  ./docker-compose-plugin-2.32.3-1.el9.x86_64.rpm

2、docker-compose 环境准备

构造docker-compose 环境,通常默认安装了上一步的docker,这里以插件形式安装

Tips: 截止文档生成,版本为 2.32.4

这里基于rhel 来说明 https://docs.docker.com/engine/install/rhel/#install-from-a-package)

0、首次安装

运行命令安装插件即可,如图1-1

shell 复制代码
sudo yum install docker-compose-plugin

(图1-1)

1、验证安装

shell 复制代码
docker compose version

3、流程说明

Docker 用于管理单个容器,而 Docker Compose 用于管理多个容器应用程序

整体上: (这里直接使用docker 和 docker-compose 表面流程上是一致的)

1、将应用打包成镜像 ---> 2、构建容器(复用容器) ---> 运行镜像

二、打包 docker 镜像

1、基础镜像

官方镜像参考:Explore Docker's Container Image Repository | Docker Hub

1、基于openJdk的镜像参考\]([eclipse-temurin - Official Image \| Docker Hub](https://hub.docker.com/_/eclipse-temurin)) \[2、基于node.js的镜像参考\]([node - Official Image \| Docker Hub](https://hub.docker.com/_/node/)) \[3、基于python的镜像参考\]([python - Official Image \| Docker Hub](https://hub.docker.com/_/python)) ### 2、国内镜像源 **1、增加镜像源** > 主要是为了避免引用基础镜像失败。 > > 默认安装的docker,直接编辑这个即可 ```shell sudo vim /etc/docker/daemon.json ``` **填入内容** > 询问 `copilot` 得到的答案- -,截至2025.01.17 > > **简单解析下:** > > **log-driver:** 日志驱动程序,这里设置为 `json-file`,表示使用 JSON 文件格式记录日志 > > **log-opts:** 配置日志驱动程序的选项: > > * `labels`:用于标记日志文件,这里设置为 `servicename`。 > * `max-size`:设置单个日志文件的最大大小,这里设置为 `500m`(即 500 MB)。 > * `max-file`:设置最大的日志文件数量,这里设置为 `3`,意味着 Docker 将保留最多三个日志文件,超出的日志文件将被删除或重写。 { "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://docker.hpcloud.cloud", "https://docker.m.daocloud.io", "https://docker.unsee.tech", "https://docker.1panel.live", "http://mirrors.ustc.edu.cn", "https://docker.chenby.cn", "http://mirror.azure.cn", "https://dockerpull.org", "https://dockerhub.icu", "https://hub.rat.dev", "https://proxy.1panel.live", "https://docker.1panel.top", "https://docker.m.daocloud.io", "https://docker.1ms.run", "https://docker.ketches.cn" ], "log-driver": "json-file", "log-opts": {"labels": "servicename", "max-size": "500m", "max-file": "3"} } 重启生效 ```shell sudo systemctl daemon-reload #重启daemon进程 sudo systemctl restart docker #重启docker ``` ### 3、基础的dockerfile > 这里通常目录结构为 > > workplace > > ​ \|____ Dockerfile (下文的示例DockerFile) > > ​ \|____ target(编译的目录,通常这里放需要打包的jar即可) > > **Tips:** 这里之前建议执行下属命令,避免找不到基础镜像 > > ```shell > docker pull eclipse-temurin:8 > ``` ```dockerfile # 使用官方的OpenJDK镜像作为基础镜像 FROM eclipse-temurin:8 # 设置工作目录 WORKDIR /opt/app # 将构建的Spring Boot应用的JAR文件复制到容器中 COPY target/*.jar /opt/app.jar # 暴露应用程序运行的端口 EXPOSE 8080 # 启动Spring Boot应用 ENTRYPOINT ["java", "-jar", "app.jar"] ``` ### 4、打包镜像 > 镜像名称: java-app > > 命令执行:应该位于 `第2点` 的目录接口下执行 ```shell # 构建镜像 docker build -t java-app . # 检查镜像 docker images | grep gateway # 删除镜像 docker rmi java-app # 如果镜像 REPOSITORY 一致,可以增加tag # eg: docker rmi java-app:laster ``` ## 四、构建运行 ### 1、docker 部分 > `docker run`:这是 Docker 的基本命令,用于运行一个新的容器。 > > `-it`:这两个选项组合在一起,意味着以交互模式运行容器,并且将终端输入连接到容器内部。`-i` 表示终端输入,`-t` 表示终端模拟器。 > > `-d` : 这个选项表示以后台模式运行容器,即容器在后台运行,不会占用终端 > > `-p 8080:8080`:这个选项用于端口映射。`8080:8080` 表示将主机的 8080 端口映射到容器的 8080 端口。这样,主机上访问的 8080 端口就会连接到容器内的应用程序。 > > `java-app`:这是您要运行的 Docker 镜像的名称。这个镜像应该包含已经配置好的 Java 应用程序。 ```shell # 后台启动 docker run -it -d -p 8080:8080 java-app # 关闭 # 获取镜像id ,假设获取到 0246cd97ff15 docker ps | grep demo | awk '{print $1}' # 关闭镜像 docker stop 0246cd97ff15 ``` ### 2、docker-compose 部分 #### 2.1、构建docker-compose.yml ##### 2.1.1、同目录构建 > workplace > > ​ \|____ Dockerfile (下文的示例DockerFile) > > ​ \|____ ./demo.jar(编译的目录,通常这里放需要打包的jar即可) > > ​ \|____ docker-compose.yml **属性解析** > `demo-endpoint` : 服务名称,【按需变更】 > > `build` :构建镜像的配置选项 > > `container_name` :容器名称 > > `ports` : 这个字段定义了端口映射。将主机的 `8080` 端口映射到容器的 `8080` 端口 ```yaml version: "3" services: demo-endpoint: container_name: demo-test build: context: . dockerfile: Dockerfile ports: - "8080:8080" ``` ##### 2.1.2、利用镜像构造 > workplace > > ​ \|____ Dockerfile (下文的示例DockerFile) > > ​ \|____ docker-compose.yml > > **Tips:** 作这一步,可以先将镜像打包到docker,再使用镜像即可 > > 基于此,这里示例一个 > > ```shell > REPOSITORY TAG IMAGE ID CREATED SIZE > demo 1.10 5251d5eba4a8 4 days ago 544MB > ``` **属性解析** > 这里与上述差别在于,使用 `image` 来替换 `build` 及其子属性 ```yml version: "3" services: demo-endpoint: container_name: demo-test image: demo:1.10 ports: - "8080:8080" ``` #### 2.2、使用参数赋值 > workplace > > ​ \|____ Dockerfile (下文的示例DockerFile) > > ​ \|____ docker-compose.yml > > ​ \|____ .env(会自动读取配置,默认配置) > > ​ \|____ env_file/\*.env (若需要,可以继续放置更多配置) > > Tips:`.env` 主要用来设置全局变量,其余文件用于影响应用参数 **.env文件** > 同是环境变量,仅这个可以影响docker-compose内容值 ```yaml CONTAINER_NAME=demo-test ``` **image.env 文件** ```yaml TEST=test one 2 HI=hi one 2 ``` 例子利用 `2.1.2` 来作参考 > 新增属性 `env_file` 用来设置参数变量 ```yaml version: "3" services: demo-endpoint: container_name: ${CONTAINER_NAME} image: ${IMAGE_NAME}:${IMAGE_TAG} ports: - "8080:8080" env_file: - /env_file/image.env ``` ##### 示例应用代码 ```java @SpringBootApplication @RestController public class DemoApplication { @Value("${HI:hi}") private String hi; @Value("${TEST:test}") private String test; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping("/hello") public String hello(@RequestParam(value = "name", defaultValue = "World") String name) { return String.format("Hello %s! {%s},{%s}", name,hi,test); } } ``` #### 2.3、相关命令 后台挂载启动(若是更新了参数,再次运行可更新) `dockcer compose up -d` 关闭卸载应用 `dockcer compose down` 指定配置文件运行,主要用于区分环境 若存在多个环境配置,可以根据需要,通过 `-f` 指定配置文件来启动应用 `docker compose -f docker-compose-dev.yml up -d` ### 3、进阶的配置 1、 `volumes` :主机上的目录或文件挂载到容器内的目录。这样可以在容器内访问主机上的数据。 > 这里举例,可以将运作的日志放到主机目录上 volumes: - /opt/logs:/opt/logs 2、 `working_dir` : 字段指定了容器内的工作目录,通常打包镜像时已经配置 > 正如上文的:`WORKDIR /opt/app` 3、 `entrypoint` : 字段指定了容器启动时运行的命令 > 正如上文的 :`ENTRYPOINT ["java", "-jar", "app.jar"]` 4、`network` : 如果不指定网络,Docker Compose 会自动创建一个默认网络,并将所有服务连接到该网络 > 这里主要是基于是否需要网络分离 5、资源配置 > 下文提及的 `Swarm` 模式,通过 `docker info` 检查,若 `Swarm` 为active则是属于该模式 **Swarm模式** ```yml version: "3" services: demo: deploy: resources: limits: cpus: "0.50" # 限制 CPU 使用率为 50% memory: "512M" # 限制内存使用为 512MB reservations: cpus: "0.25" # 保留 CPU 使用率为 25% memory: "256M" # 保留内存使用为 256MB ``` **非Swarm模式** ```yml version: "3" services: demo: mem_limit: 512m # 限制内存使用为 512MB cpus: 0.5 # 限制 CPU 使用率为 50% ``` ### 4、进入容器 ```shell docker exec -it demo bash ```

相关推荐
不要影响我叠Q12 分钟前
《Fundamentals of Electromigration-Aware IntegratedCircuit Design》笔记
笔记
蒹葭苍苍87312 分钟前
LoRA、QLoRA微调与Lama Factory
人工智能·笔记
吴梓穆1 小时前
UE5学习笔记 FPS游戏制作33 换子弹 动画事件
笔记·学习·ue4
2401_884810741 小时前
Spring-MVC笔记上(上)
笔记·spring·mvc
吴梓穆1 小时前
UE5学习笔记 FPS游戏制作31 显示计分板
笔记·学习·ue4
mingyuewu2 小时前
MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
macos·docker·容器
小小寂寞的城2 小时前
Ubuntu里安装Jenkins
ubuntu·ci/cd·docker·jenkins
画个逗号给明天"3 小时前
C#从入门到精通(5)
开发语言·笔记·c#
杉之3 小时前
Java中的不可变集合
java·笔记·学习
郭涤生4 小时前
Chapter 5: The Standard Library (C++20)_《C++20Get the details》_notes
开发语言·c++·笔记·c++20