首页 > 其他分享 >docker使用

docker使用

时间:2023-05-16 11:55:57浏览次数:50  
标签:容器 compose -- 使用 镜像 docker Docker

Docker


 

概念 说明
Docker 镜像(Images) 用于创建 Docker 容器的模板,
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实例
Docker 客户端(Client) 一般是命令行操作,也有提供sdk自己开发
Docker 主机(Host)  
Docker Repository(库) 每个库可以包含多个标签(Tag),每个标签对应一个镜像,对应软件的不同版本,通过 <仓库名>:<标签> 的格式来指定。如果不给出标签,将以 latest 作为默认标签。
Docker Hub/Registry Docker Hub(https://hub.docker.com),很多制作好的Repository

大概是Docker本身是一个后台程序。
提供一个沙盒容器,能隔离出一块独立的区域。
把一个配置好的环境即镜像加载到容器中。
主要是镜像的制作,后续的容器操作这些。

镜像有多种方式建立,感觉上一般有一个基础的镜像。
通过仓库下载,或者已经在本地。
然后自己的应用安装上去,再生成最后的镜像。
或者写一个建镜像的脚本,用的时候生成镜像。

看着很复杂。。有自己的网络ip。看了半天操作都不知道在干啥
大概就是基础的环境组件(数据库服务,网站服务,中间件)分别弄成镜像。
然后把每个组件相应的配置文件,要执行的初始化动作做成一个脚本。
启动容器时把这些结合起来。
再把各个容器的联通起来。
感觉也就省了安装这些组件的步骤。

export里有多个tar,这里的都是镜像? 尺寸差异很到,100~600。
linux内核本身只有几十兆,然后占的空间确实是应用。主要是印象中系统尺寸都是比较大的。

看配置,会有个映射网络?
看镜像每个组件一个。为啥不几个放一起做镜像?应用需要多个组件。怎么依赖多个镜像?
想想组件真比较独立,都是分开的,数据库,nginx,tomcat。都是通过网络连接的。

镜像是由多个层(layer)组成的。然后相同镜像层只会存储一份,实际装起来没那么大。
输出镜像层信息,docker history xx。 加参数 --no-trunc 每列信息不会截断
最开始的一条应该就是linux内核,看着不同镜像都是一样的。70mb
输出镜像信息,docker inspect xx。
layers[]这里可能相同id的会共享。

Dockerfile--构建镜像
https://docs.docker.com/engine/reference/commandline
文档里说的是用这个建一个镜像再用,这边好像是用的时候一起构建

FROM--基础镜像  
Copy  把目录加到镜像中去。
Add  -没有目标路径?默认哪个位置
     ADD logs logs
RUN   docker build时执行
      RUN rabbitmq-plugins enable --offline rabbitmq_mqtt  *A

CMD/ENTRYPOINT  docker run 时执行的命令  
  CMD [ ! -f app.jar ] && echo 'no jar file' || java -jar app.jar
  ENTRYPOINT ["java","-jar","server.jar"]
docker run  时可带参数命令,CMD的会被覆盖,ENTRYPOINT不会

Volumes
  Container的数据是临时性的,关了后数据也就不在了.
  持久化的数据要映射到host上的目录。
  ./nginx/conf/proxy.conf:/etc/nginx/proxy.conf
   主机路径:docker路径  
   
 - ./data/mysql/data:/var/lib/mysql
   这个目录名好像是会自动创建的。
   
ENV  设置一个变量

WORKDIR--指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在.
说是Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大?

docker-compose
https://www.cnblogs.com/minseo/p/11548177.html
https://www.jianshu.com/p/5e800ecc2aca--常用组件配置
用于多个容器配置。感觉dockerfile是关于镜像,这个是关于容器

services:
  build - 指定dockerfile文件位置。。
     ./dispatch 
  image-镜像名称
     这里镜像不存在,会尝试拉取。
     如果有build标签的话,会构建一个镜像,然后这个就是镜像名字
container_name

网络
https://www.jianshu.com/p/3004fbce4d37
https://blog.csdn.net/zhizhuodewo6/article/details/87706638
建一个网络my-bridge,docker都设置成运行在my-bridge这个网络中。
好像也不用其他个性化的配置
内部可以通过container名字,以及开启互相访问
如访问mysql--jdbc:mysql://mysql:3306/lamp
容器外不能用名字访问,访问容器所在的机器ip,端口也是映射暴露出来的端口。
yml中的实例

ports:HOST:CONTAINER  端口映射
networks:  
 my-bridge:
   external: true;   固定写法,不知道啥含义
命令
  docker network ls

常用操作

dock-compost一般都要在相应的目录下运行
docker-compose ps -a
docker-compose up -d
docker-compose stop  
docker-compose down  删除容器,镜像。不能指定id的
docker-compose restart 
docker-compose logs -f --tail=100  会把当前目录下的所有docker container的日志都列出来
docker logs -f --tail=50 lamp  会循环读取                          
docker load -i xx.tar --装载镜像
docker images  --查看当前镜像
docker rm xx   --删除container,先停止,和docker-compose down 类似?
docker image rm  /docker rmi xx --删除镜像,这两个不清楚有啥区别,装载回来要用load
docker ps -a --查看当前docker, 
  container id-容器实例;image-所用镜像;created-镜像制作时间;status-容器启动时间;port-这个端口映射,实际开没开还得看docker里面的应用。
docker inspect xx--查看详细信息
    xx可以是containerid或者image name.
    信息很全,可以用grep来过滤下。
docker history xx   --这里镜像名称格式为name:tag.
docker volume ls    --感觉出来的和实际的完全对不起来。。
docker volume inspect xxx 

docker  exec -it nginx /bin/bash  --进入容器  exit 退出

docker名称用那个id的前几位也行.前3位
加参数 
  --no-trunc 每列信息不会截断

安装

lamp docker 分析
A:有些是直接使用基础镜像,建立容器。
B:有些是在基础镜像上再制作一层镜像,建立容器。有dockerfile文件
通过docker image ,docker ps -a。观察两者情况。

B这种都会有个dockerfile定义如何制作。

建立容器时要指定image名称。
A:还要指定具体版本,没有版本的是默认填latest
B:无需版本号。

有个jar-runner image比较特殊。
先是在magic这里定义。用的dockerfile放在并行的jar-runner目录里。
然后monitor里面的几个也是在这上面生成container。

然后就是部署操作怎么实现,数据库加载,中间件账号,配置文件修改,
镜像制作的时候会预留参数,或者文件夹作为配置接口的。
这些信息在docker仓库中会有说明。
数据库加载,镜像提供了'docker-entrypoint-initdb.d'文件夹,sql放进去就行。怎么实现的,histroy里没看明白。

容器功能的修改。
容器以外的具体应用放外部修改。

如nginx这个容器,配置
./nginx/html/:/usr/share/nginx/html/
前面是外部的对应目录,后面是内部的对应目录。
直接替换掉html目录下面的文件就行。

docker流程
docker load 装载基础镜像

到相应目录docker-compose up -d
有dockerfile的,配置里并写了build的,自动会建立该镜像。
然后启动容器。

后面再运行“up”,“restart”的话,就直接用镜像,不会重建。可以看列出来的 created 时间。

有些配置没有挂到外部存储,修改后要重新建立镜像。
这里感觉也有两种情况,
上面A这种,只是建了个容器,应该只需删掉容器,再重建。
上面b这种,需要进一步删除所建镜像。如server这个,光删容器是换不了的。
先"down",再"build",(或者直接“up”?看down有没删除镜像。)

docker容器使用
docker ps -a 来查看。这里就体现出了container和image的关系。
container 看着就是用id来标识。然后命令里面参数用container id和image name 是不一样的。

进到docker里面的系统,很多命令都是没有,vi,vim都没。
用apt-get install 装报错“Unable to locate package”。
说是要apt-get update。但是网络卡住连不上。
网上找了段代码换包源的命令,换到163的包库地址。
然后提示”Repository is not signed“,试了加一些参数,也没啥效果。
又换回到原包库地址,update成功了哎。
但是install vi还是报错,install vim可以。。

修改启动顺序。rabitmq先起来,lamp后起来。
用depend on。出错,好像是要写在同一个yml文件里的才行。
然后尝试写command ;循环等待端口通。发现可能没装‘nc’命令。
直接写延时,docker 一直重启。搞了半天。
想想可能是command 覆盖了原来脚本中的命令。用ps 列出来时有一行command。原来的没有了。
用inspect查询下原先命令的脚本,也写入到command中。
大概docker类似打开一个控制台程序,程序结束后,控制台也退出了。command中都会有一个一直运行着的程序

参照这里的
https://www.cnblogs.com/wang_yb/p/9400291.html
但是提示nc 命令没有,直接运行nc是可以的。

docker名字
monitor下面装出来的, docker-ps-a name 栏显示 monitor_zlmediakit_1
都是monitor_x_1这样的格式,其它的都是compose文件里的services里的名称。不清楚为啥

网络访问
主机名:端口
外部使用 ip:映射的端口号
docker之间 docker名称:内部端口号

标签:容器,compose,--,使用,镜像,docker,Docker
From: https://www.cnblogs.com/halfwake/p/17404500.html

相关文章

  • 树莓派安装docker,并在PC端监控,启动swarm集群
    0.前期准备硬件及OS:  路由器,  笔记本wifi ,  虚拟机Centos7,  6个树莓派3B:OS为RaspberryPi,node1是64位的aarch64,剩下都是32位armv7l,使用wifi。软件:  docker:v23.0.6、  portainer-ce1.虚拟机和主机同网段  首先在控制面板->网络和Internet->网络......
  • .NET 使用Camunda快速入门
    简介参考:https://www.cnblogs.com/lvdeyinBlog/p/16095603.html 一.工作流介绍1.什么是工作流工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流将一套大的业务逻辑分解成业务逻辑段,并统一控制这些业务逻辑段的执行条件,执行顺序以及相互通信......
  • Docker底层原理(一)
    Docker底层原理(一)1Docker介绍1.1Docker是什么Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用及依赖包到一个轻量级、可移植的镜像中,然后发布到任何流行的Linux机器上。1.2Docker能解决什么问题1.2.1高效有......
  • Redis使用lua脚本实现库存扣减
    为什么使用Lua脚本为什么能合并多个原子操作?Redis官方文档:https://redis.io/docs/manual/programmability/eval-intro/ Redis保证脚本的原子执行。在执行脚本时,所有服务器活动在其整个运行期间都被阻止。这些语义意味着脚本的所有效果要么尚未发生,要么已经发生。脚本提供了......
  • Google Ajaxslt 使用
    类似插件:jquery.xslt[url]http://hyperthunk.github.io/jquery.xslt/[/url]jqueryxsltplugin:[url]http://www.jongma.org/webtools/jquery/xslt/[/url][url]http://book.51cto.com/art/200805/72637.htm[/url]a.xml<?xmlversion="1.0&quo......
  • 使用NEST简单操作Elasticsearch
    .NetCore中使用NEST简单操作Elasticsearch C#中访问Elasticsearch主要通过两个包NEST和Elasticsearch.Net,NEST用高级语法糖封装了Elasticsearch.Net可以通过类Linq的方式进行操作,而Elasticsearch.Net相比之下更为原始直接非常自由。注意:ES的8.X以上的版本有新的包Elastic.C......
  • ANSYS软件许可证的优化,可大大提高软件许可证使用效率
    格发GFLicOMS本人及公司长期致力于制造业研发软件许可证管理与优化大家好,本人及公司长期致力于制造业/设计院的研发设计软件许可证资源管理与优化,并帮助企业用最低经济代价达成软件合规化使用需求!ANSYS软件是美国ANSYS公司研制的大型通用有限元分析(FEA)软件,是世界范围内增长最快的......
  • 使用xml更新solr索引
    使用xml更新solr索引Solr接受xml格式数据更新、提交、修改索引。 更新的Schema不要混淆SCHEMA.XMLadd/replacedocuments SimpleExample:<!--[if!supportLists]-->·<!--[endif]--><add><!--[if!supportLists]-->·<!--[endif]--><doc><!--[......
  • 使用doop识别最近commons text漏洞的污点信息流
    作者:vivo互联网安全团队-ChenHaojie本文基于笔者对doop静态程序分析框架源代码和规则学习,并结合对目前漏洞公开技术细节的学习,修改增强doopapponly模式下的分析规则后,实现通过doop工具识别commonstextrce漏洞(CVE-2022-42889)。内容包含三部分,第一部分简单介绍doop分析框架......
  • matlab,基于卡尔曼滤波的语音处理程序,针对现有语音信号,人为添加噪声,使用卡尔曼滤波器对
    matlab,基于卡尔曼滤波的语音处理程序,针对现有语音信号,人为添加噪声,使用卡尔曼滤波器对其噪声进行滤波,达到语音去噪的目的ID:89500621487113339......