Docker简介

  • Docker可以跨平台快速运行应用,快速构建应用(软件打包),快速分享应用(dockerhub上拉取镜像,https://hub.docker.com/)。
    • 可以一键部署系统(unbutu),服务(mysql等)
  • 镜像与容器(创建,删除,停止,启动,暂停)的关系是类与实例的关系,仓库是保存镜像(方便修改)。
    • 容器:拥有自己的文件系统、cpu、内存、进程空间等,且与本机隔离

linux命令

  • chmod -R 777 文件名 递归给其他用户777权限。
  • mkdir 文件夹名 创建文件夹
  • ./filename -p 端口

CentOS安装Docker

  • 如果服务器中下载了旧版本docker,用以下命令移除

    1
    2
    3
    4
    5
    6
    7
    8
    $ sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

安装 Docker Engine-Community

安装Docker仓库

  • 安装所需的软件包:sudo yum install -y yum-utils

  • 设置仓库:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    使用官方源地址(比较慢)
    $ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    可以选择国内的一些源地址:
    阿里云
    $ sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    清华大学源
    $ sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  • 启动Docker:sudo systemctl start docker

  • 开启自启动Docker:systemctl enable docker

使用Docker仓库进行安装

  • sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

基本命令

  • docker pull ** 从应用市场拉取镜像

  • docker run ** 在docker主机中运行镜像

  • docker build ** 在docker主机中创建镜像

  • docker push ** 在应用市场发布自己构建的镜像

  • docker ps 查看正在运行时的应用 ;docker ps -a 查看包括已停止的容器

  • docker-cli 客户端 来控制docker主机

    image-20240709102211633

相关步骤

下载镜像

  • 检索:docker search *** 会列出所有有关此镜像版本
  • 下载:docker pull ***:tag(版本) 例如docker pull nginx:latest
  • 列表:docker images 可以列出tag id等信息
  • 删除:docker rmi
    • docker rmi ***:tag
    • docker rmi id名

启动容器

运行:docker run ** 例如docker run nginx 这样命令行会卡死(因为不是在后台)。

  • docker run -d(后台运行,不会卡死控制台) –name (命名) -p port1:port2(服务器端口(port1)与docker容器端口映射)**-e 环境变量 **-it(交互得模式) 容器名 /bin/bash

    • 这边要启动多个相同镜像 这边的名字主机端口得不一样
  • docker ps 查看运行的容器 docker ps -a 查看包括已停止的容器 docker ps -aq 打印所有容器id

  • docker stop id或者name id只要取到可区分其他容器id即可

  • docker start id或者name 启动

  • docker restart id或者name 重启

  • docker stats id或者name 查看状态

  • docker logs id或者name 查看日志

  • docker exec id或者name 进入容器

    • docker exec -it name(容器名) /bin/bash -it是交互模式 /bin/bash(方式)–>控制台1
    • echo “” > 文件名 写入到文件
    • exit 退出容器
  • docker rm id或者name 删除已关闭的容器 docker rm -f id或者name 强制删除 docker rm $(docker ps -aq) (将打印出的id作为参数)

保存镜像

  • docker commit 容器名 新镜像名:tag(版本) 将修改后的容器,创建成新镜像,保存到仓库内
  • docker save -o tar包(把镜像打包) 镜像名:tag
  • docker load -i(指定tar包) tar包名 加载这个镜像到仓库

分享社区

  • docker login 登录dockerhub 接下来依次输入邮箱和账号密码
  • docker tag 原镜像名:tag 用户名/镜像名:tag(nasyangh/nginx:v1.0) 分享至社区要改名,要为每个镜像添加 用户名/镜像名
  • docker push 用户名/镜像名:tag 每次上传为该版本后最好再上传一次tag为latest的镜像,不然用户直接pull 镜像名 会报错。

存储

  • 目录挂载 (启动时以主机目录为准,主机无->容器无)

    • docker -run -d -p 80:80 --name ** -v 主机新建目录:容器主页面 镜像名
      • 例如修改nginx默认页面:docker -run -d -p 80:80 --name mynginx -v /app/nghtml:/usr/share/nginx/html nginx 访问的时候会显示403,因为我们/app/nghtml是新建文件夹。访问的默认页是从本机映射到容器。但我们在容器或者本机都可以改变内容。
      • 方便修改内容。
    • 注意:如果要映射到容器/etc/nginx/文件夹下面的内容 是会报错,因为我们新创建的文件夹下是没有文件的。而启动容器需要/etc/nginx/nginx.conf配置性文件,所以报错。
  • 卷映射 (启动时以容器目录为主)

    • docker -run -d -p 80:80 --name ** -v 卷名:容器主页面 镜像名
      • 例如:docker -run -d -p 80:80 --name mynginx -v ngconf:/etc/nginx nginx
      • 卷名路径:/var/lib/docker/volumes/
    • docker volume ls 显示所有卷
    • docker volume create 卷名 创建卷
    • docker volume inspect 卷名 显示指定卷详情 路径等
    • 注:删除容器,卷不会删除。
  • 两者启动后,里外修改都行。

网络

  • 当我们在容器:curl 访问主机ip加上主机端口 image-20240709151950497这时候的流程很麻烦,慢。
  • 但docker会为每个容器分配唯一ip,使用容器ip+容器端口可以互相访问。启动docker时,会有一个docker0。这个docker0的ip相当于一个网关。
  • docker还支持创建自定义网络,然后容器名就是域名:容器端口。
    • docker network inspect/create/ls…
    • docker network create mynet(自定义网络名) 创建自定义网络 bridge就是docker0
    • docker run -d -p 80:80 --name app1 --network mynet nginx
    • 这时候两个容器即可利用域名互相curl。 curl http://app1:80/

创建容器时注意:端口 存储 环境变量

Docker compose

安装教程

  • # 下载docker-compose到/usr/local/bin
    $ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    # 将docker-compose文件状态改为可执行文件
    $ sudo chmod +x /usr/local/bin/docker-compose
    
    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

    - 验证:docker-compose -v

    #### 基本命令

    - 上线 docker compose -f compose.yaml up -d (创建并启动容器) compose.yaml文件里面写好了启动所有服务命令
    - 下线 docker compose down(移除网络,移除容器,但不会移除卷(东西不会丢失))想要删除卷 添加参数-v (放在down后面 )--rmi all(删除所有镜像)
    - 启动 docker compose start x2(服务名)
    - 停止 docker compose stop x2(服务名)
    - 扩容 docker compose scale x2=n 给x2服务多扩充n个实例

    #### compose语法

    - 顶级元素:name(部署名字),services(服务),networks(网络),volumes(卷),configs(配置),secrets(密钥)

    - 例如搭建一个wordpress(拉取wordpress和mysql镜像)

    - ```
    mysql:
    docker run -d -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -e MYSQL_DATABASE=wordpress \
    -v mysql-data:/var/lib/mysql \
    -v /app/myconf:/etc/mysql/conf.d \
    --restart always --name mysql \
    --network blog \
    mysql:8.0
    wordpress:
    docker run -d -p 8080:80 \
    -e WORDPRESS_DB_HOST=mysql \
    -e WORDPRESS_DB_USER=root \
    -e WORDPRESS_DB_PASSWORD=123456 \
    -e WORDPRESS_DB_NAME=wordpress \
    -v wordpress:/var/www/html \
    --restart always --name wordpress-app \
    --network blog \
    wordpress:latest
    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
    40
    41
    42
    docker运行命令对应compose.yaml写法
    name: myblog
    services:
    mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
    - "3306:3306"
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    - MYSQL_DATABASE=wordpress
    volumes:
    - mysql-data:/var/lib/mysql
    - /app/myconf:/etc/mysql/conf.d
    restart: always
    networks:
    - blog

    wordpress:
    container_name: wordpress-app
    image: wordpress:latest
    ports:
    - "8080:80"
    environment:
    - WORDPRESS_DB_HOST=mysql
    - WORDPRESS_DB_USER=root
    - WORDPRESS_DB_PASSWORD=123456
    - WORDPRESS_DB_NAME=wordpress
    volumns:
    - wordpress:/var/www/html
    restart:always
    networks:
    - blog
    depends_on: //依赖 因为mysql要比wordpress先启
    - mysql
    volumes:
    mysql-data:
    wordpress:

    networks:
    blog:
    注意:networks 和 volumes需要声明
    -
    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
    docker-compose联合Dockerfile
    Dockerfile:从已有镜像中创建的镜像
    docker-compose:让新得镜像构建成容器
    docker启动语法:docker run -d -p 4122:80 --name webtest 新镜像--->Dockerfile

    所以构建docker-compose.yml

    version: '3'
    services:
    webtest:
    build: //build 相当于docker build -t 新镜像名 .(当前目录)
    context: . (构建新镜像文件所在的目录--->具体看dockerfile)
    dockerfile: Dockerfile (要调用dockerfile路径)
    ports:
    - 4122:80

    Dockerfile
    FROM 镜像
    要执行得操作
    例如 COPY ** /**
    RUN ....等等


    启用:docker-compose --build up -d(第一次)
    之后不用build

Dockerfile

  • image-20240709202541378

  • 运行jar包实例

    1
    2
    3
    4
    5
    6
    FROM openjdk:17 //以jdk得环境

    LABEL author=Nas //标签随便写
    COPY app.jar /app.jar //将现在目录下的app.jar 移动到镜像根目录下
    EXPOSE 8080 //暴露容器端口8080
    ENTRYPOINT ["java","-jar","app.jar"] 在容器起好后执行 java -jar app.jar
  • 编译好dockerfile,将他编译成镜像 docker build -f Dockerfile -t myjavaapp:v1.0 .(点代表当前目录)

Docker起apache和php

  • # 部署web题选择了apache-php5镜像
    docker pull registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5
    # 运行镜像并绑定端口 //apache默认端口为80  注意:容器端口应与服务设定的端口一致
    docker run -d -p 2027:80 registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5
    # 将本地题目拷贝到docker
    docker cp ./test e664955e:/var/www/
    # 进入docker容器内部
    docker exec -it e664955e bash
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    - docker cp 本机文件 容器id:路径

    - docker cp ./index.php 36f:/var/www/



    ### Docker部署pwn环境

    - pwn_deploy_chroot介绍

    1、一次可以部署多个题目到一个docker容器中 2、自动生成flag,并备份到当前目录 3、也是基于xinted + docker + chroot 4、利用python脚本根据pwn的文件名自动化地生成3个文件:pwn.xinetd,Dockerfile和docker-compose.yml 5、在/bin目录,利用自己编写的静态编译的catflag程序作为/bin/sh,这样的话,system(“/bin/sh”)实际执行的只是读取flag文件的内容,完全不给搅屎棍任何操作的余地 6、默认从10000端口监听,多一个程序就+1,起始的监听端口可以在config.py配置,或者生成pwn.xinetd和docker-compose.yml后自己修改这两个文件
  • 下载: git clone https://github.com/giantbranch/pwn_deploy_chroot.git

  • 使用步骤

    • 将所有pwn题目放入bin目录(注意名字不带特殊字符,因为会将文件名作为linux用户名
    • python initialize.py 初始化 设置端口和flag #python2
    • docker-compose up –build -d 起容器
  • 注意:重新起容器时候,将flags.txt删除,不然flags.txt里的端口会与运行时不一致。