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