【编程不良人】Docker学习总结(二)
本博客将记录博主学习b站编程不良人的Docker的总结,虽然以前也有使用过docker,但都是一些最基本的用法,这次将会全面认真的学习Docker。
09:Docker镜像分层原理
- 镜像定义:
[scode type="green"]一个镜像代表一个软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时的所需的库、环境变量和配置文件[/scode] - 镜像为什么那么大:
因为一个软件镜像不仅仅是原来的软件包,而是包含软件包所需的操作系统依赖、软件自身依赖以及自身软件包组成(及包含了软干个公共镜像) - 为什么docker镜像采用分层镜像原理
注意:docker在设计镜像时每一个镜像都是有n个镜像共同组成 ==>镜像像是一个画卷一层层组成,每层都是一个镜像
原理:UnionFS 联合文件系统。 docker镜像实际是由一层一层的文件系统组成。
[scode type="blue"]采用UnionFS 联合文件系统最大的一个好处就是资源共享,采用分层机制实现基础层共享,从而减小docker仓库整体体积[/scode] - 所以,前期拉取的镜像越来越多,后期拉取就快
10:Docker中容器之间网络配置
- 为什么提供网络功能:
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 - docker容器与操作系统通信机制
- docker 网络使用
[scode type="yellow"]注意:一般在使用docker网桥(bridge)实现容器与容器通信时,都是站在一个应用的角度进行容器通信[/scode] 查看docker所有 配置
docker network ls docker inspect 网桥名称
创建自定义网桥
docker create NAMES(网桥名称) ===> docker create -d bridge ems(网桥名称)
例子:
docker run -d -p 8082:8080 -network ems --name mytomcat01 tomcat:8.0-jre8 docker run -d -p 8082:8080 -network ems --name mytomcat01 tomcat:8.0-jre8
[scode type="yellow"]注意,一但在启动容器时指定了网桥之后,日后可以在任何这个网桥关联的容器中使用容器名字进行与其他容器通信(docker将容器名字与该容器划分的子网做了映射)
172.18.02 ==> mytomcat01 , 172.18.0.3 ==> mytomcat02[/scode]
[scode type="yellow"]使用docker run 指定 --network 网桥时网桥必须存在[/scode]
11:docker 核心架构图
12:docker安装服务
- 安装哪个服务去docker hub搜索对应服务的镜像
点击进入该服务docker hub
- 首先看描述(description),如何使用images
- 其次找版本(tags)
安装mysql
启动:(后台启动,设置端口,启动时给root用户指定密码,使用数据卷进行数据持久化,以修改之后的配置文件启动)
docker pull mysql docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxx -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql --name mysql80 mysql
安装tomcat
下载tomcat服务
docker pull tomcat:8.0-jre8
启动tomcat服务(将部署应用目录和配置文件目录通过数据卷挂在宿主机系统)
[scode type="yellow"]注意:部署web应用在容器中目录为/usr/local/tomcat/webapps
配置文件 /usr/local/tomcat/conf[/scode]docker run -d -p 8081:8080 -v tomcatApps:/usr/local/tomcat/webapps -v confs:/usr/local/tomcat/conf --name tomcat8 tomcat:8.0-jre8
[scode type="yellow"]注意修改配置文件里的端口不会对已创建的tomcat生效,需新创建一个[/scode]
安装redis
下载镜像
docker pull redis
启动,并开启redis持久化(持久化生成aof文件会被放入容器中/data目录中),
docker run -d -p 6379:6379 --name redis redis redis-server --appendonly yes
- 以自定义配置文件略麻烦...
安装rabbitmq
下载镜像
docker pull rabbitmq
启动镜像,挂载配置目录
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v rabbitmq:/etc/rabbitmq/ --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq
启动rabbitmq_management管理界面
docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
修改配置文件,开启统计数据
# vim /var/ilb/docker/volumes/rabbitmq/_data/conf.d/management_agent.disable_metrics_collector.conf management_agent.disable_metrics_collector = false # 默认为true,解决Stats in management UI are disabled on this node
- 重启rabbitmq
安装ES & Kibana
下载镜像
docker pull elasticsearch:7.10.1
预先配置(修改虚拟内存大小)
vim /etc/sysctl.conf 加入如下配置:vm.max_map_count=262144 启用配置: sysctl -p
单节点启动,设置jvm并将数据、配置、插件持久化:
docker network create esnetwork 建立网桥 docker run -d --name es --net esnetwork -p 9200:9200 -p 9300:9300 -v esdata:/usr/share/elasticsearch/data -v esconfig:/usr/share/elasticsearch/config -v esplugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:7.10.1
安装Kibana
docker pull kibana:7.10.1
启动Kibana
docker run -d -p 5601:5601 --link es:elasticsearch --name kibana --net esnetwork kibana:7.10.2
13:dockerfile
- 定义:
[scode type="green"]用来帮助我们自己构建一个自定义镜像,dockerfile成为镜像构建文件 描述文件[/scode] - 为什么要存在dockerfile
[scode type="blue"]日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行[/scode] - dockerfile 构建镜像原理
- dockerfile 基本命令
### 示例 FROM
FROM centos:7
RUN
RUN yum install -y vim #构建镜像时安装vim RUN ["yum","install","-y","vim"] #第二种写法
EXPOSE
EXPOSE 5672 EXPOSE 15672
WORKDIR 指定进入容器后在哪个目录下,可以写多个(绝对+相对累加)
WORKDIR /data WORKDIR bb #实际进入容器目录为/data/bb,没有也会自动创建
COPY (将某文件拷贝到打包后的目录中 COPY src dest)
COPY aa.txt /data/bb
RUN
RUN xxx-8.0.tar.gz /data/bb # 拷贝进入的同时还会自动解压 RUN mv xxx-8.0 xx # 可以把自动解压后的文件夹重命名 WORKDIR yy # 甚至把进入容器后的目录修改
VOLUME 设置可以被挂载的容器目录
VOLUME /data/bb/tomcat/webapps
ENV 设置公共的环境变量
ENV BASE_DIR /data/bb VOLUME $BASE_DIR/tomcat/webapps
ENTRYPOINT & CMD (用数组形式)
[scode type="yellow"]通常ENTRYPOINT后的shell命令写固定死的,如java -jar
CMD后用来接收run容器时传入的参数,如jar包名称[/scode]ENTRYPOINT ["java","-jar"] CMD ["ems.jar"] ... docker run xxx:01 aaa.jar #此时执行的为 java -jar aaa.jar
014:Dockerfile构建springboot应用
- 打包项目 : demo.jar
在服务器中创建dockerfile上下文目录 context
mkdir demo # 这个目录作为 context touch Dockerfile # 在context目录中创建Dockerfile文件
- 上传应用jar到context目录
编写Dockerfile
FROM openjdk:8-jre # 基于哪个镜像构建 WORKDIR /app # 定义进入容器时默认位置,接下来后序操作工作位置 ADD demo.jar app.jar # 将上下文中名字为 demo.jar复制到工作目录,同时修改为app.jar EXPOSE 8081 # 暴露8081端口 ENTRYPOINT ["java","-jar"] # 启动应用固定命令 CMD ["app.jar"] # 执行jar名称
执行构建并运行
docker build -t demo:01 docker run -d -p 8081:8081 --name demo demo:01
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »