Docker学习使用笔记

Docker学习使用笔记

Docker学习笔记,参照尚硅谷教程,以及一些自己的使用经理,未完结


Docker 概述

Docker

  • 解决了运行环境和配置问题的软件容器
  • go语言实现的云开源项目
  • 将应用打包成镜像——一次镜像,处处运行

解决了什么

  • 开发的电脑有自己的环境,运维那边拿到代码可能跑不起来,环境配置不一样
  • 集群的时候一个个安装非常麻烦
  • 扩容缩容非常麻烦
  • docker:源代码+配置+环境+版本====>打成一个镜像文件====>docker:镜像即应用
  • docker: 一次镜像,处处运行————从搬家变成搬楼

镜像文件

  • 一个镜像文件,跑到哪里装出来都是一样的——虚拟机的理念
  • 用docker跑一个镜像文件,全都一样

容器和虚拟机比较

  • 容器:

虚拟机

  • 带环境安装的一种解决方案
  • 虚拟出一套硬件后,在上面运行一个完整的操作系统,再在上面跑程序
  • 痛点:占用资源多,启动慢

容器

  • Linux容器是与操作系统隔离开的一系列进程
  • 从另一个镜像运行,由该镜像提供支持进程所需的全部文件,容器和虚拟机的区别在于容器不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置
  • 让系统变得轻量,Docker容器是在操作系统层面上实现虚拟化,直接复用本地的操作系统,相比于虚拟机有启动速度快,占用体积小的特点
  • 每个容器之间相互隔离,不会相互影响
  • Docker本身是一个容器运行载体(管理引擎),通过镜像创建出docker实例(类比java中new一个对象)

能干嘛

  • 出现了开发兼运维
  • 更快速的应用交付和部署
  • 更便捷的升级和扩缩容
  • 更简单的系统运维
  • 更高效的计算资源利用

Docker组成

  • 镜像:类比java的类像个模板;
  • 容器:实例化对象;看作一个简易版的linux系统,包含最小最核心赖以生存的Linux内核文件,不需要的不加载
  • 仓库:存放镜像的地方,类似github,maven,dockerhub

简易架构图

在这里插入图片描述

安装和测试

  • docker官网——doc——dockerEngine
    在这里插入图片描述
  • 安装gcc
yum -y install gcc
yum -y install gcc-c++
  • 安装工具包并且配置阿里云镜像
sudo yum install -y yum-utils
yum-config-manager  --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 更新yum软件包索引(可以更快)
yum makecache fast
  • 安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • 启动docker
systemctl start docker
  • 测试
docker run hello-world

阿里云镜像加速器

  • 登录阿里云找到镜像
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

常用命令

帮主启动类命令

systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl enable docker  # 开机自动启动docker
docker info	# docker概要信息
docker --help # 总体帮助文档
docker 命令 --help # 具体命令的帮助文档

镜像命令

  • 查看本地镜像
docker images #查看本地镜像

在这里插入图片描述

  • 搜索镜像在仓库中结果
docker search 镜像名
  • 拉取镜像
docker pull 镜像名字[:TAG]
# 不写TAG就默认最新的
docker pull redis:6.0.8
  • 查看使用容量信息
docker system df
  • 删除镜像
docker rmi -f 镜像ID

容器命令

  • 使用ubuntu的镜像在虚拟机中跑一个虚拟机希望是交互模式操作,同时要开启一个伪终端
-i 交互模式操作
-t 开启一个伪终端
--name= 可以容器名字
-P #随机端口映射
-p 主机端口:容器内端口 #指定端口映射,主机的端口映射到而哦那个其的端口 -p 8080:80 
希望有个交互式shell,就使用/bin/bash

docker run -it --name=ubntu01 ubuntu /bin/bash #就可以将ubuntu镜像实例成一个容器,同时弹出一个伪终端可以操作
exit 退出

  • 查看所有正在运行的容器实例
docker ps #当前活着的
docker ps -a #当前的+历史上出现过的
docker ps -l#最近创建的

  • 退出
exit #退出之后容器终止
ctrl+p+q #退出之后容器不终止

  • 重新进入
docker exec -it 容器id /bin/bash #在容器中打开了新的终端,使用exit不会终止容器
docker attach 容器ID # 直接进入容器中启动命令的终端,使用exit会终止容器

  • 重启容器
docker start 容器ID 

  • 强制停止容器
docker kill 容器ID/容器名

  • 删除已经停止的容器
docker rm 容器id
要先停止才能删掉
  • 守护线程:后台运行,比如mysql,redis等
docker run -d 镜像

  • 查看日志
docker log # 查看日志
docker tops # 查看容器内运行进程

备份命令

  • 将容器中的内容拷贝到主机,为了防止容器消失后容器内部的东西也消失
docker cp 容器ID:容器内的路径 主机内的路径
docker cp 
  • 直接备份容器
# 直接打成一个tar包
docker export 容器ID > name.tar
  • 将tar包还原为镜像
cat tar包名字 | docker import - 镜像用户/镜像名:镜像版本号 

在这里插入图片描述

commit命令

  • 用于在一个基础镜像上,拓展了自己需要的功能后,形成一个新的镜像,就可以等于原始镜像的加强版
docker commit -m="镜像描述信息" -a="作者" 该镜像的容器ID 镜像用户/镜像名:镜像版本号

在这里插入图片描述


镜像推送至阿里云

在这里插入图片描述

  • 创建命名空间和仓库
    在这里插入图片描述
  • 按流程走就行
    在这里插入图片描述

搭建私人库

  1. 拉取registry镜像
docker pull registry
  1. 运行registry镜像

镜像加载原理

联合文件系统 UnionFS

  • 对外暴露一个文件系统,联合加载会将各层文件系统叠加起来

镜像分层

  • 基于基础镜像,镜像可以通过分层进行集成,制作出各种具体的应用镜像
  • 好处:资源共享,方便复用,比如有一层镜像是大家公用的,使用镜像分层就可以只在内存中加载一份那个镜像,就可以为所有容器服务了,镜像每一层可以被共享
  • docker的镜像层都是只读的,容器层是可写的,容器启动时,一个新的可写层被加载到镜像顶部,这一层叫容器层,下面的都叫镜像层
    在这里插入图片描述
  • 可以理解为java中的Object类,其他子类都继承自他,然后按需拓展,可以派生出各种各样的子类

容器数据卷

  • 作用:用容器数据卷的方式完成数据的持久化,容器内的数据持久化到本地主机目录,容器挂了数据还在
docker run -it --privileged=true -v/宿主绝对路径目录:/容器内目录 镜像名 #默认是读写都可rw
docker run -it --privileged=true -v/宿主绝对路径目录:/容器内目录:ro 镜像名  #加了:ro就是只读的了

在这里插入图片描述

  • 通过docker inspect 容器ID 可以查看映射路径
    在这里插入图片描述
  • 开启权限:在容器中就会拥有真正的root权限,否则是个普通用户的权限

数据卷的继承(类似主从复制)

一个容器的数据卷可以继承自别的容器的数据卷
--volumes-from 要继承的容器名字

# 第一个叫u1的容器绑定了数据卷
docker run -it --privileged=true -v/tmp/docker-tmp:/tmp/docker-temp --name="u1" ubuntu
# 第二个叫u2的继承了u1的数据卷
docker run -it --privileged=true -v/tmp/docker-tmp:/tmp/docker-temp --name="u1" ubuntu

tomcat安装

  • tomcat最新版需要改些文件才能用,不需要使用最新的
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name="tomcat" billygoo/tomcat8-jdk8

mysql8安装

  • mysql中数据也需要和通过数据卷保存在主机本地
  • mysql8的密码验证机制和之前有所区别,需要有些配置
docker run -d -p 3306:3306 --privileged=true -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysq

nginx数据卷

docker run  -d --privileged=true  --name=geolopgy_nginx -p 84:80 -v /app/geology_nginx/html:/usr/share/nginx/html -v /app/geology_nginx/nginx.conf:/etc/nginx/nginx.conf  2b7d6430f78d

redis 安装

  • 关键在于配置数据卷,包括data和conf,使用自己的配置文件启动
  • 我的配置文件存放在/usr/local/redis/redis.conf,在启动时需要与主机上的数据进行绑定,最后还要设置使用哪里的配置文件启动redis
docker run -p 6379:6379 --name redis --privileged=true -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data -d redis redis-server /etc/redis/redis.conf
docker exec -it redis容器ID /bin/bash
redis-cli #可以设置键值,即成功

DockerFile

  • 构建docker镜像的脚本文件

编写须知

  • 每条保留字指令必须大写且后面至少跟一个参数
  • 从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层并对镜像进行提交

保留字

  • FROM:当前镜像是基于哪个镜像,指定一个已经存在的镜像作为模板,第一条必须是FROM
  • MAINTAINER:镜像维护者的姓名和邮箱
  • RUN: 后面可以接shell指令,构建时运行的东西
  • EXPOSE:容器对外暴露的端口
  • WORKDIR: 用来指定创建容器后的工作目录
  • USER:默认是root
  • ENV:用来设置环境变量,后面的RUN指令中都可以使用这个环境变量
  • VOLUME:容器数据卷,用于数据持久化
  • ADD: 将宿主机目录下的文件拷贝到镜像,而且会自动解压
  • COPY :只拷贝
  • CMD: 启动容器后要干的事,可以有多个CMD指令,但只有最后的一个生效,CMD会被docker run 后的参数覆盖,和RUN的区别,RUN是在docker build时运行,CMD是在docker run 时运行
    • ENTRYPOINT:不会被docker run后面的命令覆盖,这些命令行参数会被当作参数作为ENTRYPOINT指令指定的程序,如果ENTRYPOINT和CMD一起出现,CMD会被作为参数传递给ENTRYPOINT指令

编写dockerfile

FROM java:8
MAINTAINER RedGhost
VOLUME /tmp
ADD lskxpro-0.0.1-SNAPSHOT.jar lskxpro.jar
RUN bash -c 'touch /lskxpro.jar'
ENTRYPOINT ["java","-jar","lskxpro.jar"]
EXPOSE 8082  

build构建镜像

记得有个.


docker build -t 镜像名:版本 .
docker build -t lskxpro:1.0 .

Docker部署java实战

1. 打jar包

  • 在maven中选择package ,在target文件夹中可以看到打好的jar包
    在这里插入图片描述

2. 创建一个文件夹里放入jar包,同时编写一个dockerfile

3. build构建镜像

4. run起来

docker网络

能干嘛

  • 用来容器间的互联和通信,以及端口映射
  • 容器ip变动时可以通过服务名直接网络通信而不受影响

命令

在这里插入图片描述
在运行镜像的时候可以加上--network= 来指定网络模式
在这里插入图片描述

默认三大模式

docker network ls

在这里插入图片描述

bridge(最常用)

  • 为每一个容器分配和设置ip,并将容器连接到一个docker0 (虚拟网桥)

host

  • 使用宿主机的IP和端口

none

  • 没有做任何网络配置
  • 只有一个lo

container

  • 和一个指定的已存在的容器共享ip,端口范围
    在这里插入图片描述
    在这里插入图片描述
--network container:要共用的container的名字或id
  • 如果被指定的容器停掉了,那模式为container的那个容器就没有eth了

自定义网络模式

  • 希望各种容器分门别类,井井有条
  • 可以通过容器名来进行网络通信,避免了写死的ip,如果容器重启了ip会改变这种问题
  • 步骤:
    1. 先创建一个自定义的网络,模式默认是bridge,docker network create 自己起的网络模式名字
    2. 运行镜像时候–network写成自定义的 --network szk_network
    3. 在容器内就可以通过容器名来通信(ip和域名都能ping通)

docker0

  • 启动docker后,通过ifconfig命令可以看到有个docker0
    在这里插入图片描述
  • docker0是默认创建的网桥,他在内核层联通了其他的物理和虚拟网卡,将所有容器和本地主机放到同一个物理网络,让主机和容器之间可以进行网络通信
    在这里插入图片描述
    docker0中的veth会与容器中的eth0一一匹配
    在这里插入图片描述

Docker-Compose

  • 容器越来越多,有启动顺序和和加载条件,就像spring做的事一样
  • 用来实现Docker容器集群的快速编排,管理多个Docker容器组成一个应用
  • 通过YAML格式的配置文件,协调好多个容器之间的调用关系
  • 一个命令可以同时启动/关闭这些容器

安装

官网安装方法

# 官网给的github的太慢了,用这个命令
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

常用命令

在这里插入图片描述

使用

  • 步骤:
    1. 编写Dockerfile定义各个微服务应用并构建出镜像文件
    2. 定义一个完整业务单元,安排好各个服务
    3. 启动运行,一键部署上线

yml

  • 编写docker-compose.yml
version: "3"
services:
  microService:
    image: lskx-pro:1.1
    container_name: lskx-pro
    ports:
      - "8082:8082"
    privileged: true
    volumes:
      - /app/microService:/data
    command:
      - spring.profiles.active=pro
    networks:
      - red-ghost-network
    depends_on:
      - redis
      - mysql
      - nginx

  redis:
    image: redis:latest
    privileged: true
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf:rw
      - /app/redis/data:/data:rw
    networks:
      - red-ghost-network
    command: redis-server /etc/redis/redis.conf --requirepass 123456

  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'lskxweb'
    ports:
      - "3306:3306"
    privileged: true
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.cnf:/etc/my.cnf
      - /app/mysql/conf/logs:/logs

      - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - red-ghost-network
    command: --default-authentication-plugin=mysql_native_password

  nginx:
    image: nginx
    ports:
      - "83:80"

    networks:
      - red-ghost-network
    volumes:
      - /app/nginx/html:/usr/share/nginx/html

    privileged: true
    tty: true
    command: /bin/bash


networks:
  red-ghost-network:

清理虚悬径向

  • jar包用一个名字build多次之后,之前的同名jar包镜像会编程虚悬镜像
docker image prune
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值