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
相关推荐
意疏1 小时前
怕剧透?SyncTV+cpolar 让异地闺蜜追剧进度分秒不差
docker
3***16101 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
BullSmall1 小时前
15分钟速通Docker核心实战
运维·docker·容器
e***v3561 小时前
IDEA+Docker一键部署项目SpringBoot项目
spring boot·docker·intellij-idea
小马爱打代码1 小时前
k8s:SpringBoot应用容器化
spring boot·容器·kubernetes
u***28472 小时前
如何在docker中的mysql容器内执行命令与执行SQL文件
sql·mysql·docker
q***65692 小时前
使用 Docker 部署 RabbitMQ 的详细指南
docker·容器·rabbitmq