Docker入门流程(创建容器到构建镜像)

这篇具有很好参考价值的文章主要介绍了Docker入门流程(创建容器到构建镜像)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker入门流程(创建容器到构建镜像)

平时我们经常会遇到在自己电脑上运行的代码,在别人的电脑上运行就出现莫名其妙的问题,这种大多是因为代码”水土不服“,不同电脑的软件版本和依赖库不同,Docker的使用可以很好地解决这个问题。简单来说,Docker可以把代码和代码运行的环境一把打包,构建一个容器,你可以在这个容器里面运行代码。另外注意一点,虚拟机也可以用Docker。

一、Docker的安装和操作命令

1、Docker简介、安装与镜像加速器

Docker是开源的应用程序容器引擎,环境打包可移植,不同容器相互隔离,目的是解决软件的跨环境迁移问题。Docker的安装网上有很多教程,可以参考这个链接,里面也有一些介绍,可能需要科学上网。

Docker有三个基本概念,仓库,容器和镜像。具体详细内容很好搜到,上述链接也有。简单来说,①镜像(Image),镜像可以看成一个独立的最小文件系统,比如Ubuntu:18.04,镜像名称Ubuntu,冒号后面的是tag版本号。②容器(Container),容器是很久镜像构建的,一个很好的比喻是镜像看成定义好的,容器看成根据类实例化的对象。③仓库可以看出很多镜像的储存库,有官方的docker hub仓库,也有公司、私人建立的,一般我们拉取镜像不设置镜像拉取地址,都会默认从官方拉取,和换源安装软件的道理一样。

通常我们拉取官方镜像比较慢,甚至很慢,所以一般都会配置镜像加速器,有网易、阿里、中科大等各种加速器,你也可以配置多个,拿阿里加速器举例,搜索阿里云,注册登录,在控制台搜索容器镜像服务,左边的镜像工具打开会看到镜像加速器,根据提示完成配置。

2、Docker操作命令

①Docker服务相关命令:

服务相关命令用的频率会比较少,稍微了解下,设置开机自启docker就好。

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

②Docker的镜像相关命令

镜像的命令用的多的主要是查看,拉取和删除镜像。

docker images        #查看镜像
docker images -q     #查看镜像id
docker search  name   #网上搜索镜像,可以搜好再拉取
docker pull redis:5.0    #拉取镜像例子
docker rmi resdis:5.0 /image id  #删除镜像例子
docker rmi `docker images -q`   #删除所有镜像

③Docker的容器相关命令

拉取完镜像之后,需要根据镜像去创建容器,容器有两种状态,一种运行up,一种退出exit,在创建容器时需要知道一些参数说明。

docker新建容器,docker,容器,运维

如果创建使用-t则直接进入这个容器,如果是-d创建的,docker ps ​​可以看到这个容器在运行,之后需要docker exec -it​ 并加上/bin/bash​进入这个容器。之后便是在容器里面操作或者删除容器。

docker ps  #查看正在运行的容器
docker ps -a  # 查看所有容器,up 运行  exit退出
docker run -it --name=c1  centos:7 /bin/bash  # (bash 交互式的shell,默认也是这个)交互式的
docker run -id --name=c2 centos:7  #守护容器 后台运行需要
docker exec -it c2 /bin/bash  #进入这个容器 ,需要bash   守护容器进入exit不会关闭,需要stop
docker stop  c1     #停止一个容器
docker start c1     #开启一个容器
docker rm c1        #不能删除正在运行的容器
docker inspect c1   #查看容器信息

二、数据卷和镜像构造

1、数据卷配置

Docker中产生的一些实验数据结果会随着容器的删除而消失,这个时候就需要挂载数据卷。

一个容器可以挂载多个数据卷,数据卷就是宿主机的一个目录。本质就是:容器挂载一个外部数据卷,修改和产生的数据放在数据卷里,双方会同步映射,这样的话容器产生的数据可以放在宿主机的目录下,容器间也可以交换数据。容器删除了,数据卷内容还在。

另外还可以配置数据卷容器,让其他容器映射这个数据卷容器,用的不太多。

比如:

docker run -it --name=c1  -v ~/data:/root/data centos:7 /bin/bash #左边宿主机目录:右边容器目录
挂载多个就多个-v,容器加root,相当于~根目录,相当于一个映射文件夹,但是数据卷的内容不会随着容器的删除而消失

#配置数据卷容器
docker run -it --name=c3 -v /volume centos:7 
容器内部创建一个volume目录,对应宿主机目录下的一个文件,可以通过docker inspect 查看mounts
docker run -it --name=c1 --volumes-from c3 centos:7 
c1 下也会创建一个volume目录,都是相互映射的,对应宿主机目录下的一个文件

2、镜像构建概念

构建镜像前,了解一些概念。linux的文件系统是由bootfs和rootfs组成的,简答来说,不同linux的发行版的bootfs相同,rootfs不同,windows和linux的bootfs不同。镜像可以看成一个文件系统,是一层一层堆叠的,在构建容器是会使用宿主机的bootfs,因此windos和linux的镜像不能互用。镜像的最底层也就是boofs,第二层就是rootfs,比如ubuntu,centos等。后面可以继续堆叠,注意上一层是在下一层的基础上进行叠加。一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像当从一个镜像后动容器时,,Docker会在最顶层加载一个读写文件系统作为容器,所以一些层数高的镜像size会比较大。

docker新建容器,docker,容器,运维

1.Docker镜像本质是什么?

答:是一个分层文件系统。
2.Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?。
答:Centos的iso镜像文件包含bootfs和rootfs,而docker的certos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
3.Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
答:由于docker中镜像是分层的,tomat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

3、镜像构建方法

①根据容器构建镜像

主流是dockerfile创建镜像,这个利用commit命令将容器转为镜像,镜像压缩save,传输再load镜像,根据镜像去创建容器。

docker commit contanier_id  mya:1.0  # 容器id  和自定义的镜像名称
docker images
docker save -o aa.tar mya:1.0  #将镜像保存为压缩包,可以给别人
docker load -i aa.tar            #别人拿到了load一下就可以导入镜像了
docker images
docker run -it --name=myaa mya:1.0 bash  #根据镜像创建容器

②根据dockerfile去创建容器

Dockerfile 是一个文本文件,包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。一般遇到具体命令就去搜一搜,网上很多dockerfile的关键字。参考链接2,几个关键的:

FROM  基础镜像
ADD   会解压缩
WORKDIR  进入容器停留的目录
CMD  启动容器的时候运行 (一般有的默认/bin/bash)
RUN   启动容器前运
之后在已有镜像上去下载 安装一些东西,build为一个自己的镜像
docker build -f dockerfile  -t myimg:1.0 . 会加一个.  跟目录有关

3、Docker compose和私有仓库

这个简单说下,实际应用过程中,不止一个容器,如何管理多个容器,根据镜像去创建容器,此时需要docker compose按照一定的规则批量管理多个容器。编写docker-compos.yml 管理构建多个容器,启动的命令 就是 docker-compose up。(在有docker-compose.yml文件下运行docker-compose up (加-d 后台守护运行)),开启多个运行的容器。

私有仓库里面可以放一些自己的镜像,具体网上很多,这边提个概念。搭建私人仓库,可以上传自己的镜像,拉取自己的镜像。大概流程是下载了一个私人仓库镜像,根据这个镜像建立了一个私人仓库容器,其实就是加了一个ip地址和端口号。

docker新建容器,docker,容器,运维

docker新建容器,docker,容器,运维

三、Docker中搭建ROS容器

这个是和自己的研究有关,做一个完整的记录。

1、拉取镜像,构建容器

sudo docker pull osrf/ros:melodic-desktop-full​,参考链接3,比较全。

如果是包含ros-core的镜像,大概是400M,如果包含rviz,gazebo等全套的destktop-full版本,大概是5G左右,占据的空间还是很可观的。

之后可以参考下图构建容器,利用-v挂载数据卷,设置共享显示的目的是:容器里运行如rviz的可视化界面会在宿主机上显示看到

docker新建容器,docker,容器,运维

宿主机开启xhost, 使能宿主机接收其他客户端的显示需求 运行 xhost +

docker创建容器时参数设置xserver挂载地址即可

-e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix

运行完之后容器显示的rviz可以在宿主机上显示,这些都是固定命令

-v /tmp/.X11-unix:/tmp/.X11-unix # 挂载本地显示服务端口到容器中

-e DISPLAY=unix$DISPLAY # 修改环境变量DISPLAY

-e GDK_SCALE # 与显示效果相关的环境变量

-e GDK_DPI_SCALE # 同上

一般挂载一个代码目录,一个数据生成目录,这样开启数据卷和显示设置之后,创建并进入容器,可以在宿主机修改文件和代码,自动映射到容器内。

有个注意点是容器内产生的数据会在root用户下,这个时候可以使用sudo chmod -R 777 文件目录​ 去修改权限,使用sudo chown -R 用户名 文件目录​去修改所有者

2、可能错误和注意

错误:

no such file or directory): exec: “nvidia-container-runtime”:
executable file not found in $PATH: : unknown.

安装nvidia-docker

策略

curl https://get.docker.com | sh && sudo systemctl --now enable dockerdistribution= ( . / e t c / o s − r e l e a s e ; e c h o (. /etc/os-release;echo (./etc/osrelease;echoID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

curl -s -L [https://nvidia.github.io/nvidia-docker/ d i s t r i b u t i o n / n v i d i a − d o c k e r . l i s t ] ( h t t p s : / / n v i d i a . g i t h u b . i o / n v i d i a − d o c k e r / distribution/nvidia-docker.list](https://nvidia.github.io/nvidia-docker/ distribution/nvidiadocker.list](https://nvidia.github.io/nvidiadocker/distribution/nvidia-docker.list) | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo -E apt-get update

sudo -E apt-get install -y nvidia-docker2

对于ros镜像创建的容器,有一个ros_entrypoint.sh文件,为了保证容器内可以正常运行 ros 环境,需要在根目录下执行:

source ros_entrypoint.sh,本质就是source环境变量

之后就是正常操作了…文章来源地址https://www.toymoban.com/news/detail-719901.html

到了这里,关于Docker入门流程(创建容器到构建镜像)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker构建jar包镜像并运行容器

    Docker需要提前安装,不懂的参考: Centos7操作Docker_JohnGene的博客-CSDN博客_centos7 操作docker 安装Docker安装Docker官方源:yum-config-manager –add-repo http://download.docker.com/linux/centos/docker-ce.repo更新源:yum makecache fast安装:yum install docker-ce启动并设为开机自启:systemctl enable docker #设为开机

    2024年02月09日
    浏览(52)
  • Docker进阶:容器数据卷与Dockerfile构建镜像(发布)

    💖The Begin💖点点关注,收藏不迷路💖 1、完成数据持久化和共享数据,docker容器中的数据,同步到本地。 2、重要数据back_up 特点: 实时生效、数据卷可在容器之间共享和重用数据、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期会一直延续到没有容器使用它为止

    2024年02月09日
    浏览(39)
  • Docker容器:docker数据管理、镜像的创建及dockerfile案例

    因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在;还有一种方式,容器之间共享文件即相当于有个备份,也会解决停止容器后数据消失的问题。 管理 Docker 容器中数据主要有两种方式:数据卷(

    2024年02月12日
    浏览(38)
  • Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例

    目录 一、理论 1.Docker镜像的创建方法 2.Docker镜像结构的分层 3.Dockerfile 案例 4.构建Systemctl镜像(基于SSH镜像) 5.构建Tomcat 镜像 6.构建Mysql镜像 二、实验 1.Docker镜像的创建 2. Dockerfile 案例 3.构建Systemctl镜像(基于SSH镜像) 三、问题 1.nginx网页打不开  2.Apache容器启动一直为Ex

    2024年02月12日
    浏览(42)
  • Docker 的数据管理、容器互联、镜像创建

    目录 一、数据管理 1.数据卷 2. 数据卷容器 二、容器互联(使用centos镜像) 三、Docker 镜像的创建 1.基于现有镜像创建 1.1首先启动一个镜像,在容器里修改 1.2将修改后的容器提交为新的镜像,需使用该容器的id号创建新镜像 2.基于本地模板创建 2.1下载模板文件生成镜像  2

    2024年02月16日
    浏览(47)
  • (docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】

    容器的第一次创建,需要先下载镜像,从 0、可以搜索镜像的版本 1、先拉取MySQL的镜像,默认拉取最新版,使用下面的命令拉取mysql镜像 也可以指定mysql的版本(我这里指定的是5.6版本) 2、在~(/root)目录下创建一个mysql的文件夹,用于保存mysql产生的数据,并进入mysql文件 在/

    2024年02月13日
    浏览(34)
  • Docker 仓库与注册表: 构建可靠的容器镜像生态系统

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月17日
    浏览(36)
  • docker容器:docker镜像的三种创建方法及dockerfile案例

    目录 一、基于现有镜像创建 1、创建启动镜像 2、生成新镜像 二、基于本地模板创建  1、OPENVZ 下载模板 2、导入容器生成镜像 三、基于dockerfile创建  1、dockerfile结构及分层 2、联合文件系统 3、docker镜像加载原理 4、dockerfile操作常用的指令 (1)FROM指令 (2)MAINTAINER 指令 (3)RUN指令

    2023年04月20日
    浏览(45)
  • Docker概念|容器|镜像|命令详细(创建,删除,修改,添加)

    Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 是在Linux容器里运行应用的开源工具 是一种轻量级的”虚拟机“ Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。 docker本质就是宿主机的一个进程,

    2023年04月19日
    浏览(35)
  • k8s服务部署核心流程:以Jenkins为核心,从Gitee拉取代码,然后进行maven构建,之后使用docker命令打镜像,并推送镜像到harbor仓库,之后远程调用k8s命令创建服务

    前提是我们在自己电脑上模拟整个流程。 假设我们需要搭建一主一从的k8s集群,那就需要安装VMvare和Centos7(点击我查看安装文档), 然后就可以在这两个虚拟机上搭建k8s集群了(点击我查看安装文档), 一个最简单的devops流程已经在标题中写明了, 其中可以搭建gitlab(点

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包