Docker

容器工具,用来作资源隔离,如进程空间隔离、文件系统隔离、网络隔离等。

文章目录

    • [1. docker-compose 常用写法](#1. docker-compose 常用写法)
    • [2. 常用镜像下载](#2. 常用镜像下载)
    • [3. docker镜像相关命令](#3. docker镜像相关命令)
    • [4. entrypoint与cmd](#4. entrypoint与cmd)
    • [5. docker容器中报错insufficient memory for the Java Runtime Environment](#5. docker容器中报错insufficient memory for the Java Runtime Environment)

1. docker-compose 常用写法

yaml 复制代码
# docker-compose.yml
version: "3.9"

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80" # 宿主机8080端口映射到容器中的80端口
    volumes:
      - ./html:/usr/share/nginx/html # 宿主机./html挂载到容器中的/usr/share/nginx/html目录

2. 常用镜像下载

国内镜像源: https://docker.aityp.com/

bash 复制代码
# jdk8
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/eclipse-temurin:8-jdk-linuxarm64
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/eclipse-temurin:8-jdk-linuxarm64  docker.io/eclipse-temurin:8-jdk

# nginx1.27.3
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:latest-linuxarm64
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:latest-linuxarm64  docker.io/nginx:latest

#postgresql7.5-1.pgdg120+1
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/postgres:latest-linuxarm64
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/postgres:latest-linuxarm64  docker.io/postgres:latest

3. docker镜像相关命令

bash 复制代码
# 镜像列表
docker images

# 镜像详情
docker inspect <imgid>

4. entrypoint与cmd

在Dockerfile和docker-compose中可以指定entrypoint和cmd,docker-compose会覆盖Dockerfile中的配置。

entrypoint是容器的启动命令,cmd会作为参数追加到entrypoint后面。

entrypoint有两种形式的写法:

  1. ENTRYPOINT ["java", "-jar", "/app.jar"]

    容器启动是直接执行java -jar /app.jar,java进程是容器的1号进程,可以接受发给容器的信号,容器退出时的退出码也是java进程的退出码,但是无法展开环境变量。CMD的内容会拼接在后面作为java的参数。

  2. ENTRYPOINT java -jar /app.jar

    容器启动时实际执行的是sh -c 'java -jar /app.jar',sh进程是1号进程,java是sh的子进程,无法收到发给容器的信号,容器退出时的退出码是sh的退出码,但是可以展开环境变量。CMD的内容会拼接在sh -c 'java -jar /app.jar'的后面,不能成为java程序的参数 ,根据sh -c的解释,其会作为1 2等变量传给java进程。另外需要注意sh无法解析带-的环境变量,因此在docker-compose中配置的带-的环境变量无法传递给java进程。

为了解决数组形式的entrypoint无法展开环境变量:

在Dockerfile中:

COPY ./entrypoint.sh /entrypoint.sh

RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh如下:

bash 复制代码
#!/bin/bash

# exec会使用java进程替换掉当前bash进程,而不是作为子进程运行
env # 打印环境变量
exec java ${JAVA_OPT} -jar /app.jar

5. docker容器中报错insufficient memory for the Java Runtime Environment

yaml 复制代码
# 开启特权级能解决
privileged: true
相关推荐
运维全栈笔记17 小时前
K8S部署Redis高可用全攻略:1主2从3哨兵架构实战
redis·docker·云原生·容器·架构·kubernetes·bootstrap
SCBAiotAigc19 小时前
2026.5.1:`DockerDesktop must be owned by an elevated account`错误的解决办法
人工智能·docker·具身智能
AI木马人19 小时前
9.人工智能实战:GPU 服务如何上 Kubernetes?从单机部署到 K8s + NVIDIA Device Plugin + HPA 的生产级改造
人工智能·容器·kubernetes
身如柳絮随风扬1 天前
使用 Docker 部署禅道并实现自动化部署——从项目搭建到运维自动化的完整指南
运维·docker·自动化
eRTE XFUN1 天前
docker下搭建redis集群
redis·docker·容器
一只小bit1 天前
Docker 存储卷:本地文件与容器内部文件建立绑定关系
运维·docker·容器
都在酒里1 天前
在公共服务器上构建 RK3588 SDK 的纯净 Docker 方案
运维·服务器·docker
jeCA EURG1 天前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
身如柳絮随风扬1 天前
使用 Docker 部署 Jenkins 并实现自动化部署 —— 从零到一的 CI/CD 实践指南
docker·自动化·jenkins
就叫飞六吧1 天前
docker快速启动sqlserver实例并自动测试shell脚本
docker·容器·sqlserver