docker

AffettoIris 2023-11-11 2,311 11/11

 

原文

安装

centOS中安装docker

  • #在centOS中安装docker yum install docker -y

  • #启动docker systemctl start docker

  • #设置开机自启 systemctl enable docker

kaili安装docker

#添加docker的gpg密钥,签名用的 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - #添加docker的apt源 echo 'deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster stable' | sudo tee /etc/apt/sources.list.d/docker.list #更新apt缓存 apt update #安装docker sudo apt-get install docker docker-compose -y sudo apt-get install docker.io #安装完成之后,docker就自动启动了 systemctl status docker #查看docker版本 docker -v

命令

docker镜像常用命令

  • docker search xxx 如 docker search tomcat

    #搜索镜像(只搜索官方仓库的,官方仓库地址:hub.docker.com)

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

    docker

  • docker images #查看本地镜像

    docker

  • docker pull 镜像名:版本号 如 docker pull tomcat:latest #下载镜像,拉取镜像,如果是docker pull tomcat 会默认Using default tag: latest

  • docker push xxx #上传镜像,推送镜像,推到官方仓库,推送不是那么简单的,不然早就满了,需要在本地登录一下官方账号才能推

  • docker rmi 名称:版本docker rmi 镜像id 如 docker rmi tomcat:latest 或者 docker rmi c20060033e06

    #删除镜像,rm image的意思,类似的docker rm 容器名称:版本docker rm 容器id表示要删除容器 #可以同时删除多个镜像:docker rmi tomcat:latest tomcat:jre17-temurin-jammy #如果这个镜像处于运行状态的是删除不了的,比如有容器在使用这个镜像,就不能删除镜像,比如docker rmi nginx:1.16会报错

  • docker save 镜像名称:版本 -o 名字.tar.gz #导出镜像为 名字.tar.gz 并保存在工作目录下如 docker save nginx:1.16 -o docker.nginx1.16.tar.gz

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

docker容器的常用指令

  • docker run 选项 容器的名字 镜像:镜像的版本docker run 选项 容器的名字 镜像ID如 docker run -tid --name test tomcat:latest 、docker run -tid --name test bbc951c969e2 # 创建一个新容器并运行,一般必加-tid选项

    选项说明如下:

    -t:为容器重新分配一个伪输入终端,使得容器内的命令可以在控制台中交互式地执行 -i:以交互模式运行容器,使得用户可以与容器内的命令进行交互 -d:后台运行容器,并返回容器ID --name:为容器指定一个名称,注意到选项不是单个字母所以是两个- -p:端口映射,格式为:主机(宿主)端口:容器端口 -v: 挂载宿主机文件夹,格式为: 宿主机文件夹:容器文件夹 --link: 添加链接到另一个容器,注意到不是单个字母所以是两个- -m:设置容器使用内存最大值;

    加和不加-d选项的区别:

    docker

  • docker start 容器id或者容器名字 # 启动已存在但关闭状态的容器

  • docker restart 容器id或者容器名字 # 重启。可见容器得先处于运行状态

  • docker ps 等价于 docker container ls 只显示up状态的容器 docker ps -a 等价于 docker container ls -a 查看所有无论开或者关ing的容器,或者--all选项

    docker

  • docker stop 容器id或者容器名字 # 停止容器

  • docker kill 容器id或者容器名字 # 杀掉容器或曰强制关闭容器,尽量不要用,很容易就启动不了了

  • docker rm 容器名称:版本docker rm 容器id表示要删除关闭中的容器,处于up状态是不能直接删除的。可以删除多个容器,就空格隔开。

    强制删除是可以删除up状态的容器的,docker rm -f 容器名称或者id

  • #组合技,强制删除所有容器,-q是只显示容器id。反引号中的指令优先执行

    docker

  • docker top 容器id或者容器名字 # 查看容器内的进程

    docker

  • docker stats 查看容器的资源占用情况,注意不是status

    docker

  • docker exec -it 容器id或者容器名字 /bin/bash # 进入运行中的容器,

    docker

    exit命令可退出容器的CLI。也可以用docker exec -it 容器id或者容器名字 /bin/sh

    注意是新建立一个终端,也就是说你不会接收到原终端的输出如:

    docker

    还没有找到进入原终端的方法。

    /bin/bash/bin/sh等本身就是个切换shell的命令。# shell是命令行处理程序

    docker

    exit本身就是个退出终端的命令。

    docker

  • docker exec -it 容器id或者容器名字 其他命令

    本质上和上个命令是一样的,就是执行容器里的命令,只是免去你进入容器去操作了。

    docker

    但是docker容器里一般不会安装额外的软件,所以很多指令是用不了的,比如ifconfig、ps、ip addr等

  • docker inspect -f '{{.Name}} => {{.NetworkSettings.IPAddress }}' $(docker ps -aq) #可以查看所有容器的ip地址的,容器的ip地址是从172.17.0.1开始分的。docker容器类似于一个微型的虚拟机,它占用的都是宿主机(物理机)的资源。在物理机上是可以看到容器所运行的程序的。每个容器都有自己的ip地址。删除线表示不用学。

    docker

  • curl -I 容器IP地址:端口,相当于访问容器IP地址:端口,会看到http响应数据

    例如我的mytest容器,上上命令得出IP为172.17.0.2,此外该靶场环境是外部12345端口映射到内部8080端口,所以我这样:

    docker

    鸡肋得很,我服务器IP为62.234.14.252,你会发现:

    docker

  • docker port 容器名字或ID 查看容器和主机映射的端口,下图为容器内的8080端口映射到主机的12345端口

    docker

docker compose

比如前面我们启动的wordpress项目,需要启动两个容器才行,有时候就是这样,需要同时启动多个容器来完成你想要做的事情,但是到底启动多少个容器呢?比如wordpress那个,我们记不住,换一个机器不看笔记很难起来,有了docker-compose就可以解决这个问题了。

安装

yum install epel-release.noarch -y yum install docker-compose -y

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

查看版本

docker-compose -vdocker compose version

  • docker compose up -d # 创建并启动,启动之后就可以通过浏览器访问了 docker compose up # 也是启动

  • docker-compose restart # 重启

    docker

  • docker compose down # 停止并删除

  • docker compose stop # 停止

  • docker compose start # 启动

问题和实战

在docker里面,容器和镜像有什么关系和区别?

镜像是容器的静态定义,而容器是镜像的动态实例。当你启动一个容器时,实际上是在镜像的基础上创建了一个可运行的实体。

镜像(Image)是一个只读的模板,它包含了运行容器所需的文件系统、环境变量、应用程序等。镜像可以看作是容器的基础。

容器(Container)是镜像的一个运行实例,它包含了应用程序及其依赖的环境。当你启动一个容器时,Docker会根据指定的镜像创建一个容器实例,然后运行这个容器。

docker compose up -d 和docker compose up的区别?

有-d,则启动容器后不会进入容器中,无-d则启动容器后会进入容器中,可以看到报出的运行信息,也可以用于查看容器接收到的用户登录等请求

docker

docker

docker-compose stop和docker compose down区别?

docker-compose stop 仅停止服务,而 docker-compose down 则会移除相关的资源,比如容器。

docker-compose stop 命令用于停止由 docker-compose 启动的服务,但并不会删除容器、网络、数据卷等资源。这意味着,通过 docker-compose stop 命令停止的服务可以通过 docker-compose start 重新启动。

docker

docker-compose down 命令则会停止并移除由 docker-compose 启动的所有容器,网络,数据卷等资源。这意味着,通过 docker-compose down 命令停止的服务将无法通过 docker-compose start 重新启动,因为相关的资源已被删除。

docker

我们来用命令行实现vulfocus靶场的某一个镜像,从创建容器到销毁容器的过程:

目标就它了,注意到容器内部端口为8080:

docker

用docker images找到目标的镜像的名称:版本号或者镜像ID,然后用如下代码创建并启动容器,其中我们指定了tid选项,并命名容器为mytest ,并将外部12345端口映射到内部的8080:

docker run -tid --name mytest -p 12345:8080 vulfocus/log4j2-rce-2021-12-09:latest

查看,发现启动成功,注意到容器ID为a135febc244a:

docker

这道题的靶场也能IP:12345访问到:

docker

关闭容器:

docker stop a135febc244a

删除容器:

docker rm a135febc244a

- THE END -

AffettoIris

11月11日01:23

最后修改:2023年11月11日
2

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论