docker 简要笔记
一、前提内容
linux 查询版本 通常:
cat /etc/os-release
1、docker 环境准备
需要构造一个docker环境
Tips:
截止文档生成,版本为27.5.0
这里基于rhel
来说明 ,官方部署参考网站
0、首次安装
设置 Docker 存储库
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
1、基础目录
mkdir /opt/docker
2、下载基础包
这里是基于
2025.01.16
为截止日期的最新版本docker
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、安装部署
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
sudo yum install docker-compose-plugin
(图1-1)
1、验证安装
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)
[2、基于node.js的镜像参考](node - Official Image | Docker Hub)
[3、基于python的镜像参考](python - Official Image | Docker Hub)
2、国内镜像源
1、增加镜像源
主要是为了避免引用基础镜像失败。
默认安装的docker,直接编辑这个即可
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"}
}
重启生效
sudo systemctl daemon-reload #重启daemon进程
sudo systemctl restart docker #重启docker
3、基础的dockerfile
这里通常目录结构为
workplace |____ Dockerfile (下文的示例DockerFile)
|____ target(编译的目录,通常这里放需要打包的jar即可)
Tips: 这里之前建议执行下属命令,避免找不到基础镜像
docker pull eclipse-temurin:8
# 使用官方的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点
的目录接口下执行
# 构建镜像
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 应用程序。
# 后台启动
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
端口
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,再使用镜像即可
基于此,这里示例一个
REPOSITORY TAG IMAGE ID CREATED SIZE demo 1.10 5251d5eba4a8 4 days ago 544MB
属性解析
这里与上述差别在于,使用
image
来替换build
及其子属性
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内容值
CONTAINER_NAME=demo-test
image.env 文件
TEST=test one 2
HI=hi one 2
例子利用 2.1.2
来作参考
新增属性
env_file
用来设置参数变量
version: "3"
services:
demo-endpoint:
container_name: ${CONTAINER_NAME}
image: ${IMAGE_NAME}:${IMAGE_TAG}
ports:
- "8080:8080"
env_file:
- /env_file/image.env
示例应用代码
@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模式
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模式
version: "3"
services:
demo:
mem_limit: 512m # 限制内存使用为 512MB
cpus: 0.5 # 限制 CPU 使用率为 50%