Docker使用

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:\Users\> wsl --list -v  # 退出docker,用任务管理器杀进程
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2

C:\Users\> wsl --export docker-desktop-data "D:\\docker-desktop-data.tar" # 将docker-desktop-data导出到文件中(备份image及相关文件)
正在导出,这可能需要几分钟时间。   
操作成功完成。 

C:\Users\> wsl --unregister docker-desktop-data # 从wsl取消注册docker-desktop-data
正在注销。
操作成功完成。 

C:\Users\> 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

/c39e4bf43084/images/image-20230219223022609.png

参数说明:

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

/c39e4bf43084/images/image-20240215071630079.png

注意:它们是同一个镜像,只是别名不同而已。

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

/c39e4bf43084/images/image-20240215071820770.png

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:删除一个或多个容器。

强制删除容器 db01db02docker 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 局域网络

/c39e4bf43084/images/image-20240412122951384.png

docker network inspect:显示某个局域网络信息

/c39e4bf43084/images/image-20240412122916271.png

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 是停掉容器然后删除掉二者区别

0%