docker容器

docker容器

一、docker容器是什么

软件的打包技术,就是将算乱的多个文件打包为一个整体,打包技术在没有docker容器之前,一直是有这种需求的,比如上节课我把我安 装的虚拟机给你们打包了,前面的这种打包方式是将整个虚拟机打包了,对吧,这样打包出来的体积太大了,而且如果你只是单纯的想要 一个安装好的程序,比如sqlserver数据库,不想自己安装,就想要个安装好的,按照之前的打包方式,太费事费力的,你打包个安装了 sqlserver数据库的虚拟机,光虚拟机本身的操作系统可能就占用了20个G,sqlserver本身可能也就1个G,这是不是就太不合适了,当然 我们自己不会或者不想安装sqlserver的时候,可以选择找个哥们帮你安装一下,但是如果100个人都找你安装,你是不是累死了,所以在 这种情况,容器技术就诞生了,容器技术中的依依者,就是docker,它的底层实现原理我们现在不用纠结。用它来打包出来的软件,体积 会非常小。比如如果在一个虚拟机上安装了nginx,那么这个虚拟机怎么也要1G以上,但是用docker打包的已经安装好的nginx,可能也 就100M左右,体积小很多。接下来我们感受一下docker的使用。后面我们可以将很多部署起来很繁琐的靶场环境都通过docker来打包。 所以现在网上也有很多使用docker跑起来的靶场,复用性非常好,别人打包好的,你直接拿来就用。而且docker有个东西叫做仓库,打 包的东西直接放在仓库里面,全世界都可以共享。docker是2013年诞生的。

docker打包出来的每个软件,称之为docker镜像。可以说整个IT领域,不管是哪个工种,都需要好好学习docker。

docker是CS架构的程序,客户端控制服务端来做各种事情。

image-20260319145717347

二、docker的安装

centos用yum安装,kali用apt安装,kali属于debian系列的操作系统

CentOS7安装docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# centos7上面用yum安装
yum install docker -y
#启动docker
systemctl start docker
#设置开机自启
systemctl enable docker

#体验docker版nginx最新版
docker run -d -p 80:80 nginx
#体验docker版nginx 1.16
docker run -d -p 81:80 nginx:1.16

#体验wordpress
docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234565 -d mysql:5.7
docker run -d --link mysql:mysql -p 86:80 wordpress:5.6

Kali安装docker

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
#添加docker的gpg密钥,签名用的(连接docker仓库所需要的密钥)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
wget https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
apt-key add gpg

#添加docker的apt源
vi /etc/apt/sources.list
以下内容替换文件里的所有内容
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

#更新apt缓存
apt update

#安装docker
sudo apt-get instal1 docker docker-compose -y

sudo apt-get install docker.io

#安装完成之后,docker就自动启动了
systemctl status docker

#查看docker版本
docker -v

网络安全有一项工作叫做漏洞复现,有些软件、框架、webserver等等他们某些版本会有各种漏洞,官方看到之后肯定会修复升级,但是
某个使用了这些软件的公司可能并没有升级,那么就需要我们检测一下是否真的存在这个漏洞,不能直接再生产环境上去测试,需要在测
试环境或者开发环境或者自己搭建的环境中进行漏洞测试,这就是漏洞复现的工作。所以我们好多时候都需要自己来搭建相同版本的软件
环境来进行漏洞复现,搭建的环境的时候我们就可以使用docker,很方便。

1
2
3
4
5
6
#用docker下载安装最新版本的nginx
#前面的80端口是主机的80端口,后面的80端口是docker容器的80端口。(又拉取又运行,pull是只拉取不运行)
docker run -d -p 80:80 nginx

#后面可跟版本号,若不跟则默认是最新版本
docker run -d -p 80:80 nginx:1.16

这里需要使用国内的镜像加速器

1
2
#编辑配置文件
sudo nano /etc/docker/daemon.jason

复制以下内容到文件里

1
2
3
4
5
6
7
8
9
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.net"
"https://docker.1ms.run"
]
}

保存重启docker服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

验证是否生效,执行 docker info,在输出中查看 Registry Mirrors 列表是否包含了你刚才配置的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#体验wordpress,需要启动两个docker镜像,一个数据的,一个代码程序,这个比较大,所以速度可能会慢一些
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 5.7版本的MySQL,镜像名称是mysql
docker run -d --link mysql:mysql -p 86:80 wordpress:5.6
#5.6版本的wordpress,最新版本应该已经到了6.x了,但是值得说明的一点就是封装wordpress的人为了将镜像做的比较小,没有安装中文包,所以只能是看英文的了,他会自动连接数据库。如果你发现你安装的镜像不是你要的版本,那么可能是版本指定错误了,或者是官方镜像仓库中的wordpress镜像版本有点问题了。

#可以更改docker镜像库的源
cd /etc/docker
vim docker.json
#添加如下内容,并保存退出
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
#可以重启docker服务
systemctl restart docker
systemctl start docker
systemctl enable docker
systemctl stop docker

docker run首先检测本地是否已经有了软件镜像,如果没有,它会自动去下载镜像,然后运行,运行起来的镜像,我们称之为容器,可以理解为每个软件都安装在了一个自己的小空间里面。

docker 镜像 容器

镜像——>安装了某些特定程序的文件——>压缩文件

容器——>镜像运行起来之后,就叫做容器(而不叫进程)

三、镜像常用命令

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
docker search
#搜索镜像(只会搜索官方仓库的,官方仓库地址:hub.docker.com)官方请求不了,直接用国内的镜像源"https://docker.1ms.run"

在镜像名字前加入网址(不然会默认是官方的地址)
docker search docker.1ms.run/nginx
# docker search tomcat
# docker search apache

# 拉取的镜像tomcat\apache等名宇很短,这都是官方仓库中的官方镜像,官方仓库中支持用户上传自已封装的镜像,用户镜像和官方镜像的差别在名字上面,比如我们可以去docker官方去注册一个账号,用户白己的镜像前面都会有作者的用户名或者用户所在组织的名字,比如jaden/nginx、jaden/tomcat等。

docker images
#查看本地镜像列表,image就是镜像的意思
#本地有的镜像,就不用再去下载了,而且可以将本地镜像导出来分享给其他人

docker pull(只拉取不运行,run又拉取又运行)
#下载镜像,拉取镜像
# docker pull tomcat:latest
# docker images

docker push
#上床镜像,推送镜像,推到官方仓库(需要本地登录一下官方仓库才能推送)

docker rmi
#删除镜像,rm image的意思,直接rm不加i表示要删除容器,可以通过名称加版本来删除,或者直接通过镜像id值来删除
#docker rmi tomcat:latest 或者 docker rmi imageid值
#可以同时删除多个镜像:docker rmi tomcat:latest tomcat:jre17-temurin-jammy
#如果这个镜像处于运行状态的是删除不了的,,比如有容器在使用这个镜像,就不能删除镜像,比如docker rmi nginx:1.16会报错
#查看镜像的运行状态docker container ls,其实这是查看容器的状态,但是可以看到哪些镜像被使用了

docker save
#导出镜像(压缩包)docker save 镜像名称:版本 -o docker_nginx1.20.tar.gz
#docker save nginx:1.16 -o docker.nginx1.16.tar.gz
#ls 就看到了 docker.nginx1.16.tar.gz

docker load
#导入镜像 docker load -i docker_nginx1.20.tar.gz,会自动解压并导入到docker服务中

image-20260323193159260

四、容器的常用命令

image-20260325200714875

docker inspect 容器名或者id 可以查看容器的详细信息(可以展示容器的全部id)

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
39
#docker 常见命令

docker run 运行一个新容器
docker ps === docker container ls #参数:默认之显示up状态的容器,-a查看所有容器,或者 --all
docker stop 停止容器 # 例子docker stop容器id或者容器名字
docker kill 杀掉容器 # 强制关闭容器,尽量不要用,很容易就启动不了了
docker start 启动容器 # 例子dockerstart容器id或者容器名字
docker restart 重启重启 # 例子dockerrestart容器id或者容器名字
docker rm 删除容器 # 例子docker rm 容器id或者容器名字,同时删除多个,就空格隔开,处于up状态是不能直接删除的,强制删除是可以删除up状态的容器的,docker rm f 容器名称或者id
docker rm -f 'docker ps -a -q'#删除所有容器,-q是只显示容器id,反引号中的指令优先执行
docker top 查看容器内的进程 #例子docker top容器id或者容器名字
docker stats 查看容器的资源占用情况

docker exec 进入容器 #例子:docker exec -it 容器id或者容器名字
# 直接交互指令:docker exec -it 76738703b7b2 ls #执行ls指令
# 进入终端:docker exec -it 76738703b7b2 /bin/bash 或者 /bin/sh
#/bin/bash打开一个终端窗口,exit指令退出终端,但是docker容器内容一般不会安装额外的软件,所以导致大量的指令是用不了的,比如ifconfig、ps、ipaddr等

docker inspect -f '{{.Name}} => {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
#可以查看所有容器的ip地址的,容器的ip地址是从172.17.0.1开始分的。docker容器类似于一个微型的虚拟机,它占用的都是宿主机(物理机)的资源。在物理机上是可以看到容器所运行的程序的。每个容器都有自己的ip地址。
docker inspect --format='{{.Name}} - {{range .Networksettings.Networks}}{{.IPAddress}}{{end}}'$(docker ps -aq) | grep "容器名称或者id"


# curl -I 加网址,可以看到http响应数据
┌──(root㉿nikta)-[/home/nikta]
└─# curl -I http://172.17.0.1
HTTP/1.1 200 OK
Server: nginx/1.29.6
Date: Wed, 25 Mar 2026 12:17:46 GMT
Content-Type: text/html
Content-Length: 896
Last-Modified: Tue, 10 Mar 2026 15:29:07 GMT
Connection: keep-alive
ETag: "69b038c3-380"
Accept-Ranges: bytes


# netstat -lntup 可以看到给docker的端口映射
# docker run -d -p 80:80 nginx #-p 80:80,端口映射,表示宿主机80端口映射到了nginx容器的80端口

image-20260325194418357

五、docker容器打包上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker pull debian:latest
docker run -it --name nikta_debian -p 90:80 debian:latest
#进入容器
docker exec -it nikta_debian /bin/bash
#安装nginx
apt update # 更新apt缓存
apt install nginx -y #安装nginx
nginx -V #查看nginx版本,安装好了
#ip addr
#apt install procps #安装ps指令
#ps -ef
nginx # 启动nginx,systemctl是没有的,没有安装这个指令
exit
#打包之前做好先停止容器
docker stop nikta_debian
docker commit nikta_nginx syrjaden/debian_nginx:v1 # 根据名字或者id都可以提交,后面加个镜像名称和版本,syrjaden是docker仓库用户名

#上传到官方仓库
docker login#登录官方仓库
# docker tag debian_nginx:v2 syrjaden/debian_nginx:v2 # 这是改名字,如果名称不冲突就不用改名字
docker push syrjaden/debian_nginx:v2 # 直接push即可

六、docker-compose

docker-compose是批量管理docker容器的工具

1
2
3
4
5
6
7
8
9
10
# 比如前面我们启动的wordpress项目,需要启动两个容器才行,有时候就是这样,需要同时启动多个容器来完成你想要做的事情,但是到底启动多少个容器呢?比如wordpress那个,我们记不住,换一个机器不看笔记很难起来,有了docker-compose就可以解决这个问题了。
# centos7安装docker-compose,我们前面已经安装了,不需要再次安装了
yum install epel-release.noarch -y
yum install docker-compose -y

#kali安装docker-compose
apt install docker-compose -y

#查看版本
docker-compose -V

systemctl restart docker 重启docker服务会自动关闭所有容器。

1
2
# 启动容器的时候,如果加上了--restart=always,那么重启服务之后,这个容器会自动启动
docker run -it -d --restart=always nginx:1.16 # 实现了开机自启动的效果