跳至主要內容

Docker

大约 11 分钟

Docker


安装

Ubuntu

ubuntu安装docker详细步骤 - 腾讯云开发者社区-腾讯云 (tencent.com)open in new window

Docker 入门指南:如何在 Ubuntu 上安装和使用 Docker - 卡拉云 (kalacloud.com)open in new window


使用如下脚本来安装 docker 即可:

# Install the latest version docker
curl -s https://get.docker.com/ | sh

# Run docker service
systemctl start docker

旧版安装指令:

# 更新现有的软件包列表
apt update
# 安装所需工具包
sudo apt install apt-transport-https ca-certificates curl gnupg-agent  software-properties-common
# 然后将官方 Docker 版本库的 GPG 密钥添加到系统中:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 将 Docker 版本库添加到APT源:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
# 用新添加的 Docker 软件包来进行升级更新。
sudo apt update
# 确保要从 Docker 版本库,而不是默认的 Ubuntu 版本库进行安装:
apt-cache policy docker-ce
# 安装 Docker :
sudo apt install docker-ce
# 现在 Docker 已经安装完毕。我们启动守护程序。检查 Docker 是否正在运行:
sudo systemctl status docker
# 设置 docker 开机自动启动
sudo systemctl enable docker.service

换源

Docker-hub 换源

打开 /etc/docker/daemon.json 并输入

{
    "registry-mirrors": [
      "https://hub-mirror.c.163.com",
      "https://ustc-edu-cn.mirror.aliyuncs.com"
      ]
}

然后重启 docker

service docker restart

镜像

关于docker容器和镜像的区别 - jason.bai - 博客园 (cnblogs.com)open in new window

image-20220923175753464


常用指令

  • 拉取镜像

    # docker pull [镜像名]
    # vuldocker/lamp映像包括(php+apache+MySQL) ,只需要下载dvwa源码即可
    docker pull vuldocker/lamp   
    

    docker pull 下来的镜像默认存在 /var/lib/docker/ 目录下

    image-20221109102750973


  • 查看当前镜像列表

    docker images
    
  • 修改镜像 Tag

    # docker tag [镜像ID] [镜像名称]:[tag版本信息]
    docker tag 8ef375298394 MySQL:v5.7
    
    # docker tag [原tag][新tag]
    docker tag MySQL:v5.7 http://100.1.1.111:8080/MySQL:v5.7
    

删除镜像

# 根据 镜像名称 来删除镜像
docker rmi centos 
# 根据 镜像:标签名称 来删除镜像
docker rmi centos:v2
# 根据 镜像ID 来删除镜像,
docker rmi 7e6257c9f8d8 

删除两个 id 相同的镜像

Docker - 两个id相同的镜像怎么删除_Joker_Wangx的博客-CSDN博客_docker 镜像重复open in new window

通过 docker rmi [镜像:tag] 来删除对应标签的镜像, 实际上


镜像导出与导入

docker容器导出,并将导出镜像在另外一台设备上运行起来_hx_long的博客-CSDN博客_docker 容器导出open in new window


将镜像跑为容器

Docker run 命令 | 菜鸟教程 (runoob.com)open in new window


docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • -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: 设置容器使用内存最大值;

  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

  • --link=[]: 添加链接到另一个容器;

  • --expose=[]: 开放一个端口或一组端口;

  • --volume , -v: 绑定一个卷

  • --restart=always: 容器设置自动启动

    • no: 不自动重启容器. (默认value)
    • on-failure: 容器发生 error
    • 而退出(容器退出状态不为0)重启容器
    • unless-stopped: 在容器已经 stop 掉或 Docker stoped/restarted 的时候才重启容器
    • always: 在容器已经 stop 掉或 Docker stoped/restarted 的时候才重启容器

    如果创建时未指定 --restart=always ,可通过update 命令

    docker update --restart=always [container-id]
    

docker run -it -d --name dvwa -p 8008:80 vuldocker/lamp

设置名字为dvwa,映射端口为8008

-i: 交互式操作。

-t: 终端(一般与i一起)

-d:后台运行。

从图中可以看到在执行

docker run -it -d --name dvwa -p 8008:80 vuldocker/lamp

指令时出现了问题,说已经有container使用了dvwa这个名字( The container name "/dvwa" is already in use by container "6e3fc590b41c9c6cf6c0d81de14730c127240edecb6a2a5e3debf1565eb3fe6b") ,但是从图中也可以看到docker ps指令执行后没有正在运行的container,可以执行


推送到 Habor

**因为是在只有http sql apach服务的镜像上跑的容器,在容器里配置了dvwa(并没有改变镜像) **

此时将原来的镜像推送还是只有http sql apach服务的镜像,没有自己在容器里的所有配置 需要将容器保存为镜像再去推送才行

在本地docker客户端--靶机进行如下配置:

touch /etc/docker/daemon.json
vim /etc/docker/daemon.json

文件中如下配置

{
	"insecure-registries": ["habor-hostip:端口"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
# 登录 Habor (登录成功会提示 Login Succeeded)
docker login [HaborHostip:端口]
# 将本地的image新建1个新的tag
docker tag SOURCE_IMAGE[:TAG] [HaborHostip]:[端口]/[目标路径][:TAG]
# 推送镜像
docker push [HaborHostip]:[端口]/[目标路径][:TAG]

后续可以通过 docker pull 命令拉取镜像

docker pull [HaborHostip]:[端口]/[目标路径][:TAG]

容器

容器Docker进入的四种方法 - 指尖上的代码go - 博客园 (cnblogs.com)open in new window


常用指令

将镜像跑为容器

# 进入容器(使用 bash 或者 sh 均可)
docker container exec -it [容器id] /bin/bash
docker container exec -it [容器id] /bin/sh

# 强制删除容器 docker rm -f [容器 id]
# 删除所有容器
docker rm -f $(docker ps -a -q)   

# 显示当前正在运行的容器
docker ps  

# 查看容器日志
docker logs [容器ID]

从容器中复制文件到本地(docker cp)

例:从容器中复制一个test.db文件到本地data目录。

# 假设存在一个镜像名为 kitty,标签为0.1,创建一个名为 koko的容器

# 1. create a container first
docker run -itd --name koko kitty:0.1 /bin/bash
# 2. copy test.db from koko tmp directory to local data directory.
docker cp koko:/tmp/test.db ./data/test.db
# 3. rm container koko
docker rm -f koko

docker cp也可以从本地copy文件到容器中:

# 以上面的代码为例,把容器路径和本地路径颠倒即可.
docker cp ./data/test.db koko:/tmp/test.db

在docker中,LAMP是指Linux(操作系统) 、Apache HTTP服务器、MySQL(MariaDB等数据库软件) 和PHP(Perl或Python) 的组合方案,一般用来建立Web服务器环境。

docker中的lamp是什么-Docker-PHP中文网open in new window


将容器重新打包成镜像

Docker 使用-将容器打成镜像_谈谈1974的博客-CSDN博客_容器打包成镜像open in new window


在使用 docker-compose build 命令时, 在有些镜像 build 完启动后发现其环境是并不完整的, 缺少了一些东西

比如在复现 CVE-2015-3337 时需要安装一个 elasticsearch-head 的插件, 发现用 vulhub 仓库里的 dockerfile

docker-compose build 构建进行时插件实际上并没有安装成功, 但是镜像成功 build 了

进入启动的容器进行排错, 最终修复了问题后可以将目前用拥有完整环境的容器重新打包成镜像

Docker 提供了 commit 命令支持将容器重新打成镜像文件,其命令格式如下所示

 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Option功能
-a指定新镜像作者
-c使用 Dockerfile 指令来创建镜像
-m提交生成镜像的说明信息
-p在 commit 时,将容器暂停

可以先查看下当前运行容器的 id

docker ps -a | grep [容器相关标识, 比如 cve-2015-3337 之类]
# 添加描述信息并将容器打包成新的镜像(给个新tag)
docker commit -m "add elasticsearch-head" 10f2daf4ead5 cve-2015-3337_es:v0

常见问题

ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

[openvpn] ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network · Issue #418 · docker/for-linux (github.com)open in new window

docker network prune

unable to connect to deb.debian.org:http

image-20220919202703896

Docker failed to fetch http://deb.debian.org/debian/dists/jessie/InRelease - Stack Overflowopen in new window

image-20220919202953164

image-20220919203028392


There is no public key

使用apt-get时出现 “no public key available” 的解决方法-阿里云开发者社区 (aliyun.com)open in new window

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com [报错缺失的public key]

debconf: delaying package configuration, since apt-utils is not installed

[16.04] debconf: delaying package configuration, since apt-utils is not installed · Issue #319 · phusion/baseimage-docker (github.com)open in new window

apt-get update && apt-get install -y --no-install-recommends apt-utils

安装插件失败 - failed to extract plugin [/usr/share/elasticsearch/plugins/head.zip]: ZipException[zip file is empty]

在使用 docker-compose build 时发现有些时候虽然 build 成功了但是实际上环境是不完整的, 比如在复现 CVE-2015-3337 时需要安装一个插件

发现 vulhub 该 cve 目录下 docker-compose build 拉取了一个空的插件安装包并且解压失败了, 但是却成功 build

image-20221208103255765

观察上图中的输出信息可以看到在安装插件时向 http://download.elasticsearch.org/mobz/elasticsearch-head/elasticsearch-head-1.x.zip. 请求了 zip 资源, 尝试在本地电脑上访问此链接发现下载不下来, 那么可以假定是指向链接出了问题, 那么现在就需要找到一个可用的插件安装链接

在使用 docker-compose up -d 后进入该容器然后尝试为拉取插件配置一个不可用的代理

plugin -DproxyHost=192.168.1.33 -DproxyPort=7890 --install mobz/elasticsearch-head/1.x

此时会尝试从各个可能的地址拉取插件

image-20221208104125668

在本地机器上尝试这些链接, 最终找到可用链接 https://codeload.github.com/mobz/elasticsearch-head/zip/refs/heads/1.x

于是可以使用该链接安装插件

bin/plugin --install mobz/elasticsearch-head/1.x -u https://codeload.github.com/mobz/elasticsearch-head/zip/refs/heads/1.x

image-20221208095040475

验证插件是否安装成功:

image-20221208104020031

可以看到已经成功安装上了

然后 将容器重新打包成镜像 以便后续使用