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

镜像是由多个层(layer)组成的。然后相同镜像层只会存储一份,实际装起来没那么大。

输出镜像层信息,docker history xx。 加参数 --no-trunc 每列信息不会截断
最开始的一条应该就是linux内核,看着不同镜像都是一样的。70mb
输出镜像信息,docker inspect xx。
layers[]这里可能相同id的会共享。

Dockerfile--构建镜像
文档里说的是用这个建一个镜像再用,这边好像是用的时候一起构建

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

网络

建一个网络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 每列信息不会截断

安装

 

docker流程
docker load 装载基础镜像

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

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

有些配置没有挂到外部存储,修改后要重新建立镜像。

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

 

网络访问

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

 

posted @ 2023-05-16 11:45  shijianbo  阅读(44)  评论(0)    收藏  举报