Docker学习笔记

2022/8/15

# 🎉Docker 简介和安装

# Docker 是什么

Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要, 而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。

本文档课件配套 视频教程 (opens new window)

# 跟普通虚拟机的对比

特性 普通虚拟机 Docker
跨平台 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 支持的系统非常多,各类 windows 和 Linux 都支持
性能 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了 性能好,只虚拟软件所需运行环境,最大化减少没用的配置
自动化 需要手动安装所有东西 一个命令就可以自动部署好所需环境
稳定性 稳定性不高,不同系统差异大 稳定性好,不同系统都一样部署方式

# 打包、分发、部署

打包:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包 分发:你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装 部署:拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux。

# Docker 部署的优势

常规应用开发部署方式:自己在 Windows 上开发、测试 --> 到 Linux 服务器配置运行环境部署。

问题:我机器上跑都没问题,怎么到服务器就各种问题了

用 Docker 开发部署流程:自己在 Windows 上开发、测试 --> 打包为 Docker 镜像(可以理解为软件安装包) --> 各种服务器上只需要一个命令部署好

优点:确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。

例如 易文档 (opens new window)SVNBucket (opens new window) 的私有化部署就是用 Docker,轻松应对客户的各种服务器。

# Docker 通常用来做什么

  • 应用分发、部署,方便传播给他人安装。特别是开源软件和提供私有部署的应用
  • 快速安装测试/学习软件,用完就丢(类似小程序),不把时间浪费在安装软件上。例如 Redis / MongoDB / ElasticSearch / ELK
  • 多个版本软件共存,不污染系统,例如 Python2、Python3,Redis4.0,Redis5.0
  • Windows 上体验/学习各种 Linux 系统

# 重要概念:镜像、容器

镜像:可以理解为软件安装包,可以方便的进行传播和安装。 容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。

# 安装

桌面版:https://www.docker.com/products/docker-desktop 服务器版:https://docs.docker.com/engine/install/#server

# 启动报错解决

报错截图

解决方法: 控制面板->程序->启用或关闭 windows 功能,开启 Windows 虚拟化和 Linux 子系统(WSL2) image.png

命令行安装 Linux 子系统(这步可能不需要,因为 docker 安装时有说自动安装 wsl) wsl --install -d Ubuntu

命令行安装可能太慢,你也可以打开微软商店 Microsoft Store 搜索 Linux 进行安装

设置开机启动 Hypervisor bcdedit /set hypervisorlaunchtype auto

注意要用管理员权限打开 PowerShell

确保 BIOS 已开启虚拟化,下图检查是否已开启好

如果是已禁用,请在开机时按 F2 进入 BIOS 开启一下,不会设置的可以网上搜索下自己主板的设置方法,Intel 和 AMD 的设置可能稍有不同

出现下图错误,点击链接安装最新版本的 WSL2 https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

# 镜像加速源

镜像加速器 镜像加速器地址
Docker 中国官方镜像 https://registry.docker-cn.com
DaoCloud 镜像站 http://f1361db2.m.daocloud.io
Azure 中国镜像 https://dockerhub.azk8s.cn
科大镜像站 https://docker.mirrors.ustc.edu.cn
阿里云 https://<your_code>.mirror.aliyuncs.com
七牛云 https://reg-mirror.qiniu.com
网易云 https://hub-mirror.c.163.com
腾讯云 https://mirror.ccs.tencentyun.com

# 💻Docker 快速安装软件

# 直接安装的缺点

  • 安装麻烦,可能有各种依赖,运行报错。例如:WordPress,ElasticSearch,Redis,ELK
  • 可能对 Windows 并不友好,运行有各种兼容问题,软件只支持 Linux 上跑
  • 不方便安装多版本软件,不能共存。
  • 电脑安装了一堆软件,拖慢电脑速度。
  • 不同系统和硬件,安装方式不一样

本文档课件配套 视频教程 (opens new window)

# Docker 安装的优点

  • 一个命令就可以安装好,快速方便
  • 有大量的镜像,可直接使用
  • 没有系统兼容问题,Linux 专享软件也照样跑
  • 支持软件多版本共存
  • 用完就丢,不拖慢电脑速度
  • 不同系统和硬件,只要安装好 Docker 其他都一样了,一个命令搞定所有

# 演示 Docker 安装 Redis

Redis 官网:https://redis.io/

官网下载安装教程只有源码安装方式,没有 Windows 版本。想要自己安装 windows 版本需要去找别人编译好的安装包。

Docker 官方镜像仓库查找 Redis :https://hub.docker.com/

一个命令跑起来:docker run -d -p 6379:6379 --name redis redis:latest 命令参考:https://docs.docker.com/engine/reference/commandline/run/

# 安装 Wordpress

docker-compose.yml

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

# 安装 ELK

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

内存不够解决方法 (opens new window) 转到用户目录 cd ~,路径类似这个:C:\Users\<UserName> 创建 .wslconfig 文件填入以下内容

[wsl2]
memory=10GB # Limits VM memory in WSL 2 to 4 GB
processors=2 # Makes the WSL 2 VM use two virtual processors

生效配置,命令行运行 wsl --shutdown

# 更多相关命令

docker ps 查看当前运行中的容器 docker images 查看镜像列表 docker rm container-id 删除指定 id 的容器 docker stop/start container-id 停止/启动指定 id 的容器 docker rmi image-id 删除指定 id 的镜像 docker volume ls 查看 volume 列表 docker network ls 查看网络列表

# docker常用命令

  1. 查 docker search tomcat

  2. 拉 docker pull name (拉取查询出来的镜像)

  3. 查看自己安装的镜像docker images

  4. 查看容器 docker ps -a //-a 查看所有

  5. 启动 docker run --name -d -p 8081:8080 tomcat // -d后台运行 -p指定端口 -name 指定名称

  6. docker rm name 删除容器服务

  7. 进入容器:docker exec -it mysql bash

  8. 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。

    docker cp /www/runoob 96f7f14e99ab:/www/
    

# 💻Docker多容器通信

要想多容器之间互通,从 Web 容器访问 Redis 容器,我们只需要把他们放到同个网络中就可以了。

文档参考:https://docs.docker.com/engine/reference/commandline/network/

# 创建虚拟网络

docker network create test-net

# 重新运行redis ,命别名

docker run -d --name redis --network test-net --network-alias redis redis:latest

--name 项目命名

--network 指定网络

--network-alias 别名

redis redis:latest 运行redis最新版本

# 运行web项目,使用同个网络

docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1

docker run -p 指定端口

--name test 项目命名

D:/test:/app 项目路径

--network test-net 指定的同一个网络(redis也运行在test-net)

-d 后台运行

test:v1 指定镜像

# 通过docker—compose配置文件进行通信

使用docker-compose 能出来一堆帮助信息代表安装成功

  • 如果你是安装的桌面版 Docker,不需要额外安装,已经包含了。
  • 如果是没图形界面的服务器版 Docker,你需要单独安装 安装文档 (opens new window)
  • 运行docker-compose检查是否安装成功

# 编写脚本

要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml文件,描述依赖哪些服务 参考文档:https://docs.docker.com/compose/

version: "3.7"

services:
  app:
    build: ./
    ports:
      - 80:8080
    volumes:
      - ./:/app
    environment:
      - TZ=Asia/Shanghai
  redis:
    image: redis:5.0.13
    volumes:
      - redis:/data
    environment:
      - TZ=Asia/Shanghai

volumes:
  redis:

# 跑起来

docker-compose.yml 文件所在目录,执行:docker-compose up就可以跑起来了。 命令参考:https://docs.docker.com/compose/reference/up/

在后台运行只需要加一个 -d 参数docker-compose up -d 查看运行状态:docker-compose ps 停止运行:docker-compose stop 重启:docker-compose restart 重启单个服务:docker-compose restart service-name 进入容器命令行:docker-compose exec service-name sh 查看容器运行log:docker-compose logs [service-name]

# docker-tomcat-404

原因:没有关闭防火墙或者Tomcat的webapps文件夹下没有东西

排查和解决

  1. 启动Tomcat容器
  2. docker run -d -p 8888:8080 tomcat

# 查看已经启动的容器

docker ps

# 使用8888端口访问Tomcat失败

先查看防火墙状况 service firewalld status

# 如果防火墙没关闭,先关闭防火墙

service firewalld stop

防火墙关闭时,防火墙的状态如下

# 确定防火墙关闭但访问Tomcat还是失败之后,使用如下命名进入Tomcat的目录

docker exec -it c110e319cdd1(启动的Tomcat容器的容器id) /bin/bash

# 使用命令查看当前文件夹内的所有文件

ls -l

进入webapps文件夹下 cd webapps

查看webapps下的文件 ls -l

显示total 0,问题就出在这里,webapps文件夹下没有东西 返回上一级目录 cd ..

删除webapps文件夹(-r是级联删除,-f是强制删除,不然文件夹是删不掉的) rm -rf webapps

将webapps.dist文件夹下的内容复制到给webapps文件夹 rm webapps.dist webapps

此时再访问Tomcat,成功