1、安装与下载
1.1下载
docker desktop官网:https://www.docker.com/products/docker-desktop
1.2安装
在较新的Windows则会出现一个使用wsl2的提示,如果使用wsl2则docker的性能会发挥更好。如下图,这里推荐使用WSL2,如果之后安装完成后发生报错可能是WSL2版本比较老,需要更新导致的。
点击OK即可
安装完成:
安装重启之后弹出:
点击下载linux内核更新包
安装Linux内核更新包:
安装完成之后,点击ws2 installation is incomplete的restart
正常启动。
2、配置
2.1 换源
setting-Docker Engine ->
加入以下内容:
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
也可以通过github的:https://github.com/silenceshell/docker_mirror 这个项目,检测当前环境最快的docker源。
2.2修改镜像存储路径
2.2.1第一种方法
通过wsl2启动的,docker会自动创建两个子系统,存储位置在C:\Users\你的用户名\AppData\Local\Docker\wsl下对应两个vhdx文件,用命令:wsl -l -v --all 查看
docker-desktop是存放程序的,docker-desktop-data是存放镜像的,这两个wsl子系统都是默认放在系统盘的。
如何变更存储位置?
1、退出Docker Desktop
2、关闭WSL,命令:wsl --shutdown
检查是否全部关闭:wsl --list --verbose
3、备份现有的发行版数据到指定路径
wsl --export docker-desktop D:\00\docker-desktop.tar
wsl --export docker-desktop-data D:\00\docker-desktop-data.tar

4、注销当前子系统
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data

5、导入备份的子系统到指定路径(注意路径替换成自己的)
新建目录:
导入备份的子系统:
wsl --import docker-desktop D:\Devtools\docker\docker-desktop D:\00\docker-desktop.tar --version 2
wsl --import docker-desktop-data D:\Devtools\docker\docker-desktop-data D:\00\docker-desktop-data.tar --version 2

此时,两个目录下分别出现一个vhdx后缀的文件,如下图:
6、重启docker
重新打开Docker Desktop 图形界面,查看两个新目录中的vhdx的修改时间,若修改时间是最新时间,则说明配置成功!
7、删除不需要的tar(第三步的备份文件)
8、默认路径下的子系统已经为空(两个空文件夹)
2.2.2第二种方法
如果觉得第一种麻烦,还有第二种方法可以使用。通过文件联接来解决,关闭docker后首先将Local下整个Docker剪切到其他盘,然后在Local下创建一个文件联接来指向Docker文件夹,命令是mklink /J Docker D:\Docker这里D:\Docker是实际存储位置,然后即可正常启动docker啦。
3、基础操作
3.1检测环境是否正确
输入命令:docker run hello-world 会出现下图所示的提示,如果出现报错,这环境配置可能出现了问题。
ps:这行命令会让docker从官方仓库中拉去hello-world的镜像到本地,并且自动将其实例化成容器。
3.2 Docker的启动和停止
安装完成Docker Desktop后,默认每次开机的时候都会自动启动,但我们也可以手动启动,关闭或者重启Docker。
# 启动docker
sudo service docker start
# 重启docker
sudo service docker restart
# 停止docker
sudo service docker stop
PS:windows下不用加sudo service
3.3 对镜像的操作
3.3.1 查看镜像
查看目前所有镜像(docker images)
docker image ls
# 或者
docker images

标签 | 含义 |
---|---|
REPOSITORY | 镜像所在的仓库名称 |
TAG | 镜像标签 |
IMAGEID | 镜像ID |
CREATED | 镜像的创建日期(不是获取该镜像的日期) |
SIZE | 镜像大小 |
3.3.2 拉取镜像
除了使用官方的镜像外,我们还可以在仓库中申请一个自己的账号,保存自己制作的进行,或者拉去使用他人的镜像。
# 官方镜像
docker image pull 镜像名称
# 或简写为
docker pull 镜像名称
# 比如
docker pull ubuntu
docker pull ubuntu:16.04
# 个人镜像
docker pull 仓库名称/镜像名称
docker pull xunmi/django
# 第三方仓库拉去
docker pull 第三方仓库地址/仓库名称/镜像名称
docker pull hub.c.163.com/library/mysql:latest
(默认仓库名为library,所有从官方获取镜像相当于`sudo docker image pull library/镜像名称`)
3.3.3删除镜像
docker image rm 镜像名或镜像ID 或 docker rmi 镜像名或镜像ID
docker image rm hello-world
docker rmi 9e64176cd8a2
删除镜像的前提是没有使用这个镜像的容器,如果有需要先删除容器(报错:Error response from daemon: conflict: unable to delete 镜像ID (must be forced) - image is being used by stopped container 容器ID则代表有容器使用了此镜像。)可以尝试先执行docker rm 容器ID删除容器,如果还报错,可以看下方删除容器的具体方法。
几条删除命令的区别:
docker rm: 删除一个或多个 容器
docker rmi: 删除一个或多个 镜像
docker prune: 用来删除不再使用的 docker 对象
3.3.4 加载镜像(docker run)
镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。
docker run [可选参数] 镜像名 [向启动容器中传入的命令]
|常用可选参数|作用|
| ----- | ----- |
|-i|表示以《交互模式》运行容器。|
|-d|表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。|
|-t|表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。|
|–name|为创建的容器命名。(默认会随机给名字,不支持中文字符!!!)|
|-v|表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。|
|-p|表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80
就是将容器中的80端口,映射到主机中的8080端口|
|–network=host|表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。|
可以启动一个系统docker run -i -d -t --name=kali-test kalilinux/kali-rolling(这里我使用linux的一个发行版kali作为介绍)
或可以简写为docker run -idt --name=kali-test kalilinux/kali-rolling
PS: 如果加载一个我们没有的镜像,docker会自动从官方仓库中进行拉去。
或者我们可以启动一个网站docker run -dp 8080:80 --name docker-test docker/getting-started,如果你没有下载docker/getting-started的进行,这里会自动帮你下载。成功启动后,可以在浏览器中输入http://localhost:8080/即可看到如下页面:
3.4 使用交互式容器
上面我们成功将镜像变成了容器,但上述的命令中我们都加入了-d,让容器在后台运行了。下面我们就来讲如何和正在运行的容器进行交互。
3.4.1 查看容器
查看容器(docker ps),主要会用到ps命令:
# 查看当前所有正在运行的容器
docker ps
# 查看当前所有的容器
docker ps -a
# 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
docker ps -f name=指定的名字
# 显示2个上次创建的容器(2可以改变)
docker ps -n 2
# 显示最新创建的容器(包括所有状态)
docker ps -l
# 仅显示ip
docker ps -q
# 显示容器大小
docker ps -s

标签 | 含义 |
---|---|
CONTAINER ID | 镜像ID |
IMAGE | 创建容器的镜像名称 |
COMMAND | 默认启动命令(启动时会自动执行) |
CREATED | 创建容器的日期 |
STATUS | 当前的状态(启动了多久,多久之前退出等) |
PORTS | 映射的端口 |
NAMES | 容器的名称 |
SIZE | 容器大小(使用-s命令参数时才能看到) |
3.4.2 启动和关闭容器
# 停止容器
docker container stop 容器名或容器id
# 或可简写为
docker stop 容器名或容器id
# 强制关闭容器
docker container kill 容器名或容器id
# 或可简写为
docker kill 容器名或容器id
# 启动容器
docker container start 容器名或容器id
# 或可简写为
docker start 容器名或容器id
如果我们成功启动或者关闭一个容器的话,会返回容器名或者容器id
stop和kill的区别: stop是比较优雅的关掉一个容器,类似我们正常退出一个软件,而kill是当一个进程出现意外无法正常关闭的时候,我们强行进行关闭,有点像我们使用任务管理器进行结束进程操作
3.4.3 操作后台容器
之前我们下过一个kali并且放在了后台运行,如果没有下载可以执行下列命令(docker run -i -d -t --name=kali-test kalilinux/kali-rolling),下面我们就用下面的命令开启kali(如果你下的是其他系统,比如ubuntu也可以举一反三一下)
首先我们确保我们要进入的容器是开启状态的,使用docker ps -a查看其中的STATUS属性是否是Up开头,如果不是先照着上面启动容器的方法开启容器
我们开启容器后,如果需要在容器内执行命令,可以将后台切换到前台,也可能使用docker命令将我们需要执行的命令传入。
操作方法有很多种,这里我们介绍一些比较常用的方法。
# 如果我只需要执行简单的一两条命令可以使用docker exec
# 执行单条命令 (-i: 启动并且保留交互式命令行; -t:作用是分配一个虚拟的终端; docker run )
docker exec -it 容器名或容器id 执行的命令
# 比如
docker exec -it kali-test whoami
# 用这种方法,我们还可以启动命令行,根据Linux的特性,系统程序会在/bin中,linux中常用的Shell有多个,其中大部分用的Linux默认的为bash
# 所以我们启动命令可以自行如下命令(除了/bin/bash外,linux一般还会带/bin/sh、/bin/rbash、/bin/dash等,具体区别可以自行百度)
docker exec -it 容器名或容器id /bin/bash
# 比如
docker exec -it kali-test /bin/bash
# 除了exec外还有attach可以使用,但它有个弊端,多终端启动attach后,都会会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
docker attach 容器名或容器id
# 比如
docker attach kali-test
|exec可选参数|作用|
| ----- | ----- |
|-d|会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。|
|-e|设置环境变量|
|-i|表示以《交互模式》运行容器。|
|-t|表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。|
|-u|设置用户名和UID。|
|-w|设置容器内的工作目录。|
除了上述方法外,在进入容器后,我们还可以尝试安装SSH或者nsenter尝试登陆,不过这两种方法都先进入容器安装后才能使用,但并不建议在 Docker 容器中运行 sshd。
# nsenter安装步骤
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar -xzvf util-linux-2.24.tar.gz
cd util-linux-2.24/
./configure --without-ncurses
make nsenter
sudo cp nsenter /usr/local/bin
3.4.4删除容器
删除容器(docker rm)
如我我们需要删除一个容器,首先需要确保这个容器已经停止了,因为正在运行的容器是无法直接删除。
我们可以运行一下docker ps -a,如果发现没有停止,可以使用docker stop停止(STATUS下已Exited开头则是停止的)。
# 使用rm删除容器
docker rm 容器名或容器id
# 列如
docker rm docker-test

如果报错Error response from daemon: You cannot remove a running container 容器ID. Stop the container before attempting removal or force remove则代表这个容器已经启动,需要执行 docker stop 容器id,停止此容器。
3.5容器制作成镜像
我们为什么要把容器制作成镜像?
- 镜像可以看作为是一种备份,如果我们后期环境出现了问题,可以还原到早期镜像。
- 镜像便于传播,可以让自己的其他设备或他人的重复利用变得更加简单容易。
# 将容器制作成镜像
docker commit 容器名 镜像名
# 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
docker save -o 保存的文件名 镜像名
# 镜像解压
docker load -i 文件路径/备份文件
我们将打包备份的镜像可以通过网络发送到其他设备上,使用docker镜像解压即可直接使用你的环境。
4、Docker desktop 仪表盘
Docker 仪表板的主要作用为:快速访问容器日志,启动容器的 shell,并轻松管理容器生命周期(停止、删除等)。
每个容器显示根据自身改变。
直接点击一个容器,我们可以进入容器的交互界面,其中能看到容器的log,参数,使用状况等
评论区