容器工具,用来作资源隔离,如进程空间隔离、文件系统隔离、网络隔离等。
文章目录
-
- [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有两种形式的写法:
-
ENTRYPOINT ["java", "-jar", "/app.jar"]容器启动是直接执行
java -jar /app.jar,java进程是容器的1号进程,可以接受发给容器的信号,容器退出时的退出码也是java进程的退出码,但是无法展开环境变量。CMD的内容会拼接在后面作为java的参数。 -
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