Skip to content
On this page

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会在最顶层加载一个读写文件系统作为容器
  1. docker镜像本质是一个分层的文件系统
  2. docker中的一个centos镜像小于centos操作系统ios文件,因为centos操作系统ios包括bootfs和rootfs,而centos镜像复用宿主的bootfs
  3. docker中的tomcat镜像偏大,由于docker镜像是分层的,tomcat虽然只有70MB,但是依赖父镜像和其他基础镜像

镜像制作

docker commit 容器id 新镜像名:版本 将容器制作成镜像

docker save -o 打包后的名称 要打包的镜像 将镜像打包

docker load -i 镜像包 导入镜像到docker

镜像本身的挂载的数据卷中的文件不会被包含到镜像中,但是生成之前容器生成时的数据卷文件夹

Dockerfile概念

制作springboot的dockerfile

bash
FROM java:8
MAINTAINER admin <admin@admin.com>
ADD springboot的jar包 加入后的名称.jar
CMD java -jar 加入后的名称.jar

再次使用docker build -f ./dockerfile -t 镜像名 .

app 镜像名

. 版本号,.代表最新版

bash
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比较

  • 容器镜像时轻量级的、可执行独立软件包、包含软件运行所需要的代码,运行环境,系统工具,系统库和设置

  • 容器化软件在任何环境中都能始终如一的运行

  • 容器赋予了软件独立性,免受环境差异影响,减少不容化境之间运行的冲突

相同

  • 容器和虚拟机都具有相似的资源隔离和分配游戏

不同

  • 容器虚拟化的时操作系统,虚拟机是虚拟的硬件
  • 传统虚拟机可以运行不同的操作系统,容器智能运行一类操作系统