学习目标
- 掌握Docker安装和配置
- 理解Docker的Image概念
- 理解Docker的Container概念
- 掌握Image的基本命令和GUI操作
- 掌握Container的基本命令和GUI操作
学习内容
Docker安装
https://www.docker.com/
https://docs.docker.com/desktop/install/windows-install/
- 安装
Docker Desktop Installer.exe
- 安装 wsl_update_x64.exe,此安装包为WSL2
将WSL 2设置为默认版本。使用管理权限打开PowerShell
wsl --set-default-version 2
修改Docker存储路径
针对C盘比较贫穷的适用
删除所有的容器和镜像
- clear 数据
- 关闭Docker Desktop
- 确定需要安装的路径。例如我的路径是:
D:\softwares\Docker
- 在安装目录下,新建两个文件夹
docker-desktop
,docker-desktop-data
导出数据。来到安装目录,打开命令行
wsl --export docker-desktop docker-desktop.tar
wsl --export docker-desktop-data docker-desktop-data.tar
注销docker服务
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data
导入数据
wsl --import docker-desktop xxx\docker-desktop docker-desktop.tar
wsl --import docker-desktop-data xxx\docker-desktop-data docker-desktop-data.tar
xxx
表示安装路径,我的是d:\softwares\Docker
- 打开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
<a name="OfzgC"></a>
### Docker安装问题
<a name="kbMfm"></a>
#### 问题一
![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=)
<a name="olNqS"></a>
##### 解决
```bash
netsh winsock reset
废弃
安装wsl完整版本
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
启用wsl
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重启电脑,重新打开docker desktop
管理员权限打开powershell
cd 'C:\Program Files\Docker\Docker\resources\'
.\com.docker.diagnose.exe gather -upload
重置winsock
netsh winsock reset
-
问题二
问题三
Docker Desktop配置
- 打开Docker Desktop中的设置界面,来到Docker Engine目录
在编辑框中追加以下内容:
"registry-mirrors": [
"https://registry.docker-cn.com/",
"http://hub-mirror.c.163.com/",
"https://ustc-edu-cn.mirror.aliyuncs.com/",
"https://hub.docker.com/"
]
- 追加的内容是为了配置Docker仓库地址。Docker仓库默认地址为国外网站,经常连不上,而且网速慢。配置完成后为国内镜像地址,网速快,不断网。
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
},
"registry-mirrors": [
"https://registry.docker-cn.com/",
"http://hub-mirror.c.163.com/",
"https://ustc-edu-cn.mirror.aliyuncs.com/",
"https://hub.docker.com/"
]
}
修改完成后,点击右下角的
Apply & restart
,等待配置完成重启。Docker是什么
Docker是一个开源容器化平台,简单理解就是一个轻量级的虚拟机。
虚拟机
对于虚拟机而言,大家可能不陌生。虚拟机的特点是环境独立,运行一些操作系统(Ubuntu,windows等)。虚拟机是一个软件程序,不同的平台有不同的虚拟机,常见的虚拟机软件有,vmware、vbox、parallels等。
虚拟机的特点:
对于容器而言,感觉虚拟机能做的容器都可以做,但是,并不是虚拟机不行,而是业务场景不同,虚拟机更像一个真实的电脑,安全性更高。
Docker容器可以做的事情
Docker 是一个开源的容器化平台,它能够帮助开发人员和运维团队更高效地构建、部署和运行应用程序。以下是 Docker 可以做的一些事情:
- 应用程序打包和交付: Docker 可以将应用程序及其所有依赖项打包成一个独立的容器,包括操作系统、运行时环境、库和配置等。这使得应用程序可以在任何环境中一致地运行,避免了因环境差异而导致的问题。
- 快速部署和扩展: Docker 可以快速部署应用程序容器,无论是在开发、测试还是生产环境中。通过 Docker 镜像,你可以在几秒钟内启动和停止容器,并根据需求进行水平扩展,轻松应对流量增加的情况。
- 环境隔离和一致性: Docker 容器提供了高度隔离的运行环境,确保应用程序之间互不干扰。每个容器都有自己的文件系统、进程空间和网络接口。这使得应用程序可以在相同的容器环境中以一致的方式运行,减少了因环境差异导致的问题。
- 资源利用和效率: Docker 允许在宿主机上运行多个容器,它们共享宿主机的操作系统内核和硬件资源。这种轻量级的虚拟化方式使得资源利用更加高效,节省了硬件和运维成本。
- 持续集成和持续部署: Docker 可以与持续集成和持续部署工具集成,实现自动化的构建、测试和部署流程。通过 Docker 镜像,你可以确保应用程序在不同环境中具有相同的配置和行为,减少了部署过程中的问题。
总之,Docker 提供了一种简单而强大的容器化解决方案,使得应用程序的构建、部署和运行变得更加可靠、高效和便捷。它在软件开发、测试和部署等方面发挥着重要的作用。
学习Docker需要懂的关键词
我们通过一些生活化的事务来去理解Docker的一些关键词,大致就可以知道docker的作用。
Docker是运行在电脑中的软件,我们将电脑比喻成一个大型商城,Docker的概念理解可以进一步扩展如下:
- 主机(Host Machine):主机就像是整个商城所在的建筑物。它是物理设备,可以是个人电脑、服务器或云平台。宿主机上安装了Docker引擎,负责管理和运行Docker容器。
- Docker引擎(Docker Engine):Docker引擎类似于商城的管理团队,它负责整个商城的运行和管理。Docker引擎包括Docker守护进程(Docker Daemon)和Docker客户端(Docker Client)。守护进程在宿主机上运行,并响应来自客户端的指令,管理容器和镜像的生命周期。
- Docker容器(Container):容器可以比作商城中的店铺,每个容器都是一个独立的、隔离的运行环境,类似于店铺的经营空间。容器中包含了应用程序及其所有依赖的文件系统、库和配置。容器可以独立运行,相互之间互不干扰。
- Docker镜像(Image):镜像类似于商城店铺的模型或蓝图,描述了如何构建容器的内容和配置。镜像是只读的,可以看作是容器的模板。你可以通过Dockerfile来创建镜像,定义容器的构建过程。
- Docker仓库(Registry):仓库可以看作是商城的存储库,存放着各种不同店铺的模型和商品。Docker仓库用于存储和分享镜像。公共的Docker仓库如Docker Hub允许你获取和分享镜像,私有的仓库则可以用于组织内部的镜像存储和共享。
- Dockerfile:Dockerfile就像是商城店铺的创建图纸,指导制造商如何制作店铺。Dockerfile是一个文本文件,包含了一系列的指令和配置,用于构建和配置镜像。通过执行Dockerfile中的指令,可以自动化地构建镜像。
Image镜像
获取镜像
docker pull <remote_image>
-
查询本地镜像
docker image list
运行镜像
docker run <local_image>
本地镜像名称 - 运行以上命令时,会创建一个容器,容器会运行起来
如果需要以交互形式启动,则需要加上
-it
操作,docker run -it <local_image>
导出镜像
docker save -o <output_file.tar> <image_name>
: 导出后的压缩包名称 -
导入镜像
docker load -i <input_file.tar>
-
将容器保存为新的镜像
docker commit <container_id> <image_name>:<tag>
: 容器的id和容器的名称 : 新的镜像名称 -
Container容器
查看容器
docker container ls
查询运行的容器
-
运行容器
docker start <container_name>
,要运行的容器id或者名称
如果需要带交互的启动,则运行一下命令
docker start -a -i <container_name>
将容器导出镜像
docker commit <container_name> <new_image>:<new_tag>
Dockerfile
编写规则
FROM
from
表示我要构建新的镜像以哪一个镜像为基础。例如:
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND noninteractive
ENV LANG C.UTF-8
- ENV 是环境变量标记
通常我们在构建时会加上DEBIAN_FRONTEND noninteractive
DEBIAN_FRONTEND
是一个环境变量,用于控制Debian系列操作系统(如Ubuntu)中的包管理器(如apt)的前端界面。
将 DEBIAN_FRONTEND 设置为 noninteractive 时,它告诉apt等工具在执行软件包操作(例如安装、升级、配置)时,使用默认选项而无需用户输入或交互。
通过将 DEBIAN_FRONTEND 设置为 noninteractive,可以在自动化构建过程中避免出现需要用户输入的提示,从而使构建过程更加自动化和无人参与。
RUN
run
表示运行命令的,例如:
RUN apt-get install -y wget
COPY
copy
表示在构建过程中,将本地文件拷贝到构建的镜像中去,例如:
COPY hello.txt /root/hello.txt
将Dockerfile文件同级目录下的
hello.txt
文件,拷贝到镜像的/root
目录下,名称为hello.txt
EXPOSE
expose
表示作为一个镜像,我需要暴露我的哪些网络端口,例如EXPOSE 22
-
VOLUME
volume
表示作为一个镜像,我需要暴露哪个文件路径,可以供外部访问映射,例如:VOLUME ["/home/hello"]
CMD
cmd
表示当这个镜像作为容器启动时,要执行的命令CMD echo "hello world"
构建镜像
docker build -t <镜像名称>:<标签> <上下文路径>
docker build -t myimage:latest .
-
完整示例
简单的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”]
```bash
docker build -t first_ubuntu:v1 .
docker run -v D:\DockerWS\volumes:/home/hello -it first_ubuntu:v1 bash
ssh远程访问的示例
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
# ssh
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN service ssh restart
RUN echo "root:123" | chpasswd
CMD ["/usr/sbin/sshd", "-D"]
EXPOSE 22
VOLUME ["/home/hello"]
docker build -t ssh_ubuntu:v1 .
docker run -v D:\DockerWS\volumes:/home/hello -p 9022:22 -it ssh_ubuntu:v1 bash
GUI操作
运行容器
- 容器名称:自定义的容器名称
- 映射端口部分:后面有个
22/tcp
为固定部分,这个来源是我们在构建镜像的Dockerfile中配置了EXPOSE
端口这个属性,值配置的为22。前面部分为我们填入的端口,这个根据实际情况填写值,这个表示的是我本地的PC电脑的端口映射到这个容器的22端口上 - 在
Volumes
中,有两个输入框,前一个表示pc本地的路径,第二个表示容器中的路径,这个路径值在Dockerfile中配置过,为VOLUME ["/home/hello"]
,意思是本地文件和这个容器文件联通。
查看启动日志
通过三个点进入view details
在Log中我们会看到hello world打印的字样
因为在构建过程中,Dockfile中我们填入了CMD echo "hello world"
查看文件系统
/root/hello.txt
为Dockerfile中,配置的COPY
将本地文件拷贝进入的
桌面镜像
docker pull dorowu/ubuntu-desktop-lxde-vnc
练习题
- 拉取远程镜像ubuntu
- 通过命令运行镜像ubuntu进入交互模式
- 通过命令导出镜像
- 通过命令导入镜像