Docker笔记
Docker解决依赖的兼容问题:
- 将应用的libs(函数依赖库)、deps(依赖)、配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免互相干扰
操作系统:
- 分为系统应用、内核、硬件
- 内核与硬件交互,提供硬件操作指令
- 系统应用封装指令为函数供开发人员使用
- 各个linux系统都是基于linux内核,只是系统应用不同,提供的函数库有所差异
docker如何解决不同系统的环境问题:
- docker将用户程序与所需要调用的系统(如centos)函数库一起打包
- docker运行到不同操作系统时,直接基于打包的函数库,借助操作系统的linux内核来运行
基本命令
docker search mysql 搜索仓库中mysql的镜像
docker pull mysql 拉仓库中最新的mysql镜像
docker pull mysql:8 拉取仓库中mysql 版本为8的镜像
docker images 查看本地镜像
docker images -q 查看所镜像的id
docker rmi [镜像id] 删除镜像
docker rmi `docker images -q` 删除所有镜像
docker ps 查看容器
docker ps 查看所有容器
docker run 参数
- -i 保持容器运行。通常与 -t 同时使用,使用 -it后,容器创建后自动进入容器,退出容器后容器自动关闭
- -t 为容器分配一个伪输入终端,通常与-i一起使用
- -d 以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec [容器名] 进入容器
- -it 创建容器,一般为交互式容器,-id 创建容器,一般为守护式容器
- --name 为创建容器使用的名字 docker run -id --name=test [镜像名:版本]
docker rm [容器id] 删除容器
docker ps -aq 查看所有容器id
docker inspect [容器id] 查看容器的信息
docker exec 参数 进入容器
docker stop [容器id] 停止容器
docker start [容器id] 启动容器
数据卷
- 数据卷是宿主主机中的一个目录或文件
- 当容器目录和数据卷绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以同时挂载多个数据卷
数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间的数据交换
配置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)
- 目录必须时绝对路径
- 目录不存在会自动创建
- 可以挂载多个数据卷
数据卷容器
多容器进行数据交换的方法
- 多个容器挂载同一个数据卷
- 数据卷容器
配置数据卷容器
docker run -it --name=data-test -v /volume 镜像
挂载数据卷
docker run -it --name=c-test --volume-from data-test 镜像
Docker 应用部署
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主可以直接通信
- 当容器中的网络服务被外部机器访问时,可以将容器中提供服务的端口映射到宿主的端口上,外部机器访问宿主的端口从而简介访问容器服务
- 这种操作称为 端口映射
mysql部署实例
docker run -id -p 3306:3306 --name=mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8 --lower_case_table_names=1
-e MYSQL_ROOT_PASSWORD :设置mysql密码
–lower_case_table_names=1 :忽略大小写,docker mysql默认区分大小写的
-p 主机对外端口:容器应用端口
redis部署实例
docker run -p 6379:6379 --name redis -v $PWD/data/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
redis.conf需要事先准备该配置文件
redis-server /etc... 执行配置文件启动
--appendonly yes 开启持久化
RabbitMq部署实例
docker run -id -e RABBITMQ_DEFAULT_USER=rabbitemq -e RABBITMQ_DEFAULT_PASS=123456 --name rabbitmq --hostname rabbitmq-first -p 15672:15672 -p 5672:5672 rabbitmq
hostname:集群名
15672为ui界面
5672消息通信端口
再次使用命令 docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management 开启远程访问ui界面
访问channel不可用:bash进入/etc/rabbitmq/conf.d
echo management_agent.disable_metrics_collector=false > management_agent.disable_metrics_collector.conf
重启rabbitmq
Dockerfile
linux文件系统由bootfs和rootfs两部分组成
- bootfs:包含bootloader(引导加载程序)和kernel(内核)
- rootfs:root文件系统,包含的就是典型linux系统中的/dev, /proc, /bin, /etc等标准目录和文件
- 不同的linux发行版,bootfs基本一样,而rootfs不同
镜像原理
- docker镜像原理是由特殊文件系统叠加而成
- 最底端是bootfs,并使用宿主机的bootfs
- 第二层是root文件系统rootfs,称为base image
- 继续在上面叠加其他镜像文件(jdk,tomcat)
- 统一文件系统技术 能够将不同的层整合成一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层岑在,用户只看到一个文件系统
- 一个镜像可以放在另一个镜像上面,位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
- docker镜像本质是一个分层的文件系统
- docker中的一个centos镜像小于centos操作系统ios文件,因为centos操作系统ios包括bootfs和rootfs,而centos镜像复用宿主的bootfs
- docker中的tomcat镜像偏大,由于docker镜像是分层的,tomcat虽然只有70MB,但是依赖父镜像和其他基础镜像
镜像制作
docker commit 容器id 新镜像名:版本 将容器制作成镜像
docker save -o 打包后的名称 要打包的镜像 将镜像打包
docker load -i 镜像包 导入镜像到docker
镜像本身的挂载的数据卷中的文件不会被包含到镜像中,但是生成之前容器生成时的数据卷文件夹
Dockerfile概念
制作springboot的dockerfile
FROM java:8
MAINTAINER admin <admin@admin.com>
ADD springboot的jar包 加入后的名称.jar
CMD java -jar 加入后的名称.jar
再次使用docker build -f ./dockerfile -t 镜像名 .
app 镜像名
. 版本号,.
代表最新版
FROM java:8
MAINTAINER wang <wang@qq.com>
ARG JAR_FILE
ARG PORT
COPY ${JAR_FILE} app.jar
EXPOSE ${PORT}
CMD java -jar app.jar
docker build --build-arg JAR_FILE=./xxx.jar --build-arg PORT=8080 镜像名 .
docker与vm比较
容器镜像时轻量级的、可执行独立软件包、包含软件运行所需要的代码,运行环境,系统工具,系统库和设置
容器化软件在任何环境中都能始终如一的运行
容器赋予了软件独立性,免受环境差异影响,减少不容化境之间运行的冲突
相同
- 容器和虚拟机都具有相似的资源隔离和分配游戏
不同
- 容器虚拟化的时操作系统,虚拟机是虚拟的硬件
- 传统虚拟机可以运行不同的操作系统,容器智能运行一类操作系统