前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker 镜像制作示例

docker 镜像制作示例

原创
作者头像
谛听
修改2021-11-20 15:37:49
3.6K0
修改2021-11-20 15:37:49
举报
文章被收录于专栏:随意记录随意记录

本文以将 rustdesk-server-demo 制作为 docker 为例,讲述 docker 镜像制作过程。

1 编译得到可执行的二进制文件

安装好 rust 语言后,编译 rustdesk-server-demo:

代码语言:txt
复制
cd ~/github/rustdesk-server-demo
mkdir -p target/releae
cargo build --release

得到可直接执行的二进制文件路径为 ./target/release/rustdesk-server

可以验证可执行文件是否正确:

代码语言:txt
复制
IP=127.0.0.1 ./target/release/rustdesk-server

2 编写 Dockerfile

server.Dockerfile:

代码语言:txt
复制
FROM ubuntu:bionic
LABEL maintainer="jingpingyin@xxx.com"

WORKDIR /root
RUN apt update -y && \
    apt install -y --no-install-recommends \
    curl wget nasm yasm unzip zip sudo jq vim less

COPY ./target/release/rustdesk-server /root
COPY ./entrypoint.sh /root

RUN sudo chmod 777 entrypoint.sh
CMD bash /root/entrypoint.sh
  • FROM --- 基础镜像,本例在 Unbutu 镜像的基础上制作本镜像。
  • WORKDIR --- 设置镜像内的工作目录,本例中为 /root。
  • RUN --- 在 docker 内执行命令,多个 RUN 命令合并成一个,可以减小镜像大小。本例先后利用该命令安装了一些工具和修改脚本权限。
  • COPY --- 将主机上的目录或文件拷贝到 docker 镜像内,本例中:
    • 将编译生成的可执行二进制文件 ./target/release/rustdesk-server 拷贝到 docker 镜像中的 /root 目录下
    • 将 docker 启动后要执行的脚本文件 ./entrypoint.sh 拷贝到 docker 镜像中的 /root 目录下
  • CMD --- 执行容器启动命令。

容器启动后要执行的脚本 entrypoint.sh:

代码语言:txt
复制
#!/bin/bash -e

mkdir -p /root/logs
/root/rustdesk-server >> "/root/logs/server_$(date +%Y%m%d-%H%M).log" 2>&1

执行二进制文件 rustdsk-server,并将其 log 重定向到容器中的 /root/logs 目录下。

3 制作 docker 镜像

制作 docker 镜像:

代码语言:txt
复制
docker build -t 镜像仓库/xremote-server:demo -f server.Dockerfile .
  • -t --- 为镜像指定名称:标签,本例镜像名称为 镜像仓库/xremote-server,标签为 demo
  • -f --- 指定 Dockerfile,本例为 server.Dockerfile

上传 docker 镜像到指定仓库:

代码语言:txt
复制
docker push 镜像仓库/xremote-server:demo

以上两条命令中可以不指定镜像仓库,会默认上传到官方的仓库中。

4 运行 docker 容器

docker run 会自动拉取镜像并启动容器:

代码语言:txt
复制
IMAGE_FULL_TAG=镜像仓库/xremote-server:demo
CONTAINER_NAME="rustdesk-server-demo"
HOST_SIGNALING_PROT=21116
HOST_RELAY_PROT=21117
CONTAINER_SIGNALING_PORT=21116
CONTAINER_RELAY_PORT21117
IP=127.0.0.1

docker run -itd --restart=always --net bridge \
          --name "${CONTAINER_NAME}" \
          -p "${HOST_SIGNALING_PROT}:${CONTAINER_SIGNALING_PORT}/udp" \
          -p "${HOST_SIGNALING_PROT}:${CONTAINER_SIGNALING_PORT}" \
          -p "${HOST_RELAY_PROT}:${CONTAINER_RELAY_PORT}" \
          -e IP="${IP}" \
          -v "${ROOT_DIR}/logs/${CONTAINER_NAME}/:/root/logs" \
          ${IMAGE_FULL_TAG}
  • -i, --interactive,保持 STDIN 打开
  • -t, --tty,分配一个伪 TTY
  • -d, --detach,在后台运行,并打印容器 ID
  • --restart,容器重启策略,本例为无限重启
  • --net,容器的网络设置,本例为桥接模式,只有指定桥接模式才能进行端口映射
  • --name,容器的名称
  • -p, --publish,端口映射,主机端口:容器端口。注意,对于 udp 端口,要加 /udp
  • -e, --env,设置容器内的环境变量,本例设置了 IP=127.0.0.1
  • -v, --volume,挂载,主机目录:容器目录

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 编译得到可执行的二进制文件
  • 2 编写 Dockerfile
  • 3 制作 docker 镜像
  • 4 运行 docker 容器
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档