学习目标

  1. 安装Docker Desktop Installer.exe
  2. 安装 wsl_update_x64.exe,此安装包为WSL2
  3. 将WSL 2设置为默认版本。使用管理权限打开PowerShell

    1. wsl --set-default-version 2

    修改Docker存储路径

    针对C盘比较贫穷的适用

  4. 删除所有的容器和镜像

  5. clear 数据

091.png
092.png
093.png

  1. 关闭Docker Desktop

095.png

  1. 确定需要安装的路径。例如我的路径是:D:\softwares\Docker
  2. 在安装目录下,新建两个文件夹docker-desktop,docker-desktop-data
  3. 导出数据。来到安装目录,打开命令行

    1. wsl --export docker-desktop docker-desktop.tar
    1. wsl --export docker-desktop-data docker-desktop-data.tar
  4. 注销docker服务

    1. wsl --unregister docker-desktop
    1. wsl --unregister docker-desktop-data
  5. 导入数据

    1. wsl --import docker-desktop xxx\docker-desktop docker-desktop.tar
    1. wsl --import docker-desktop-data xxx\docker-desktop-data docker-desktop-data.tar
  • xxx表示安装路径,我的是d:\softwares\Docker
  1. 打开Docker Desktop ```bash wsl —export docker-desktop docker-desktop.tar wsl —export docker-desktop-data docker-desktop-data.tar wsl —unregister docker-desktop wsl —unregister docker-desktop-data wsl —import docker-desktop d:\softwares\Docker\docker-desktop docker-desktop.tar wsl —import docker-desktop-data d:\softwares\Docker\docker-desktop-data docker-desktop-data.tar
  1. <a name="OfzgC"></a>
  2. ### Docker安装问题
  3. <a name="kbMfm"></a>
  4. #### 问题一
  5. ![087.png](https://cdn.nlark.com/yuque/0/2023/png/27903758/1685236886208-5d03d716-772e-43aa-93d5-9b079090a3ca.png#averageHue=%23bae4f0&clientId=u4b6d00c8-dde0-4&from=ui&id=u3262a5e3&originHeight=1080&originWidth=1905&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=155868&status=done&style=none&taskId=udefb0ad2-00b9-4bcc-bb79-49c6e570bdf&title=)
  6. <a name="olNqS"></a>
  7. ##### 解决
  8. ```bash
  9. netsh winsock reset

重启电脑

废弃
  1. 安装wsl完整版本

    1. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  2. 启用wsl

    1. dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  3. 重启电脑,重新打开docker desktop

  4. 管理员权限打开powershell

    1. cd 'C:\Program Files\Docker\Docker\resources\'
    2. .\com.docker.diagnose.exe gather -upload
  5. 重置winsock

    1. netsh winsock reset
  6. 重启电脑,重新打开docker desktop

    问题二

    088.png

    问题三

Docker Desktop配置

  1. 打开Docker Desktop中的设置界面,来到Docker Engine目录

213.png

  1. 在编辑框中追加以下内容:

    1. "registry-mirrors": [
    2. "https://registry.docker-cn.com/",
    3. "http://hub-mirror.c.163.com/",
    4. "https://ustc-edu-cn.mirror.aliyuncs.com/",
    5. "https://hub.docker.com/"
    6. ]
    • 追加的内容是为了配置Docker仓库地址。Docker仓库默认地址为国外网站,经常连不上,而且网速慢。配置完成后为国内镜像地址,网速快,不断网。
      1. {
      2. "builder": {
      3. "gc": {
      4. "defaultKeepStorage": "20GB",
      5. "enabled": true
      6. }
      7. },
      8. "experimental": false,
      9. "features": {
      10. "buildkit": true
      11. },
      12. "registry-mirrors": [
      13. "https://registry.docker-cn.com/",
      14. "http://hub-mirror.c.163.com/",
      15. "https://ustc-edu-cn.mirror.aliyuncs.com/",
      16. "https://hub.docker.com/"
      17. ]
      18. }
  2. 修改完成后,点击右下角的 Apply & restart,等待配置完成重启。

    Docker是什么

    Docker是一个开源容器化平台,简单理解就是一个轻量级的虚拟机

    虚拟机

    对于虚拟机而言,大家可能不陌生。虚拟机的特点是环境独立,运行一些操作系统(Ubuntu,windows等)。虚拟机是一个软件程序,不同的平台有不同的虚拟机,常见的虚拟机软件有,vmware、vbox、parallels等。
    虚拟机的特点:

  • 启动慢
  • 独立环境
  • 可以安装很多程序

    容器

    容器是轻量级的虚拟机

  • 启动快

  • 独立环境
  • 可以安装很多程序

对于容器而言,感觉虚拟机能做的容器都可以做,但是,并不是虚拟机不行,而是业务场景不同,虚拟机更像一个真实的电脑,安全性更高。

Docker容器可以做的事情

Docker 是一个开源的容器化平台,它能够帮助开发人员和运维团队更高效地构建、部署和运行应用程序。以下是 Docker 可以做的一些事情:

  1. 应用程序打包和交付: Docker 可以将应用程序及其所有依赖项打包成一个独立的容器,包括操作系统、运行时环境、库和配置等。这使得应用程序可以在任何环境中一致地运行,避免了因环境差异而导致的问题。
  2. 快速部署和扩展: Docker 可以快速部署应用程序容器,无论是在开发、测试还是生产环境中。通过 Docker 镜像,你可以在几秒钟内启动和停止容器,并根据需求进行水平扩展,轻松应对流量增加的情况。
  3. 环境隔离和一致性: Docker 容器提供了高度隔离的运行环境,确保应用程序之间互不干扰。每个容器都有自己的文件系统、进程空间和网络接口。这使得应用程序可以在相同的容器环境中以一致的方式运行,减少了因环境差异导致的问题。
  4. 资源利用和效率: Docker 允许在宿主机上运行多个容器,它们共享宿主机的操作系统内核和硬件资源。这种轻量级的虚拟化方式使得资源利用更加高效,节省了硬件和运维成本。
  5. 持续集成和持续部署: Docker 可以与持续集成和持续部署工具集成,实现自动化的构建、测试和部署流程。通过 Docker 镜像,你可以确保应用程序在不同环境中具有相同的配置和行为,减少了部署过程中的问题。

总之,Docker 提供了一种简单而强大的容器化解决方案,使得应用程序的构建、部署和运行变得更加可靠、高效和便捷。它在软件开发、测试和部署等方面发挥着重要的作用。

学习Docker需要懂的关键词

我们通过一些生活化的事务来去理解Docker的一些关键词,大致就可以知道docker的作用。
Docker是运行在电脑中的软件,我们将电脑比喻成一个大型商城,Docker的概念理解可以进一步扩展如下:

  1. 主机(Host Machine):主机就像是整个商城所在的建筑物。它是物理设备,可以是个人电脑、服务器或云平台。宿主机上安装了Docker引擎,负责管理和运行Docker容器。
  2. Docker引擎(Docker Engine):Docker引擎类似于商城的管理团队,它负责整个商城的运行和管理。Docker引擎包括Docker守护进程(Docker Daemon)和Docker客户端(Docker Client)。守护进程在宿主机上运行,并响应来自客户端的指令,管理容器和镜像的生命周期。
  3. Docker容器(Container):容器可以比作商城中的店铺,每个容器都是一个独立的、隔离的运行环境,类似于店铺的经营空间。容器中包含了应用程序及其所有依赖的文件系统、库和配置。容器可以独立运行,相互之间互不干扰。
  4. Docker镜像(Image):镜像类似于商城店铺的模型或蓝图,描述了如何构建容器的内容和配置。镜像是只读的,可以看作是容器的模板。你可以通过Dockerfile来创建镜像,定义容器的构建过程。
  5. Docker仓库(Registry):仓库可以看作是商城的存储库,存放着各种不同店铺的模型和商品。Docker仓库用于存储和分享镜像。公共的Docker仓库如Docker Hub允许你获取和分享镜像,私有的仓库则可以用于组织内部的镜像存储和共享。
  6. Dockerfile:Dockerfile就像是商城店铺的创建图纸,指导制造商如何制作店铺。Dockerfile是一个文本文件,包含了一系列的指令和配置,用于构建和配置镜像。通过执行Dockerfile中的指令,可以自动化地构建镜像。

214.png
216.png

Image镜像

获取镜像

  1. docker pull <remote_image>
  • 为远程仓库中需要的镜像名称

    查询本地镜像

    1. docker image list

    运行镜像

    1. docker run <local_image>
  • 本地镜像名称

  • 运行以上命令时,会创建一个容器,容器会运行起来
  • 如果需要以交互形式启动,则需要加上-it操作,docker run -it <local_image>

    导出镜像

    1. docker save -o <output_file.tar> <image_name>
  • : 导出后的压缩包名称

  • : 需要导出的镜像名称

    导入镜像

    1. docker load -i <input_file.tar>
  • : 需要导入的镜像压缩包

    将容器保存为新的镜像

    1. docker commit <container_id> <image_name>:<tag>
  • : 容器的id和容器的名称

  • : 新的镜像名称
  • : 新的镜像的标签

    Container容器

    查看容器

    1. docker container ls
  • 查询运行的容器

  • 如果要查询所有容器,加上-a参数

    运行容器

    1. docker start <container_name>
  • ,要运行的容器id或者名称

如果需要带交互的启动,则运行一下命令

  1. docker start -a -i <container_name>

将容器导出镜像

  1. docker commit <container_name> <new_image>:<new_tag>

Dockerfile

编写规则

FROM

from表示我要构建新的镜像以哪一个镜像为基础。例如:

  1. FROM ubuntu:20.04
  2. ENV DEBIAN_FRONTEND noninteractive
  3. ENV LANG C.UTF-8
  • ENV 是环境变量标记

通常我们在构建时会加上DEBIAN_FRONTEND noninteractive
DEBIAN_FRONTEND 是一个环境变量,用于控制Debian系列操作系统(如Ubuntu)中的包管理器(如apt)的前端界面。
将 DEBIAN_FRONTEND 设置为 noninteractive 时,它告诉apt等工具在执行软件包操作(例如安装、升级、配置)时,使用默认选项而无需用户输入或交互。
通过将 DEBIAN_FRONTEND 设置为 noninteractive,可以在自动化构建过程中避免出现需要用户输入的提示,从而使构建过程更加自动化和无人参与。

RUN

run表示运行命令的,例如:

  1. RUN apt-get install -y wget

run后面跟的就是一段需要执行的命令,构建镜像时会顺序执行

COPY

copy表示在构建过程中,将本地文件拷贝到构建的镜像中去,例如:

  1. COPY hello.txt /root/hello.txt
  • 将Dockerfile文件同级目录下的hello.txt文件,拷贝到镜像的/root目录下,名称为hello.txt

    EXPOSE

    expose表示作为一个镜像,我需要暴露我的哪些网络端口,例如

    1. EXPOSE 22
  • 暴露端口22

    VOLUME

    volume表示作为一个镜像,我需要暴露哪个文件路径,可以供外部访问映射,例如:

    1. VOLUME ["/home/hello"]

    CMD

    cmd表示当这个镜像作为容器启动时,要执行的命令

    1. CMD echo "hello world"

    构建镜像

    1. docker build -t <镜像名称>:<标签> <上下文路径>
    1. docker build -t myimage:latest .
  • 要求命令行运行所在目录下有编写的Dockerfile文件

    完整示例

    简单的ubuntu示例

    ```dockerfile FROM ubuntu:20.04 ENV DEBIAN_FRONTEND noninteractive ENV LANG C.UTF-8

RUN sed -i “s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g“ /etc/apt/sources.list RUN sed -i “s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g“ /etc/apt/sources.list

依赖

RUN apt-get clean RUN apt-get update

RUN apt-get install -y wget

COPY hello.txt /root/hello.txt

VOLUME [“/home/hello”]

CMD [“echo”, “hello world”]

  1. ```bash
  2. docker build -t first_ubuntu:v1 .
  1. docker run -v D:\DockerWS\volumes:/home/hello -it first_ubuntu:v1 bash

ssh远程访问的示例
  1. FROM ubuntu:20.04
  2. ENV DEBIAN_FRONTEND noninteractive
  3. ENV LANG C.UTF-8
  4. RUN sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
  5. RUN sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
  6. # 依赖
  7. RUN apt-get clean
  8. RUN apt-get update
  9. RUN apt-get install -y wget
  10. # ssh
  11. RUN apt-get install -y openssh-server
  12. RUN mkdir -p /var/run/sshd
  13. RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
  14. RUN service ssh restart
  15. RUN echo "root:123" | chpasswd
  16. CMD ["/usr/sbin/sshd", "-D"]
  17. EXPOSE 22
  18. VOLUME ["/home/hello"]
  1. docker build -t ssh_ubuntu:v1 .
  1. docker run -v D:\DockerWS\volumes:/home/hello -p 9022:22 -it ssh_ubuntu:v1 bash

GUI操作

运行容器

048.png
049.png

  • 容器名称:自定义的容器名称
  • 映射端口部分:后面有个22/tcp为固定部分,这个来源是我们在构建镜像的Dockerfile中配置了EXPOSE端口这个属性,值配置的为22。前面部分为我们填入的端口,这个根据实际情况填写值,这个表示的是我本地的PC电脑的端口映射到这个容器的22端口上
  • Volumes中,有两个输入框,前一个表示pc本地的路径,第二个表示容器中的路径,这个路径值在Dockerfile中配置过,为VOLUME ["/home/hello"],意思是本地文件和这个容器文件联通。

050.png

查看启动日志

通过三个点进入view details
051.png
在Log中我们会看到hello world打印的字样
052.png
因为在构建过程中,Dockfile中我们填入了CMD echo "hello world"

查看文件系统

053.png
/root/hello.txt为Dockerfile中,配置的COPY将本地文件拷贝进入的

桌面镜像

  1. docker pull dorowu/ubuntu-desktop-lxde-vnc

练习题

  • 拉取远程镜像ubuntu
  • 通过命令运行镜像ubuntu进入交互模式
  • 通过命令导出镜像
  • 通过命令导入镜像