编译

1
docker build -t app .

运行测试

1
docker run --rm --privileged app -p 8080:8080

打包和导入

save 和load

1
2
docker save -o app.tar app:1.0
docker load -i /app.tar

export 和import 这里不能使用,因为环境变量会丢失

主要区别在于:

  • docker exportdocker import 只操作容器的文件系统,不处理镜像的元数据。
  • docker savedocker load 保存和恢复镜像的全部历史记录和元数据。

centos7 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM centos:centos7
# 设置维护者信息
MAINTAINER shuzhuo <shuzhuo233@163.com>
# 为镜像添加元数据
LABEL version="1.0" \
description="centos7 更改中文" \
maintainer="shuzhuo <shuzhuo233@163.com>"
# 修改时区
ENV TZ Asia/Shanghai
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \
yum makecache && yum update -y && \
yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common && localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
yum clean all
# 设置容器语言编码
ENV LANG zh_CN.UTF-8
# 设置容器的字符编码
ENV LC_ALL zh_CN.UTF-8

基于centos7 修改 java

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM centos:centos7
COPY jre /usr/local/java
# 修改时区
ENV TZ Asia/Shanghai

# 设置环境变量
# 安装中文支持包
RUN yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common && localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8

# 设置系统语言为中文
ENV LANG zh_CN.UTF-8

# 设置 JDK 环境变量
ENV JAVA_HOME /usr/local/java
ENV PATH $JAVA_HOME/bin:$PATH
# 设置容器的字符编码为 UTF-8
ENV LC_ALL zh_CN.UTF-8

EXPOSE 8080
ADD target/app.jar.bak.jar /app.jar
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","/app.jar"]

容器直接打包镜像

1
docker commit my-container my-updated-centos7:1.0

Dockerfile

ubuntu

1
docker run -it --name u2   --privileged -v /data:/data ubuntu:22.04 /bin/bash
1
docker run -d --name p1key --privileged --restart=always -v /tmp:/tmp p1key

FAQ

1.-it是什么意思? 为什么一定要加上-it 命令,不加不行吗? 其他的容器也没有加上-it命令,比如 docker run -p 80:80 nginx 就可以运行?centos就要加上,为什么?

回答:

-it 选项是 docker run 命令中的两个参数的组合,具有以下含义:

  • -i:保持容器的标准输入 (stdin) 打开,即使没有附加到终端。这个选项允许你向容器中输入数据。
  • -t:分配一个伪终端 (pseudo-tty)。这个选项会使得 Docker 分配一个伪终端设备,并绑定到容器的标准输入、输出和错误 (stdin, stdout, stderr) 上。

这两个选项一起被用于创建一个交互式终端,以便你可以与容器进行交互,比如在容器内执行命令、编辑文件等。如果不使用 -it 选项,docker run 命令将在后台运行容器,你将无法立即与其进行交互。

对于像 docker run -p 80:80 nginx 这样的命令,通常用于运行服务容器,例如 Web 服务器。在这种情况下,不需要交互式终端,因为这些服务通常是以守护进程的方式运行的,不需要用户输入或与之交互。因此,在这种情况下,不需要使用 -it 选项。

但是,如果你需要在容器内执行一些命令,编辑文件等,那么就需要使用 -it 选项来创建一个交互式终端。这也是为什么对于 CentOS 容器,我们通常会使用 -it 选项来进入交互式终端,而对于像 Nginx 这样的服务容器,通常不需要使用 -it 选项。

2.docker 拉取的centos 查看是 x86 还是x64

你可以通过 docker inspect 命令来查看 Docker 镜像的详细信息,包括架构信息。例如:

1
docker inspect --format='{{.Architecture}}' centos:7

这将显示镜像的架构信息,通常为 amd64x86_64,表示 x86_64 架构。