前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker︱docker run的解读与一键部署

docker︱docker run的解读与一键部署

作者头像
悟乙己
发布2021-12-07 13:59:56
6990
发布2021-12-07 13:59:56
举报
文章被收录于专栏:素质云笔记素质云笔记

这是之前的文章: docker︱在nvidia-docker中使用tensorflow-gpu/jupyter

文章目录

1 docker run的解读

1.1 docker run

docker run有非常多的启动参数,可参考:Docker run 命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • –rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name=“nginx-lb”: 为容器指定一个名称;
  • –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=“ritchie”: 设置环境变量;
  • –env-file=[]: 从指定文件读入环境变量;
  • –cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • –link=[]: 添加链接到另一个容器;
  • –expose=[]: 开放一个端口或一组端口;
  • –volume , -v: 绑定一个卷

其中有几个笔者非常容易混淆的: –rm –rm 运行之后删除这个container 默认情况下,每个容器在退出时,它的文件系统也会保存下来,这样一方面调试会方便些,因为你可以通过查看日志等方式来确定最终状态。另外一方面,你也可以保存容器所产生的数据。 但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。 这个时候你就需要--rm这个参数了。 注意:--rm-d不能共用!

-d 如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。 此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的回话中。 需要注意的是,容器运行在后台模式下,是不能使用--rm选项的。

**-it **

-it 是 -i -t 的缩写 -i 接受用户输入 -t 模拟终端模式

bash bash以命令行形式启动 一般会看到: sudo docker run -it -p 7100:7100 -p -v /home:/mnt $container --restart=always --name mstar -ti image_name bash

1.2 几种进入容器的方式

docker exec -i -t mynginx /bin/bash mynginx 可以是docker的名称也可以是containID docker attach containID

2 docker .sh形式启动

如何在docker之中,程序自动启动 来看一下多个.sh文件同时启动:

docker run -idt ***/*** /bin/bash cs1.sh; cs2.sh; cs3.sh

但是,如何写好这个.sh需要蛮多

2.1 常规报错

报错一: exec user process caused "exec format error" 解决: https://blog.csdn.net/qq_24452475/article/details/83242610 Script脚本 开头必须加 #!/bin/bash,不然就会报错

报错二: starting container process caused "exec: \"/entrypoint.sh\": permission denied": unknown 解决: 需要给予.sh文件chmod权限 chmod 777 ./test.sh

报错三: exec user process caused "no such file or directory" 解决: 确定你的.sh文件确保存在,因为docker之中和你的宿主机不同

报错四: “/bin/bash^M: bad interpreter: No such file or directory” 解决: 文件格式问题 dos2unix filename

2.2 常规写法步骤

步骤一:基本格式配置 .sh基本格式,譬如:

代码语言:javascript
复制
#!/bin/bash
pip3 install --pre numpy==1.17.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install --pre xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install --pre sanic_cors -i https://pypi.tuna.tsinghua.edu.cn/simple
cd /mnt/drug
python3 recommendation.py

链式代码“&&”把多行指令结合成一行

步骤二:格式+权限调整

代码语言:javascript
复制
chmod 777 filename.sh
dos2unix filename.sh

chmod给权限,dos2unix调整格式

2.3 几个实践case

代码语言:javascript
复制
sudo docker run  -it -p 7100:7100 -p 7101:7101  -v /etc/localtime:/etc/localtime:ro -v /home:/mnt $container --restart=always --name mstar  -ti tensorflow:lasted  /mnt/test.sh

--restart=always,开机总启动

加了-d之后,就代表在后台运行。不过,如果是接口类的,加入并不好,因为你可能还是需要可以看到一些记录

在这里插入图片描述
在这里插入图片描述

3 docker打包成.rar一键部署

Docker 脚本化一键部署

3.1 docker 容器导出和导入(export / import )

代码语言:javascript
复制
$ docker export my_centos > /data/app/meifen/my_centos-export-0428.tar
$ docker import  /data/app/meifen/my_centos-export-0428.tar

3.2 docker 镜像的加载与导入(save / load)

使用 docker images 查看本机已有的镜像(也可以使用 docker commit 命令把一个正在运行的容器保存为镜像)

docker 保存save 格式:docker save IMAGE(镜像)

代码语言:javascript
复制
$ docker save 9610cfc68e8d > /data/app/meifen/my_centos-export-0428.tar
docker load < /home/my_centos-export-0428.tar

加载 load 有点慢,稍微等待一下,没有任何warn信息就表示保存OK。9610cfc68e8d 是镜像ID

3.3 容器与镜像导入/导出的差异

  • 容器导入(export / import )
    • 是将当前容器变成一个新的镜像 2
    • export 只导出当前的信息
    • export导出的镜像文件大小 小于 save保存的镜像
    • export是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag )
  • 镜像导入 (save / load)
    • 是复制镜像的过程
    • save 保存镜像所有的信息-包含历史 2
    • save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)(查看方式:docker images --tree)

4 精简Docker镜像大小的必要性

Docker 脚本化一键部署

4.1 docker大小精简的方式

下面是精简Docker镜像尺寸的好处:

  • 减少构建时间
  • 减少磁盘使用量
  • 减少下载时间
  • 因为包含文件少,攻击面减小,提高了安全性
  • 提高部署速度
  • 清除 yum 缓存
代码语言:javascript
复制
$ yum clean headers
$ yum clean packages
$ yum clean all
  • 清除无用的tar.gz安装包
  • 选择更小的基础镜像

4.2 清理Docker占用的磁盘空间的方式

命令查看磁盘使用情况

$ du -hs /var/lib/docker/

用于查看Docker的磁盘使用情况

docker system df

清理磁盘 $ docker system prune

可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。

$ docker system prune -a

迁移 /var/lib/docker 目录

5 Dockerfile

Dockerfile中文名叫镜像描述文件,是一个包含用于组合镜像目录的文本文档,也可以叫“脚本”。他通过读取Dockerfile中的指令安装步骤自动生成镜像。

补充:文件名称必须是:Dockerfile

有些github开源项目之中,就会有,那么可以照着下面的使用方法:

docker build -t 机构/镜像名称<:tags> Dockerfile目录 比如如下,最后一个.代表当前目录,因为我的Dockerfile文件就在这,也可以用绝对路径

代码语言:javascript
复制
docker build -t chentongwei.com/mywebapp:1.0.0 .
docker images

然后执行docker images 进行查看会发现有我们刚才构建的镜像 此时就在安装dockerfile,之后该docker会被命名为:chentongwei.com/mywebapp:1.0.0

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1 docker run的解读
    • 1.1 docker run
      • 1.2 几种进入容器的方式
      • 2 docker .sh形式启动
        • 2.1 常规报错
          • 2.2 常规写法步骤
            • 2.3 几个实践case
            • 3 docker打包成.rar一键部署
              • 3.1 docker 容器导出和导入(export / import )
                • 3.2 docker 镜像的加载与导入(save / load)
                  • 3.3 容器与镜像导入/导出的差异
                  • 4 精简Docker镜像大小的必要性
                    • 4.1 docker大小精简的方式
                      • 4.2 清理Docker占用的磁盘空间的方式
                      • 5 Dockerfile
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档