Docker是在Linux下的一种容器,支持类似于沙盒环境下的环境搭建、软件安装、软件使用、程序编码等操作。
1 简单介绍
- 镜像Image:类似于虚拟机里的镜像(
.ISO
),只读模板,独立的文件系统,可用来创建新的容器。 - 容器Container
- 是由Docker镜像创建的运行实例,类似于VM虚拟机,支持启动、停止、删除等操作。
- 每个容器间相互隔离,容器中可运行特定应用,包含特定应用代码及所需的依赖文件。
- 仓库Repository:镜像商店,用于传播镜像的地方。
- 官方仓库:https://hub.docker.com/。
- 国内仓库:https://hub.daocloud.io/。
1-1 安装
- 傻瓜式安装后,重启电脑:Docker Desktop for Windows。
- 双击桌面的“Docker Desktop”图标,启动Docker Desktop。
- 如果弹窗提示“Docker Desktop requires a newer WSL kernel version”。
- 则以管理员身份打开PowerShell,输入命令
wsl --update
进行WSL升级。
1-2 换源
- 国内从DockerHub拉取镜像时网速慢,可配置镜像加速器加速,很多云服务商都提供了国内加速器服务。
- Docker Desktop>Settings>Docker Engine>在
builder
前增加如下内容>点击Apply & restart
按钮。
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"insecure-registries": [],
"debug": true,
"experimental": false,
1-3 验证
- 命令窗口输入
docker run hello-world
,查看docker是否会从官方仓库中拉取hello-world镜像到本地。 - 并自动将其实例化成容器,成功则说明镜像加速器配置正确,Docker Desktop的Containers中显示该镜像。
2 镜像操作
- 以下基础操作均支持在PowerShell命令窗口中进行。
2-1 查看镜像
- REPOSITORY(镜像所在仓库的名称)、TAG(镜像标签)、IMAGE ID(镜像ID)。
- CREATED(镜像的创建日期,而并不是获取该镜像的日期)、SIZE(镜像大小)。
# 查看当前所有的镜像(docker images)
docker images
docker image ls
2-2 拉取镜像
- 官方默认仓库名为library,
docker pull <image-name>
相当于docker pull library/<image-name>
。
# 拉取官方镜像(docker pull)
docker image pull <image-name>
docker pull <image-name>
docker pull ubuntu
docker pull ubuntu:16.04
# 拉取个人镜像
docker pull <depository-name>/<image-name>
docker pull xxx/flask
# 拉取第三方仓库
docker pull <3th-depository-url>/<depository-name>/<image-name>
# 默认仓库名为library
docker pull hub.c.163.com/library/mysql:latest
2-3 删除镜像
- 删除镜像的前提是没有使用这个镜像的容器,若已使用,需要先删除该镜像下的所有容器。
# 删除镜像(docker rmi)
docker image rm <image-name|image-id>
docker rmi <image-name|image-id>
docker image rm ubuntu
docker rmi 9e64176cd8a2
2-4 创建容器
- run可选参数及作用
-i
:以交互模式运行容器。-d
:创建一个守护式容器在后台运行,该方式不会自动登录容器。-t
:容器启动后进入命令行模式,即创建后立马分配一个伪终端。-v
:目录映射,即宿主机目录做修改,然后共享到容器中。-p
- 端口映射,即将容器中的端口号映射到宿主机的端口号中。
- 例
-p 8080:80
将容器的80端口映射到宿主机的8080端口。
--name
:为创建的容器命名,默认随机命名,不支持中文命名。--network=host
- 将宿主机的网络环境映射到容器中,使得容器的网络与宿主机相同。
- 适用于需要容器与宿主机共享网络资源的场景(环境相同存在风险)。
# 创建容器(docker run)
docker run [-i|-d|-t|-v|-p|--name|--network=host] <image-name> [command]
# 启动linux的一个发行版kali系统
docker run -idt --name=kali-test kalilinux/kali-rolling
docker run -i -d -t --name=kali-test kalilinux/kali-rolling
# 启动网站,本地http://localhost:8080/查看
docker run -dp 8080:80 --name docker-test docker/getting-started
3 交互式容器
- 创建容器时使用命令加入了
-d
参数,让容器在后台运行。 - 接下来介绍内容,如何与正在运行的容器进行交互的操作。
3-1 查看容器
- CONTAINER ID(镜像ID)、IMAGE(镜像名)、COMMAND(默认启动命令)。
- CREATED(创建容器的日期)、STATUS(当前的状态)、PORTS(映射端口)。
- NAMES(容器名称)、SIZE(容器大小)。
docker ps # 查看当前所有正在运行的容器(docker ps)
docker ps -a # 查看当前所有的容器
docker ps -f name=<NAMES> # 使用name过滤器
docker ps -f id=<CONTAINER ID> # 使用id过滤器
docker ps -f STATUS=exited # 所有停止的容器过滤
docker ps -f STATUS=running # 所有正在运行的容器过滤
docker ps -n <n> # 显示n个上次创建的容器
docker ps -n 2 # 显示2个上次创建的容器
docker ps -l # 显示最新创建的容器
docker ps -q # 仅显示CONTAINER ID
docker ps -s # 显示容器大小
3-2 启动容器
- 如果成功启动容器,会返回容器ID。
# 启动容器
docker start <container-name|container-id>
docker container start <container-name|container-id>
3-3 关闭容器
- 如果成功关闭容器,会返回容器ID。
# 关闭容器
docker stop <container-name|container-id>
docker container stop <container-name|container-id>
# 强制关闭容器
docker kill <container-name|container-id>
docker container kill <container-name|container-id>
3-4 删除容器
- 删除容器需要确保该容器已经停止,正在运行的容器无法直接删除。
# 删除容器
docker rm <container-name|container-id>
3-5 后台容器
- 需要先确保操作的容器是开启状态的,以先前启动的linux发行版kali系统为例。
- exec可选参数及作用
-i
:以交互模式运行容器。-d
:创建一个守护式容器在后台运行,该方式不会自动登录容器。-t
:容器启动后进入命令行模式,即创建后立马分配一个伪终端。-e
:设置环境变量。-u
:设置用户名和UID。-w
:设置容器内的工作目录。
docker exec -it <container-name|container-id> <command>
# 查看kali-test容器的有效用户名
docker exec -it kali-test whoami
# 根据Linux特性启动bash命令行
docker exec -it kali-test /bin/bash
docker attach <container-name|container-id>
# 附着到正在运行的容器上
docker attach kali-test
3-6 镜像制作
- 打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,则加
.tar
后缀。
# 将容器制作成镜像
docker commit <container-name> <image-name>
# 镜像打包备份
docker save -o <file-name> <image-name>
# 镜像解压即可直接使用环境
docker load -i <file-path>/<backup-file>