Docker学习总结

目录

1. 概念

1.1 docker做什么

1.2 docker三要素

1.3 对比

2. 准备

3. 基本命令

4. 镜像

4.1 镜像的分层概念

4.2 基本命令

4.3 镜像生成

4.3.1 在已有镜像基础上加工 

4.3.2 Dockerfile

4.4 虚悬镜像

5. 容器

5.1 命令

5.2 容器数据卷

6. docker网络

7. docker-compose

8. 仓库


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.comhttps://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
  • linux
  • 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
  • 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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值