《工具记录》Docker 入门基础

1:简介

1.1:Docker

Docker 是一个开源的容器化平台,提供了一个轻量级的虚拟化解决方案。

相关概念:

  • Image(镜像)
    • 应用程序及其依赖环境的只读模板,是容器运行的基础
    • 镜像通常由 Dockerfile 定义构建
  • Container(容器)
    • 镜像的一个运行实例,运行环境隔离
  • Dockerfile
    • 构建镜像的脚本文件,描述如何构建一个镜像

Docker 提供自带的网络模式和存储卷,以支持容器间的通信和数据持久化

1.2:Docker Compose

Docker Compose 是 Docker 的编排工具,用于定义和运行多个容器。

相关概念:

  • Service(服务):某个镜像的容器运行实例,负责实现某个具体的功能
  • Project(项目):由多个关联的 Service 组成,是一个完整的业务架构
  • docker-compose.yml:构建 Project 的配置文件,用来定义一组相关联的 Service

2:Docker 命令

2.1:基本命令

启动 docker:

  • systemctl start docker

重启 docker:

  • systemctl restart docker

查看命令帮助:

  • docker --help

查看版本:

  • docker -v

2.2:image 相关

2.2.1:常见格式

查看帮助:

  • docker image --help

查看本地镜像列表:

  • docker image ls
  • docker images

拉取镜像:

  • docker image pull <name>[:tag]
  • docker pull <name>[:tag]

删除本地镜像:

  • docker image rm <id|name>
  • docker rmi <id|name>

2.2.2:常用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看本地镜像列表
docker image ls

# 自定义输出格式
docker image ls --format "{{.ID}} : {{.Repository}} : {{.Tag}} : {{.Size}}"

# 拉取镜像(指定 tag 版本)
docker pull tomcat:11.0.2

# 拉取镜像(默认最新)
docker pull nginx

# 删除本地镜像
docker rmi 66f8bdd3810c

2.3:container 相关

2.3.1:常见格式

查看帮助:

  • docker container --help

列出所有运行中的容器:

  • docker container ps
  • docker container ls
  • docker ps

列出所有的容器:

  • docker ps -a

创建新的容器并启动:

  • docker container run [option] <image> [command]
  • docker run [option] <image> [command]

启动已存在的容器:

  • docker container start <id|name>
  • docker start <id|name>

将数据从容器复制到宿主机:

  • docker container cp <container id>:<container path> <host path>
  • docker cp <container id>:<container path> <host path>

将数据从宿主机复制到容器:

  • docker cp <host path> <container id>:<container path>

进入一个已经运行的容器内部:

  • docker container exec -it <id|name> /bin/bash
  • docker exec -it <id|name> /bin/bash
  • docker exec -it <id|name> /bin/sh

停止容器:

  • docker container stop <id|name>
  • docker stop <id|name>

删除容器:

  • docker container rm <id|name>
  • docker rm <id|name>

2.3.2:选项介绍

1
2
3
4
5
6
7
8
9
docker ps [option]

-a Show all containers (default shows just running)
-q Only display container IDs
--format <string> Format output using a custom template
--filter <filter> Filter output based on conditions provided
--filter "status=<created|running|exited|restarting|paused|dead>"
--filter "ancestor=<image>"
-n <int> Show n last created containers (includes all states)

1
2
3
4
5
6
7
8
docker run [option] <image> [command]

--name <string> Assign a name to the container
-p <host port>:<container port> Publish a container's port(s) to the host
-v <host path>:<container path> Bind mount a volume
-d Run container in background and print container ID
-i Keep STDIN open even if not attached
-t Allocate a pseudo-TTY

2.3.3:常用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 列出所有运行中的容器
docker ps

# 列出所有容器,包括已停止的容器
docker ps -a

# 根据条件过滤容器(已停止,并退出)
docker ps --filter "status=exited"

# 根据条件过滤容器(正在运行)
docker ps --filter "status=running"

# 根据条件过滤容器(镜像)
docker ps --filter "ancestor=tomcat"

# 自定义输出格式
docker ps -a --format "{{.ID}} : {{.Image}} : {{.Names}} : {{.Status}}"

# 创建容器,并进入容器(交互式伪终端)
docker run --name tomcat_test_1 -p 8081:8080 -it tomcat:11.0.2

# 创建容器,将其挂到后台
docker run --name tomcat_test_2 -p 8082:8080 -d tomcat

# 挂载卷到容器
docker run -p 5000:5000 -v datastore-volume:/datastore -d dgtlmoon/changedetection.io

# 启动已存在的容器
docker start 5851344ebb25

# 进入一个已经运行的容器内部
docker exec -it 9dbcaf7b7372 /bin/bash

# 停止容器
docker stop 5851344ebb25

# 删除容器
docker rm 5851344ebb25

2.4:其他命令

查看所有的 Docker 卷:

  • docker volume ls

查看具体卷的信息:

  • docker volume inspect <volume name>

3:Docker Compose 命令

查看命令帮助:

  • docker-compose --help

查看版本:

  • docker-compose -v

启动项目,以后台模式运行:

  • docker-compose up -d

停止项目并删除相关容器、网络(不包括关联的匿名挂载卷):

  • docker-compose down

停止并删除相关所有资源,包括关联的匿名挂载卷:

  • docker-compose down -v

4:补充知识

4.1:Dockerfile 示例

定制镜像,必须指定一个基础镜像,在其上进行定制。

  1. 编辑 Dockerfile 文件
    vim Dockerfile
  • Dockerfile 文件编辑如下
1
2
3
4
5
6
7
8
9
10
11
# 使用官方 Nginx 镜像作为基础
FROM nginx:1.27.3

# 定制镜像,执行命令行命令
RUN echo '<h1>Hello, Docker!</h1>' >> /usr/share/nginx/html/index.html

# 暴露容器的 80 端口
EXPOSE 80

# 使用默认的 Nginx 启动命令
CMD ["nginx", "-g", "daemon off;"]
  1. 构建镜像
    docker build -t my-nginx-image:1.0 .

  2. 验证定制的镜像
    docker run -d -p 8086:80 --name my-nginx-test my-nginx-image:1.0

4.2:docker-compose.yml 示例

  1. 编辑 docker-compose.yml 文件
    vim docker-compose.yml
  • docker-compose.yml 文件编辑如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3.8'

services:
web:
image: nginx:1.27.3
container_name: my_nginx_compose
ports:
- "8080:80" # 将主机的 8080 端口映射到容器的 80 端口
volumes:
- ./web:/usr/share/nginx/html # 将当前目录的web文件夹挂载到容器内
networks:
- app-network

db:
image: mysql:5.7
container_name: my_mysql_compose
environment:
MYSQL_ROOT_PASSWORD: rootpassword # 设置 MySQL 的 root 用户密码
MYSQL_DATABASE: testdb # 自动创建名为 testdb 的数据库
MYSQL_USER: user # 创建用户
MYSQL_PASSWORD: password # 设置用户密码
ports:
- "3306:3306" # 将主机的 3306 端口映射到容器的 3306 端口
networks:
- app-network

networks:
app-network:
driver: bridge
  1. 启动项目
    docker-compose up -d
  1. 停止项目,删除关联的匿名卷
    docker-compose down -v

4.3:容器后台运行

如果想在 Docker 容器中分离当前终端而不影响容器的运行状态,可以使用以下快捷键。

快捷键:退出正在运行容器的交互式会话,同时保持容器继续后台运行

  1. 先按:Ctrl + P
  2. 再按:Ctrl + Q

4.4:Docker 挂载卷

要确保重要数据持久化,需要指定容器将重要数据保存到挂载卷中。

除了 docker run,还可以通过以下方法挂载卷:

  • 使用 docker create 配置并启动容器。
  • 使用 docker-compose 管理服务和卷。
  • 手动管理卷并绑定到容器。
  • 在编排系统(如 Kubernetes)中配置和挂载卷。

选项 -v--mount 都可以用来挂载卷到容器中:

  • -v 较为简洁且广泛使用
  • --mount 提供了更强的灵活性,适用于更复杂的挂载配置

4.5:Docker pull 代理配置

docker pull 这个动作实际上是由 systemd 启动的 dockerd 执行,而 docker 本身只是向 dockerd 发送指令。
proxychains docker pull 不能代理真正执行操作的 dockerd,所以不能用。

可以使用以下操作对 Docker pull 进行代理:

  1. 创建配置文件夹
    mkdir -p /etc/systemd/system/docker.service.d/

  2. 编辑配置文件
    vim /etc/systemd/system/docker.service.d/proxy.conf

  • proxy.conf 文件配置如下
1
2
3
4
[Service] 
Environment="HTTPS_PROXY=socks5://192.168.1.1:7890"
Environment="HTTP_PROXY=192.168.1.1:7890"
Environment="NO_PROXY=127.0.0.1"
  1. 重新加载守护进程配置
    systemctl daemon-reload

  2. 重启服务
    systemctl restart docker

以上代理配置只影响 Docker 守护进程本身的网络访问,不会自动影响容器内的网络。

4.6:Kali 安装 Docker & Docker Compose

Docker 安装:

  1. apt update
  2. apt install docker.io

Docker Compose 安装:

  1. curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose

5:其他

5.1:参考资料

《Docker:从入门到实践》:
https://yeasy.gitbook.io/docker_practice

《kali搭建vulhub漏洞靶场》:
https://www.freebuf.com/sectool/358063.html

《Debian 12 / Ubuntu 24.04 安装 Docker 以及 Docker Compose 教程》:
https://u.sb/debian-install-docker/

《Docker pull下载镜像时无法使用proxychains4的解决方案》:
https://blog.csdn.net/qq_43519779/article/details/122443563

《配置代理解决docker pull命令无法拉取镜像的问题》:
https://blog.tangwudi.com/technology/skill12219/

《Docker上手系列:Docker入门hello world》:
https://cloud.tencent.com/developer/article/1704514

《Docker方式启动tomcat,访问首页出现404错误》:
https://cloud.tencent.com/developer/article/1834280




人世几回伤往事,山形依旧枕寒流。

——《西塞山怀古》(唐)刘禹锡