注意
本文最后更新于 2024-04-17,文中内容可能已过时。
Docker 安装
下载: https://docs.docker.com/get-docker/
Win 10(家庭版)
需要安装Hyper-V 才可以。将如下代码添加到记事本中,并另存为 Hyper-V.cmd 文件。右键以管理员身份运行,然后等待安装,最后输入 Y 进行重启即可
1
2
3
4
5
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
重启完后双击 docker 安装包安装,再次重启,启动 docker,可能提示 wsl 版本低,wsl --update
Win 10 (专业版)
启用Hyper-V 进行安装:在控制面板—启用或关闭 Windows 功能,勾选Hyper-V 和容器 两个选项,两个都要,不然报错。然后重启,双击 exe 文件。
注意:如果使用安卓虚拟机的话,二者会有冲突。安卓虚拟机需要关闭 Hyper-V,docker 需要开启 Hyper-V。有文章说在控制面板—启用或关闭 Windows 功能—启用 Windows 虚拟机监控程序平台 ,勾选这个可以解决冲突,但我试了没有用。我用夜神模拟器有冲突,改用蓝叠 4 模拟器(hyper-v)版本
配置阿里云镜像: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
修改默认位置:默认是在 C 盘
打开设置,选择存储位置
之前眼瞎 没找见设置里的 Disk image location 选项,找了另一篇文章里的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\U sers\> wsl --list -v # 退出docker,用任务管理器杀进程
NAME STATE VERSION
* docker-desktop Stopped 2
docker-desktop-data Stopped 2
C:\U sers\> wsl --export docker-desktop-data "D:\\docker-desktop-data.tar" # 将docker-desktop-data导出到文件中(备份image及相关文件)
正在导出,这可能需要几分钟时间。
操作成功完成。
C:\U sers\> wsl --unregister docker-desktop-data # 从wsl取消注册docker-desktop-data
正在注销。
操作成功完成。
C:\U sers\> wsl --import docker-desktop-data "E:\\DockerImage\\wsl" "D:\\docker-desktop-data.tar" --version 2 # 将导出的docker-desktop-data再导入回wsl,并设置我们想要的路径,即新的镜像及各种docker使用的文件的挂载目录,我这里设置到E:\\DockerImage\\wsl
参考: https://blog.csdn.net/u013948858/article/details/111464534
Debian 10
安装 Docker
1)直接使用脚本安装:
1
2
3
curl -sSL https://get.docker.com/ | sh
# 使用阿里镜像源
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2)执行以下步骤从 Docker 的存储库安装最新的稳定 Docker 版本。root 用户下执行
1
2
3
4
5
6
7
8
9
10
apt update
# 安装通过 HTTPS 添加新存储库所需的软件包:
apt install apt-transport-https ca-certificates curl software-properties-common gnupg2
# 使用以下 curl 命令导入存储库的 GPG 密钥;成功后,命令将返回 OK 。
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# 将稳定的 Docker APT 存储库添加到系统的软件存储库列表中:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $( lsb_release -cs) stable"
# 更新 apt 软件包列表并安装最新版本的 Docker CE (Community Edition)
apt update
apt install docker-ce
3)离线安装
因网络问题,导致 docker 无法联网安装,所以使用离线安装的方式。直接参考这个文章: https://blog.csdn.net/weixin_42571882/article/details/134015815
下载 docker 安装包: https://download.docker.com/linux/static/stable/x86_64/ ,网盘下载:docker-25.0.5.tgz
1
2
3
4
# 注意从网盘下载的文件后缀名为docker-25.0.5.tgz.zip,需要先改为docker-25.0.5.tgz
mv docker-25.0.5.tgz.zip docker-25.0.5.tgz # 改后缀
tar -zxvf docker-25.0.5.tgz # 解压docker安装包
cp docker/* /usr/bin/ # 将解压后的文件复制到/usr/bin/目录下
赋予文件执行权限
1
2
3
4
# 赋予文件执行权限,可以先赋予,在复制到/usr/bin/目录下
chmod +x /usr/bin/docker*
查看是否有执行权限
ls -l /usr/bin/docker*
将 docker 注册成系统服务
1
vim /etc/systemd/system/docker.service
添加如下内容,然后保存退出(我也不知道这些内容的具体含义,反正目前用着没问题)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
赋予文件执行权限
1
2
3
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker
修改 docker 的存储路径
方法一:使用软连接(个人常用)
1
2
3
4
5
6
7
8
9
# 查看现在的存储路径,默认是 /var/lib/docker
docker info | grep "Root Dir
# 将这个目录复制到/opt目录下,名字任意
cp -r /var/lib/docker /opt/docker_images
# 删除原来的目录
rm -r /var/lib/docker
# 创建软链接
ln -s /opt/docker_images /var/lib/docker
# 记得重启docker或系统
方法二:修改配置文件
因为我这里没有 /etc/docker/daemon.json 这个文件,遂放弃。
安装 docker-compose
1
2
3
4
5
6
# 从github下载docker-compose二进制文件,这可能需要一段时间
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose- $( uname -s) - $( uname -m) " -o /usr/local/bin/docker-compose
# 给予运行权限
chmod +x /usr/local/bin/docker-compose
# 查看安装版本
docker-compose -v
Docker 命令
参考:Docker 命令大全|菜鸟教程
镜像仓库
login/logout
1
2
docker login -u 用户名 -p 密码 # 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout # 登出Docker Hub
search
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
1
2
3
4
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像DESCRIPTION(描述),不省略;
-f <过滤条件>:列出收藏数(点赞)不小于指定值的镜像。
--limit 5:列出前5个镜像
build
docker build :用于使用 Dockerfile 创建镜像
–tag,-t:镜像的名字及标签
-f:指定要使用的 Dockerfile 路径
1
docker build -t bluelotus_xss_docker:2.0 .
注意:最后要加路径,这里最后有个空格和点,代表上下文路径。
pull
语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS 选项:
–all-tags, -a: 用于下载该存储库中具有不同标签的所有镜像。
–disable-content-trust: 它会在拉取之前跳过镜像验证。
–platform: 用于设置平台。
–quiet, -q: 用于静默拉 取镜像(不冗长)。
–help: 了解更多有关命令的信息
1
2
3
docker pull citizenstig/dvwa # 默认tag是:latest,更多tag需要再hub中查看
docker pull mysql:5.7
docker pull centos:centos6.8
push
注意:发布镜像时,需要将 image 重新命名,命名格式应为: dockerhub 用户名/镜像名
1
2
3
docker tag bluelotus_xss_docker:1.0 bluefoxqaq/bluelotus_xss_docker:1.0
docker login -u admin -p 123456
docker push bluefoxqaq/bluelotus_xss_docker:1.0
本地镜像管理
images
docker images :列出本地镜像。
语法:docker images [OPTIONS] [REPOSITORY[: TAG]]
OPTIONS 说明:
-a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
–digests : 显示镜像的摘要信息;
-f : 显示满足条件的镜像;
–format : 指定返回值的模板文件;
–no-trunc : 显示完整的镜像信息;
-q : 只显示镜像 ID。
rmi
docker rmi : 删除本地一个或多个镜像。
语法:docker rmi [OPTIONS] IMAGE [IMAGE…]
OPTIONS 说明:
-f : 强制删除
–no-prune : 不移除该镜像的过程镜像,默认移除
例如:docker rmi -f runoob/ubuntu:v4
tag
docker tag :为本地镜像添加一个新的标签
1
docker tag bluelotus_xss_docker:1.0 bluefoxqaq/bluelotus_xss_docker:1.0
注意:它们是同一个镜像,只是别名不同而已。
inspect
docker inspect :获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。
-f ,–format:指定返回值的模板文件。Go 模板格式化输出
1
2
3
4
5
6
docker inspect debian:12.5
# 查看镜像的操作系统架构(arm还是x86)
docker inspect --format= '{{.Os}}/{{.Architecture}}' e6bce4a855e5
# 获取正在运行的容器dvwa的 IP
docker inspect --format= '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dvwa
save
docker save :将指定镜像保存成 tar 归档文件。
-o :输出到的文件。
1
2
3
# 例如
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
docker save -o xss_platfrom_docker.tar 79bb31b88efb
load
docker load :导入使用 docker save 命令导出的镜像。
-i:指定导入的文件
-q:精简输出信息
1
docker load -i xss_platfrom_docker.tar
export 和 import 导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。你的 dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。
docker save 保存的是镜像(image),docker export 保存的是容器(container);docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
容器操作
ps
docker ps : 列出容器
-a : 显示所有的容器,包括未运行的。
-f : 根据条件过滤显示的内容。
–format : 指定返回值的模板文件。
-l : 显示最近创建的容器。
-n : 列出最近创建的 n 个容器。
–no-trunc : 不截断输出。
-q : 静默模式,只显示容器编号。
-s : 显示总的文件大小。
run
docker run : 创建一个新的容器并运行一个命令
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器 ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机 映射到主机的端口
-p: 指定端口映射,格式为:主机 (宿主)端口: 容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
–name=“nginx-lb”: 为容器指定一个名称;
–dns 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致;
–dns-search example. com: 指定容器 DNS 搜索域名,默认和宿主一致;
-h “mars”: 指定容器的 hostname;
-e username=“ritchie”: 设置环境变量;
–env-file=[]: 从指定文件读入环境变量;
–cpuset=“0-2” or –cpuset=“0,1,2”: 绑定容器到指定 CPU 运行;
-m : 设置容器使用内存最大值;
–network=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
**–link=[]: 添加链接到另一个容器;
–expose=[]: 开放一个端口或一组端口;
–volume , -v: 绑定一个卷
start/stop/restart
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
exec
docker exec :在运行的容器中执行命令
-d : 分离模式: 在后台运行
-i : 即使没有附加也保持 STDIN 打开
-t : 分配一个伪终端
例如:
1
2
3
$ docker exec -i -t mynginx /bin/bash // 在容器 mynginx 中开启一个交互模式的终端
$ docker exec -it 9df70f9a0714 /bin/bash // 9df70f9a0714 是容器 id
$ docker exec 9df70f9a0714 service nginx strart
cp
docker cp : 用于容器与主机之间的数据拷贝。
语法:docker cp [OPTIONS] srcPath destPath
例如:
将主机/ www/runoob目录拷贝到容器 96f7f14e99ab 的/ www目录下 。
1
docker cp / www/runoob 96f7f14e99ab:/www/
将主机/ www/runoob目录拷贝到容器 96f7f14e99ab 中,目录重命名为 www 。
1
docker cp / www/runoob 96f7f14e99ab:/www
将容器 96f7f14e99ab 的/ www目录拷贝到主机的/tmp目录中 。
1
docker cp 96f7f14e99ab:/ www /tmp/
rm
docker rm :删除一个或多个容器。
强制删除容器 db01、db02:docker rm -f db01 db02
update
docker update :更新一个或多个容器的配置
1
docker update --restart= always 容器 ID ( 或者容器名) # 容器开机自启
rename
将容器重命名
1
docker rename 原容器名称新容器名称
logs
docker logs : 获取容器的日志
–since:显示某个开始时间的所有日志
-t:显示时间戳
–tail:仅列出最新 N 条容器日志
1
2
# 查看某时间之后最新的 100 条日志:
docker logs -t --since= "2021-08-18T11:46:37" --tail= 100 CONTAINER_ID)
网络管理
docker network create:创建一个 docker 局域网络
1
2
docker network create mynetwork
docker network create --subnet 172.16.7.0/24 mynetwork # 指定网段
docker network connnet:将某个容器连接到一个 docker 网络
1
2
3
4
5
6
7
8
9
docker network connect mynetwork nginx
docker network connect mynetwork 镜像 id
# 在 docker run 时配置网络信息
docker run --name mynginx --network mynetwork --network-alias nginx --ip 172.16.7.2 xxxxxxxx
# --network :加入 docker 内部网络
# --network-alias :配置容器在内部局域网的网络别名
# --ip:配置在内部局域网的 ip 地址 172.172.0.1 是网关
# 一个名为 mynginx 的容器,加入到 mynetwork 的网络当中,他的网络名为 nginx。
# 启动 Docker 容器的时候,使用默认的网络是不支持指派固定 IP 的
docker network disconnect:将某个容器退出某个局域网络
docker network ls:显示所有 docker 局域网络
docker network inspect:显示某个局域网络信息
docker network rm:删除 docker 网络
docker network prune:删除所有未引用的 docker 局域网络
Docker-Compose
Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
安装
1
2
3
4
5
6
7
# 从 github 下载 docker-compose 二进制文件,这可能需要一段时间
curl -SL https://ghproxy.com/https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 给予运行权限
chmod +x /usr/local/bin/docker-compose
# 查看安装版本
docker-compose -v
简单使用
docker-compose up :该命令可以自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
默认情况下,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过 Ctrl+c 停止命令时,所有容器将会停止。如果希望在后台启动并运行所有的容器,使用 docker-compose up -d。
docker-compose ps :列出项目中目前的所有容器
docker-compose pull :拉取服务依赖的镜像
docker-compose restart :重启项目中的服务
docker-compose start :启动已经存在的服务容器。
docker-compose stop :停止正在运行的容器,可以通过 docker-compose start 再次启动
docker-compose rm :删除所有(停止状态的)服务容器。选项包括: –f, –force,强制直接删除,包括非停止状态的容器 -v,删除容器所挂载的数据卷
stop 是只停掉容器不删除;down 是停掉容器然后删除掉二者区别