Docker相关

本文详细解释了Dockerfile中的关键命令COPY、RUN、EXPOSE和CMD,以及如何使用COPY--chown设置文件权限。还介绍了如何基于基础镜像构建新镜像,配置Dockerdaemon.json以使用镜像源,以及常用的Docker命令和镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker

Dockerfile

FROM ubuntu:latest

ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8

# COPY会自动创建文件夹
COPY start.sh /opt/scripts/
# COPY --chown=user:group source dest

RUN chmod 755 /opt/scripts/start.sh && \
    mkdir -p "/opt/run" && \
    install -o user -g group -m 750 -d /opt/test && \
    apt-get update && \
    apt-get install -y net-tools && \
    apt-get install -y iputils-ping && \
    apt-get install -y less

# 暴露HTTP端口(80)
EXPOSE 80

CMD ["/opt/scripts/start.sh"]

COPY

Dockerfile中的COPY命令是用来将本地主机的文件或目录复制到正在构建的镜像内部的命令。这个命令是构建Docker镜像过程中非常重要的一部分,用于将应用所需的源代码、配置文件或者其他静态资源等复制到镜像中。

基本语法:

COPY [--chown=<user>:<group>] <src>... <dest>
  • <src>:源文件或目录,可以是多个,逗号分隔,这些文件或目录必须位于构建上下文目录中。构建上下文指的是docker build命令执行时,通过-f参数指定的Dockerfile所在目录及其子目录。
  • <dest>:目标路径,这是镜像内部的路径,Docker会自动创建必要的目录结构。

命令特性:

  1. 保持权限:COPY命令会保留文件原有的权限、属主和属组信息(如果不使用--chown选项覆盖的话)。
  2. 递归复制:如果<src>是一个目录,Docker会递归复制该目录下的所有文件和子目录到目标路径。
  3. 目标路径不存在则创建:如果目标路径在镜像中不存在,Docker会在执行COPY命令时创建所需的目录结构。
  4. 构建上下文:COPY命令只能复制构建上下文内的文件,不能直接复制宿主机其他位置的文件。

示例:

COPY ./app /app
COPY requirements.txt /usr/src/app/
COPY config/* /etc/myconfig/
  • 第一行命令将当前目录下的app目录及其内容复制到镜像的根目录下的/app目录。
  • 第二行命令将requirements.txt文件复制到镜像中的/usr/src/app/目录下。
  • 第三行命令将当前目录下config/目录下的所有文件复制到镜像的/etc/myconfig/目录下。

关于–chown选项:

COPY --chown=user:group source dest

这个选项允许你在复制文件的同时改变文件的拥有者和所属组,这对于在容器内部设置正确的文件权限非常有用。例如,--chown=root:root会让复制过去的文件所有权变为root用户和root组。

常用命令

# 拉取镜像
docker pull ubuntu:latest
# 构建镜像
docker build -t myapp:1.0 .
# 运行镜像
docker run -itd myapp:1.0

# 查看镜像
docker images
# 删除镜像
docker rmi 镜像id

# 查看运行的镜像
docker ps -a
# 强制停掉运行的镜像
docker kill 容器id
docker stop 容器id
# 启动或重启容器
docker start 容器名称或者容器id
docker restart 容器名称或者容器id
# 获取容器元数据
docker inspect 容器名称或者容器id

# 将容器生成新的镜像
docker commit 容器id myapp:1.0
# 将tar格式镜像文件加载到本地Docker环境
docker load -i myapp.tar
# 将Docker镜像保存为tar归档文件
docker save -o myapp.tar myapp:1.0

# 进入容器
docker exec -it xxxxx bash
docker exec -it -u root --privileged xxxxx bash

镜像运行

docker run -itd --rm \
-e TZ="Asia/Shanghai" \
-e LANG="C.UTF-8" \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-p 40080:80 \
-w /home/ \
myapp:1.0

# -it: 这是两个参数的组合 -i 和 -t。-i 使容器的标准输入保持打开,-t 分配一个伪终端,通常一起使用以交互模式运行容器。
# -d, --detach: 在后台运行容器,并返回容器ID。这意味着你可以在宿主机上继续使用终端,而容器将在后台运行。
# --rm: 当容器退出时自动删除容器。这对于临时任务或一次性任务很有用。
# --name NAME: 为容器指定一个名称。如果不指定,Docker 将自动为容器生成一个名称。
# -e, --env: 设置环境变量。你可以使用此参数为容器内的应用程序提供配置信息。
# -v, --volume: 挂载卷。你可以使用此参数将宿主机上的目录或文件挂载到容器内,以便共享数据。
# -p, --publish: 发布容器的端口到宿主机上。格式为 hostPort:containerPort。
# --privileged=true: 给容器额外的权限。使用此参数,容器内的进程可以获得几乎与宿主机上的进程相同的权限。
# --hostname: 设置容器里面的主机名,登陆到容器里面可以看到
# -w, --workdir: 设置容器内的工作目录。该目录下的路径将用作后续指令的当前目录。
# --entrypoint: 覆盖镜像中定义的默认入口点。
# -u, --user: 指定运行容器时的用户名或UID。
# --restart: 重启策略。可以设置为 no(默认,不重启)、always(总是重启)、on-failure(仅在容器退出状态不为0时重启)或 unless-stopped(除非用户明确停止容器,否则总是重启)。
# --network: 指定容器使用的网络。默认情况下,容器将使用 bridge 网络。
# --memory: 为容器设置内存限制。
# --link: 连接到另一个容器。此参数可以使容器之间通过名称相互通信,但现在建议使用Docker网络来实现容器间的通信。
# --health-cmd, --health-interval, --health-retries, --health-timeout: 这些参数与健康检查相关,用于配置容器的健康状况检查命令和相关的时间间隔、重试次数和超时时间。
# --security-opt: 指定安全选项。
# --shm-size: 设置 /dev/shm 的大小。这对于某些需要大量共享内存的应用程序很有用。

# docker create与docker run类似
# docker update 动态更新容器配置

docker inspect用法

# 获取容器元数据
docker inspect 容器名称或者容器id

# 进程pid
docker inspect -f '{{.State.Pid}}' 015f40918b1d
# Binds
docker inspect -f '{{json .HostConfig.Binds}}' 015f40918b1d
# Mounts
docker inspect -f '{{json .Mounts}}' 015f40918b1d

# 参考 https://blog.youkuaiyun.com/yuelai_217/article/details/125266030

Docker配置相关命令

# 启动/重启docker
systemctl start docker
systemctl restart docker
# 停止docker
systemctl stop docker
# 查看docker状态
systemctl status docker
# 开机启动docker
systemctl enable docker

# docker镜像源
cat /etc/docker/daemon.json
mkdir -p /etc/docker/; vi /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker

/etc/docker/daemon.json

{
    "registry-mirrors": [
        "https://mirror.ccs.tencentyun.com"
    ]
}


{
    "registry-mirrors": ["https://hub-mirror.c.163.com/"]
}

示例:基于基础镜像构建新镜像

# 新镜像名
tz_image_name="ubuntu"
# 新镜像版本号
tz_image_version="latest_tzz"
# 保存的新镜像文件名
tz_image_file="${tz_image_name}_${tz_image_version}.tar.gz"

# 构建新镜像(Dockerfile所在目录)
docker build --no-cache -t "${tz_image_name}:${tz_image_version}" .
# 查看镜像列表
docker images | grep -i ${tz_image_name}
# 保存新镜像文件(不压缩)
docker save "${tz_image_name}:${tz_image_version}" -o "${tz_image_file}"
# 保存新镜像文件(使用gzip压缩)
docker save "${tz_image_name}:${tz_image_version}" | gzip > "${tz_image_file}"

常用镜像

https://hub.docker.com/

ubuntu:latest (77.9MB)
mysql:5.7
java:8-alpine (145MB)
golang:1.16-alpine (302MB)

openjdk:8-jdk
openjdk:8u312-jdk-oracle
golang:1.16 (920MB)
golang:1.16-buster

maven:3.8.4-ibmjava-8-alpine

参考

参考
https://blog.youkuaiyun.com/m0_59029800/article/details/129988262
https://blog.youkuaiyun.com/m0_67391121/article/details/126640864

docker命令参考
https://www.runoob.com/docker/docker-command-manual.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值