目录
1. 概念
1.1 docker做什么
- 将“应用代码、配置环境、运行依赖包、操作系统发行版”等打包成镜像;
- 是docker容器运行载体或管理引擎
- 镜像部署运行在docker容器中,多个docker容器运行在同一台物理机上
1.2 docker三要素
- 镜像:软件包,类比.class文件,一个只读的模板,1个镜像用来创建多个docker容器
- 容器(实例):类比实例对象,每个容器是互相隔离的,容器为应用程序提供了一个标准的、隔离的运行环境
- 仓库:存放镜像文件的地方,分为公开仓库(阿里云)、私有仓库(公司仓库)
1.3 对比
- docker vs. 虚拟机virtual machine
- 计算机:硬件 -> 操作系统 -> 应用
- 容器虚拟化(docker容器):操作系统层面实现虚拟化,启动快、占用体积小
- 传统虚拟机:硬件层面实现虚拟化,虚拟出一套硬件,在其上运行一个完整的操作系统,资源占用多、冗余步骤多、启动慢
- docker的跨平台 vs. Java的跨平台
- Java的跨平台性是由其虚拟机保证的
2. 准备
docker官网:http://www.docker.com、https://dockerdocs.cn/index.html
最大的公开仓库:https://hub.docker.com
- linux&mac
- 查看shell种类:cat /etc/shell
/bin/bash /bin/csh /bin/dash /bin/ksh /bin/sh /bin/tcsh /bin/zsh
- 更改默认shell:chsh -s /bin/bash
- 查看shell种类:cat /etc/shell
- linux
- 包管理命令:yum
- 添加repository:yum-config-manager --add-repo 仓库地址
阿里镜像仓库地址:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce-repo - 安装docker引擎:yum -y install docker-ce docker-ce-cli containerd.io
- 添加repository:yum-config-manager --add-repo 仓库地址
- 包管理命令:yum
- mac
- 包管理命令:brew
- 查看所有服务:launchctl list
- 第1列 pid:进程id,-表示不运行
- 第2列 status:进程退出码,负数表示杀死进程的信号值,配合kill指令:kill status pid
- 第3列 label:进程名称
- launchctl start 服务名
- launchctl stop 服务名
- 配置镜像加速器:按阿里云文档操作或直接修改docker配置
3. 基本命令
4. 镜像
4.1 镜像的分层概念
(1)联合文件系统UnionFS是分层、轻量、高性能的文件系统,是docker镜像的基础;镜像通过分层来继承,基于基础镜像制作具体的应用镜像
(2)docker镜像加载原理:
- 底层是引导文件系统bootfs,包含boot加载器、内核;
- bootfs之上是rootfs,包含/bin、/etc等标准目录与文件
- 不同的linux发行版(ubuntu、centos)共用bootfs,提供rootfs即可
(3)为什么采用分层结构:资源共享、利于复制迁移
docker的镜像层是只可读的,容器层是可写的,容器启动时“新的可写层”被加载到镜像顶部,作为“容器层”
4.2 基本命令
4.3 镜像生成
4.3.1 在已有镜像基础上加工
比如在ubuntu基础镜像上,安装vim等命令
docker commit -m="描述" -a="作者" 容器id 目标镜像名:[标签名]
4.3.2 Dockerfile
(1)是什么:是脚本,执行脚本中的指令和参数,构建docker镜像
(2)Dockerfile是配置清单,docker镜像是软件代码,docker容器是软件的运行态
(3)Dockerfile执行过程:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行Dockerfile中的下一条指令直到所有指令都执行完成
(4)语法:
- 指令按照从上到下,顺序执行
- #表示注释
- 每条保留字指令必须为大写字母,且后面要跟随至少一个参数
(5)在Dockerfile目录下执行构建镜像指令(注意最后空格+点):docker build -t 新镜像名字:tag .
(6)Dockerfile样例
FROM java:8
# 维护者
MAINTAINER xxxx
VOLUME /Users/xxxx/study/tmp
# 将jar包添加到容器中,并更名为docker_service.jar
# service.jar是java工程'service'通过maven生成的,
ADD service.jar docker_service.jar
RUN bash -c 'touch /docker_service.jar'
ENTRYPOINT ["java", "-jar", "/docker_service.jar"]
EXPOSE 8888
4.4 虚悬镜像
- 定义:仓库名、标签名都是none的镜像
- 如何产生
- docker build .
- 构建或删除镜像时出现错误
- 查看所有虚悬:docker image ls -f dangling=true
- 删除所有虚悬:docker image prune
5. 容器
5.1 命令
5.2 容器数据卷
- 命令:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器绝对路径目录 镜像名
- 设置参数:--privileged=true,容器内的root拥有真正的root权限,否则只相当于外部的一个普通用户权限
- 添加自定义的容器卷:-v /宿主机绝对路径目录:/容器绝对路径目录
- 默认读写权限,等同于:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器绝对路径目录:rw 镜像名
- 只读权限(read only):docker run -it --privileged=true -v /宿主机绝对路径目录:/容器绝对路径目录:ro 镜像名
- 宿主机可以写入内容,容器可以读取,但容器不能写
- 继承容器卷的挂载规则,各容器卷之间共享数据:docker run -it --privileged=true --volumes-from 容器A名 --name 容器B名 镜像名
- 什么是容器卷:将docker容器内的数据保存进宿主机的磁盘中,特点如下:
- 数据卷可在容器之间共享或重用数据
- 数据卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
- 查看挂载是否成功:(1)docker inspect 容器id;(2)查看Mounts配置的Destination指向本地目录
6. docker网络
作用:容器与宿主机、容器间的互联和通信
7. docker-compose
- 作用:实现一次性运行多个docker容器
- 步骤:
- 业务服务打包(maven package)
- 踩坑:服务存在分环境配置,pom.xml中<profiles>指定打包的yml、xml等配置文件
- jar包与Dockerfile在同一目录,构建镜像:docker build -t 镜像名:tag .
- 编写docker-compose.yml文件
- 进入docker-compose.yml目录,执行:docker-compose up -d
- 业务服务打包(maven package)
- docker-compose.yml文件示例:
version: "3"
services:
my_service:
image: test_service:0.0.1
container_name: my_service
ports:
- "8888:8888"
volumes:
- /Users/xxxx/study/docker-service20230208:/data
# 设置时区
environment:
- TZ=Asia/Shanghai
# 设置网络
networks:
- my_net
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'edu_mgmt_system'
ports:
- "3306:3306"
volumes:
- /Users/xxxx/study/docker-mysql20230208/log:/var/log/mysql
- /Users/xxxx/study/docker-mysql20230208/data:/var/lib/mysql
- /Users/xxxx/study/docker-mysql20230208/conf:/etc/mysql/conf.d
environment:
- TZ=Asia/Shanghai
networks:
- my_net
# 解决外部无法访问
command: --default-authentication-plugin=mysql_native_password
networks:
my_net:
8. 仓库
docker registry是官方提供的工具,用于构建私有镜像仓库
- 拉取registry镜像:docker pull registry
- 运行registry容器:docker run -d -p 5000:5000 --privileged=true registry
- 仓库默认创建在/var/lib/registry目录下
- 查看私服仓库:curl -XGET http://127.0.0.1:5000/v2/_catalog
- 按私服tag规范,克隆&重命名某个镜像tag:docker tag 镜像:tag host:port/镜像:tag
docker tag xxxx:0.1 127.0.0.1:5000/xxxx:0.1 - docker默认不允许http方式推送镜像,修改docker配置文件(/etc/docker/daemon.json)取消限制:配置项insecure-registries
- 推送镜像:docker push 127.0.0.1:5000/xxxx:0.1