1.Docker概述:

1.docker的概念:

  1. Docker是一个开源的应用容器引擎

  2. Docker是一个用于开发,交付和运行应用程序的开放平台

  3. 诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名为Docker Inc)

  4. Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux机器上

  5. 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统

  6. 容器时完全使用沙箱机制,相互隔离

  7. 容器性能开销极低

  8. Docker从17.03版本之后分为CE(社区版)和EE(企业版)

  9. 总结:

docker是一种容器技术,解决软件跨环境迁移的问题

2.Docker解决的问题:

  • Docker如何解决依赖的兼容问题:
    • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
    • 将每个应用放到一个隔离容器去运行,避免互相干扰
  • Docker如何解决不同系统环境的问题:
    • Docker将用户程序与所需要调用的系统(比如Ubuntu**)函数库一起打包**
    • Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行
  • Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
    • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
    • Docker应用运行在容器中,使用沙箱机制,相互隔离
  • Docker如何解决开发、测试、生产环境有差异的问题
    • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

3.DokcerHub:

  • DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry

2.安装Docker:

  • 如果之前安装过旧版本的Docker,可以使用下面命令卸载:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine \
    docker-ce
  • 首先需要大家虚拟机联网,安装yum工具

    1
    2
    3
    yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2 --skip-broken
  • 添加docker镜像到本地:

    1
    2
    3
    4
    5
    6
    # 设置docker镜像源
    yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
  • 然后输入命令:

    1
    yum install -y docker-ce
  • 如发生报错:

    img

  • 解决方案:

    1
    2
    3
    yum erase podman buildan

    yum install -y docker-ce --allowerasing
  • 查看是否安装成功:

    1
    docker -v
  • 重启docker服务:

    1
    systemctl restart docker
  • 镜像加速:

    1
    https://cr.console.aliyun.com/cn-wulanchabu/instances/mirrors

3.Docker架构

  • 图示:

    image-20230311180220664

  • Docker是一个CS架构的程序,由两部分组成:

    • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像,容器等

    • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令

  • 描述:

    • 镜像(image)
      • Docker将应用程序及其所需的依赖,函数库,环境,配置等文件打包在一起

      • 是一个文件系统

      • 相当于Class类

      • 容器(Container)

        • 镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见

        • 相当于Example实例(根据类创建出来的对象)

      • 仓库

        • 仓库可看成一个代码控制中心,用来保存镜像
        • 分类:远程仓库,私有仓库

4.docker命令:

1.操作进程命令:

命令 说明
systemctl start docker 启动docker服务
systemctl stop docker 停止docker服务
systemctl restart docker 重启docker服务
systemctl status docker 查看docker服务状态
systemctl enable docker 开机启动docker服务
systemctl disable docker 关闭开机启动docker服务

2.查看帮助:

命令 说明
docker –help 查看docker所有帮助
docker [命令] –help 查看docker相关命令的帮助

3.操作镜像命令:

  • 查看镜像:

    参数 说明
    q 查看本地的镜像文件的id
    1
    2
    docker images        # 查看本地的镜像文件
    docker images -q # 查看本地的镜像文件的id
  • 搜索镜像:

    1
    docker search 镜像名称
  • 拉取镜像:

    1
    2
    docker pull 镜像名称            # 不写版本号:(下载最新的)
    docker pull 镜像名称:版本号 # 写版本号: (docker官方搜索寻找版本号)
  • 删除镜像:

    1
    2
    3
    docker rmi 镜像id                 #  通过image id删除
    docker rmi 镜像名称:版本号 # 通过镜像名+版本号删除
    docker rmi $(docker images -q) # 删除所有的镜像

4.操作容器命令:

  • 查看容器:

    参数 说明
    a 查看所有状态的容器
    p 查看所有容器的id
    1
    2
    3
    docker ps          # 查看正在运行的容器
    docker ps -a # 查看所有状态的容器
    docker ps -aq # 查看所有容器的id
  • 创建容器:

    参数 说明
    i 表示容器运行
    t 表示给容器分配伪终端
    it 表示容器创建后自动进入容器中,退出容器自动关闭
    d 表示容器后台创建;需要命令进入容器;退出不会自动关闭容器
    id 创建的容器一般称为交互式容器;id创建的容器一般称为守护式容器
    –name= 指定所创建容器的名称
    -p 将容器的 80端口映射到宿主机的 80 端口
    v 挂载目录
    1
    2
    3
    docker run -it --name=容器名称 镜像名:版本号 /bin/bash           # 创建容器+伪终端
    docker run -id --name==容器名称 镜像名:版本号 /bin/bash # 创建容器+后台创建
    docker run ... -v 宿主机目录(数据卷名):容器内目录 镜像名称:7 # 创建容器+伪终端+挂载目录
  • 进入容器:

    参数 说明
    i 表示一直运行(除非关闭客户端)
    t 表示给容器分配伪终端
    1
    docker exec -it 容器名 定义的指令
  • 退出容器:

    1
    exit
  • 启动容器:

    1
    docker start 容器名称
  • 修改容器:

    1
    docker update --restart always 容器ID   # 如果容器已经创建,可以通过以下方式更新重启策略(开机自启容器)
  • 停止容器:

    1
    docker stop 容器名称
  • 删除容器:

    1
    2
    3
    4
    5
    docker rm 容器名称           # 根据容器名称删除容器
    docker rm 容器id # 根据id删除容器
    docker rm 容器名称:版本号 # 根据名称+(版本号)删除容器
    docker rm -f 容器名称 # 强制删除容器
    docker rm docker ps -aq # 删除所有容器
  • 查看容器信息:

    1
    docker inspect 容器名称
  • 查看容器日志:

    1
    2
    docker logs 容器名         # 根据容器名查看日志
    docker logs -f 容器名 # 根据容器名查看日志+跟踪日志

5.操作数据卷:

  • 创建数据卷:

    1
    2
    #自动创建在/var/lib/docker/volumes目录下
    docker volume create 数据卷名
  • 查看数据卷:

    1
    2
    docker volume ls                  # 查看所有的数据卷名称
    docker volume inspect 数据卷名称 # 查看指定数据卷的位置
  • 删除数据卷

    1
    2
    docker volume prune            # 删除所有未使用的数据卷
    docker volume rm 数据卷名称 # 删除指定的数据卷

5.Docker 应用部署

1.部署MySQL

  1. 搜索mysql镜像
1
docker search mysql
  1. 拉取mysql镜像
1
docker pull mysql:5.6
  1. 创建容器,设置端口映射、目录映射
1
2
3
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
1
2
3
4
5
6
7
8
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
  • 参数说明:
    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • $PWD:为显示当前目录位置
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
1
2
3
4
5
6
7
# MYSQL8.0以后的版本需要需改加密规则
GRANT ALL ON *.* TO 'root'@'%'; # 授权
flush privileges; # 刷新权限
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; # 更改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 更新root用户密码
flush privileges; # 刷新权限
docker restart [容器名]
  1. 进入容器,操作mysql
1
docker exec –it c_mysql /bin/bash
  1. 使用外部机器连接容器中的mysql(密码:123456

    image-20211206160946890

2.部署Tomcat

  1. 搜索tomcat镜像
1
docker search tomcat
  1. 拉取tomcat镜像
1
docker pull tomcat
  1. 创建容器,设置端口映射、目录映射
1
2
3
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
1
2
3
4
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
  • 参数说明:

    • -p 8080:8080:将容器的8080端口映射到主机的8080端口

      -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

  1. 使用外部机器访问tomcat

1573649804623

3.部署Nginx

  1. 搜索nginx镜像
1
docker search nginx
  1. 拉取nginx镜像
1
docker pull nginx
  1. 创建容器,设置端口映射、目录映射
1
2
3
4
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf

返回上层目录

1
cd ..
1
2
3
4
5
6
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 参数说明:
    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
  1. 使用外部机器访问nginx

1573652396669

4.部署Redis

  1. 搜索redis镜像
1
docker search redis
  1. 拉取redis镜像
1
docker pull redis:5.0
  1. 上传redis.conf配置文件
1
2
链接:https://pan.baidu.com/s/1hNZk4aXzlShhMFYcqLyKIQ 
提取码:abcd
  1. 创建容器,设置端口映射
1
docker run -id --name=c_redis -p 6379:6379 -v $PWD/data:/data -v $PWD/redis.conf:/etc/redis/redis.conf redis:6.2.4
  1. 进入redis容器
1
docker exec -it c_redis /bin/bash
  1. 启动redis客户端:
1
redis-cli

6.搭建博客程序:

1.搭建halo:

  • 安装JAVA:

    1
    2
    sudo yum install java-11-openjdk -y
    java -version
  • 安装mysql:

    1
    2
    3
    4
    5
    6
    7
    8
    docker run -id \
    -p 3307:3306 \
    --name=b_mysql \
    -v $PWD/conf:/etc/mysql/mysql.conf.d \
    -v $PWD/logs:/var/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=$Rui123456 \
    mysql:8.0.32
  • 安装halo:

    • 下载application.yaml模板:

      1
      2
      mkdir ~/.halo && cd ~/.halo
      wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
    • 修改application.yaml配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      server:
      port: 8090

      # Response data gzip.
      compression:
      enabled: false
      spring:
      datasource:

      # H2 database configuration.
      # driver-class-name: org.h2.Driver
      #url: jdbc:h2:file:~/.halo/db/halo
      #username: admin
      #password: 123456

      # MySQL database configuration.
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://8.130.17.95:3307/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
      username: root
      password: '@Qv110119'

      # H2 database console configuration.
      #h2:
      # console:
      # settings:
      # web-allow-others: false
      # path: /h2-console
      # enabled: false

      halo:

      # Your admin client path is https://your-domain/{admin-path}
      admin-path: admin

      # memory or level
      cache: memory
    • 创建halo容器:

      1
      docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.6.0

2.搭建hexo:

7.Docker的网络:

1.概念:

-

  • 作用:
    • 容器间的互联和通信以及端口映射
    • 容器IP变动时候(容器内部网络可能发生变化),网络通信不受影响
  • ifconfig中的docker0虚拟网卡
    • 负责宿主机和docker容器的通信
    • 负责docker容器之间的通信

2.基本命令:

  • 当你安装docker时,它会自动创建三个网络,可使用如下命令查看:

    1
    2
    3
    4
    5
    [root@zhanglin dockerfile]# docker network ls
    NETWORK ID NAME DRIVER SCOPE
    31b01340df19 bridge bridge local
    84be79f83115 host host local
    b8f15339e0e3 none null local
  • 查看网络命令帮助:

    1
    docker network --help
  • 创建docker网络:

    1
    docker network create [网络名]
  • 查看指定的docker网络:

    1
    docker network inspect [网络名]
  • 连接容器到一个网络中:

    1
    docker network connect
  • 断开网络中的一个网络

    1
    docker network disconnect
  • 删除指定的docker网络:

    1
    docker network rm [网络名]
  • 删除所有不使用的docker网络:

    1
    docker network prune 

3.网络模式:

  • bridge模式:

    • 概念:默认模式,为每一容器创建网卡,分配IP,并将容器连接到docker0

    • 图示:

      image-20230312161227047

  • host模式:

    • 容器不会虚拟出自己的网卡和IP,容器使用宿主机的IP和地址

    • 图示:

      image-20230312162334136

  • none模式:

    • 概念:容器拥有自己的Network Namespace,没有任何网络配置

    • 图示:

      image-20230312162847685

  • container模式:

    • 新创建的容器不会创建自己d额网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围

    • 图示:

      image-20230312163019822

8.DockerFile:

1.docker镜像原理:

  • Linux文件系统由两部分组成:
    • boofs:包含bootloader(引导加载程序)和kernel(内核)
    • rootfs:root文件系统,如:/dev,/etc,/bin等
  • 不同的发行版本,bootfs基本一样,rootfs不同
  • Docker镜像的本质是分层的文件系统由特殊的文件系统叠加而成
  • Docker镜像的组成:
  1. 最底层的是bootfs(为宿主机的bootfs)
  2. 第二层为rootfs,也被称为基础镜像
  3. 再往上为其他镜像
  • 说明:位于下方的镜像为父镜像,最低层的为基础镜像
  • 只读镜像:可以复用的镜像(不可以修改)

2.镜像制作:

  • 容器转为镜像:

    1
    docker commit 容器id 镜像名称:版本号
  • 镜像转为压缩文件

    1
    docker save -o 压缩文件名 镜像名称:版本号     # o(output)
  • 将压缩文件转为镜像:

    1
    docker load -i 压缩文件名                   # i(input)

3.Dockerfile的概念:

  • Docker是一个文本文件,文件中包含一条条指令
  • 每一行指令构建一层镜像,基于基础镜像,最终构建出一个新的镜像
  • 作用:
    • 提供完全一致的开发环境
    • 在部署时,可以实现应用的无缝链接

4.Dockerfile的使用:

  • dockerfile的关键字:

    关键字 作用 说明
    from 指定父镜像 指定dockerfile基于那个image构建
    maintainer 作者信息 用来标注这个dockerfile是谁写的
    label 标签 可以代替maintainer
    run 容器创建命令 容器创建时执行
    cmd 容器启动命令 容器启动时执行,与挂载参数v冲突
    entrypoint 入口 容器启动时执行,与挂载参数v冲突
    copy 复制文件
    add 添加文件
    env 环境变量
    arg 构建参数
    volume 构建数据卷
    expose 暴露端口 容器暴露在外的端口,需要映射
    workdir 工作目录 进入容器时的默认路径
    user 指定执行用户
    build 构建镜像
    1
    2
    3
    4
    FROM java:8         # 指定父镜像
    MAINTAINER qv123<qv123@qq.com> # 注释
    ADD springboot.jar .... # 添加文件
    CMD jar -jar springboot.jar # 启动容器时执行的命令
    1
    2
    3
    4
    5
    FROM centos:7                    # 指定父镜像
    MAINTAINER qv123<qv123@qq.com> # 注释
    RUN yum install -y vim # 启动容器时执行的命令
    WORKDIR /usr/local # 指定默认工作目录
    CMD /bin/bash # 启动容器时执行的命令
  • 构建镜像:

    1
    docker build -f dockerfile文件路径 -t 镜像名称:版本 . 

9.Docker服务编排:

1.服务编排概念:

  • 按照一定的业务规则批量管理容器

2.Docker Compose概述:

  • Docker Compose是一个编排多容器分布式部署的工具
  • 提供命令集管理容器化应用d额完整开发周期,包括服务构建,启动和停止
  • 使用步骤
    1. 使用Dockerfile定义运行环境镜像
    2. 使用docker-compose.yml定义组成应用的各种服务
    3. 运行docker-compose up启动应用

3.安装和卸载Docker Compose:

  • 二进制方式:

    • 安装:

      • curl下载

        1
        curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      • 设置文件可执行权限:

        1
        chmod u+x /usr/local/bin/docker-compose
      • 查看compose版本信息:

        1
        docker-compose -version
    • 卸载:

      1
      rm /usr/local/bin/docker-compose

4.Docker-compose的使用:

  • 创建Docker-compose文件

    1
    vim docker-compose.yml    # 必须叫此名
  • 编写docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    version: '3'
    services:
    nginx:
    image: nginx
    ports: 80:80
    links: springboot
    volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d # 创建外部目录
    springboot:
    image: springboot
    expose: "8080"
  • 在本目录下使用docker compose启动容器

    1
    docker-compose up

10.Docker的私有仓库:

1.搭建私有仓库:

  • 拉取私有仓库镜像:

    1
    docker pull registry
  • 启动私有仓库容器:

    1
    docker run -id --name=registry -p 5000:5000 registry
  • 检测是否搭建成功:

    1
    2
    http://localhost:5000/v2/_catelog
    # 成功显示:{"repositories":[]}
  • 修改daemon.json,添加键值对:

    1
    2
    3
    vim /etc/docker/daemon.json
    # 添加内容
    {"insecure-registries":["IP地址:5000"]}
  • 重启docker服务,重启私有仓库容器

2.上传镜像至私有仓库:

  • 标记镜像为私有仓库的镜像:

    1
    docker tag centos:7 IP地址:5000/centos:7
  • 上传标记的镜像:

    1
    docker push IP地址:5000/centos:7

3.从私有仓库拉取镜像:

1
docker pull IP地址:5000/centos:7