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 每列信息不会截断
安装
- 离线
https://blog.csdn.net/zwqjoy/article/details/106350891
这里 “开启 docker 守护进程 $ sudo dockerd &” - 在线
按官网的https://docs.docker.com/engine/install/centos/的步骤
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名称:内部端口号