docker
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主机
相关步骤
下载镜像
- 检索: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(方式)–>控制台
- 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是新建文件夹。访问的默认页是从本机映射到容器。但我们在容器或者本机都可以改变内容。 - 方便修改内容。
- 例如修改nginx默认页面:
- 注意:如果要映射到容器/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加上主机端口 这时候的流程很麻烦,慢。
- 但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
42docker运行命令对应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
25docker-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
运行jar包实例
1
2
3
4
5
6FROM 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、一次可以部署多个题目到一个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后自己修改这两个文件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介绍下载:
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里的端口会与运行时不一致。