docker的使用
Drunkbaby Lv6

docker的使用

  • 最近在弄关于ctfd的东西,要用到docker。

于是乎,云集docker的使用,写出一篇自己的心得

首先,弄明白docker image与Container的关系

形容一下,image就是Java中的类,而Container是Java对象

image也叫做镜像,而container叫做容器

0x01 进入正题:如何使用docker

这里我们以CTF题目为例

先执行

1
docker pull ctftraining/qwb_2019_supersqli
  • 这里的docker pull是用来抓取image文件的命令

在本机查看image文件

1
docker image ls

镜像需要启动后,才能变成容器,-d表示后台运行,不然会一直卡着界面

1
docker run -itd 容器ID       // 这里 -i,-t,-d分别是三个参数
  • 这里出现的 <none>的出现,是因为docker中的镜像被新的镜像覆盖的时候,老版本的镜像名称会变成<none>,删除即可

删除镜像的指令

1
docker rmi -f 容器id

删除容器的命令

1
docker rm -f 容器id
  • 再强调一遍,docker的镜像与容器是两个概念!

0x02 docker网络

1.查看docker容器的ip

先查看所有网络

1
docker network ls
  • 接着通过命令得到容器IP
1
docker network inspect 容器ID

0x03 ctfd中docker的frp容器一直restarting的问题

  • 报错如图所示

原因:frps与frp容器连接有问题

可以通过docker logs 分析日志

总结下来有几种解决方法

1.如果是端口被占用

通过杀进程解决

1
2
3
systemctl stop frps
systemctl disable frps // 取消自启动
systemctl start frps

2.如果是显示FRP未配置

通过添加网络即可

1
2
sudo docker network connect frpcadmin <frpc容器名或者ID>
systemctl start frps

0x04 docker 拉 MySQL

几步命令

1
2
3
4
5
6
7
sudo docker pull mysql:latest

sudo docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

sudo docker exec -it 容器ID env LANG=C.UTF-8 /bin/bash

mysql -h localhost -u root -p

MySQL 中存在中文乱码的问题

docker 的详细使用

更新于 2023/8/31;更新的主要原因是发现自己 Dockerfile 编写的非常不熟练,docker-compose.yml 编写的也非常不熟练。

所以此时的更新也是主要围绕着 Dockerfile 和 docker-compose 展开

Dockerfile

Dockerfile 是用来描述文件的构成的文本文档,其中包含了用户可以在使用行调用以组合 Image 的所有命令,用户还可以使用 Docker build 实现连续执行多个命令指今行的自动构建。

通过编写Dockerfile生磁镜像,可以为开发、测试团队提供基本一致的环境,从而提升开发、测试团队的效率,不用再为环境不统一而发愁,同时运维也能更加方便地管理我们的镜像。

Dockerfile的语法非常简单,常用的只有11个:

编写多了现在自然而然也就会了

docker-compose

在 dockerfile 的基础上升级了一下,通过 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
30
31
32
33
34
35
36
37
38
39
version: '2'

services:
namesrv:
image: apache/rocketmq:4.9.4
container_name: rmqnamesrv
ports:
- 9876:9876
- 9555:9555
environment:
JAVA_OPT: "-Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
command: sh mqnamesrv

broker:
image: apache/rocketmq:4.9.4
container_name: rmqbroker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
- 9556:9555
environment:
JAVA_OPT: "-Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
depends_on:
- namesrv


dashboard:
image: apacherocketmq/rocketmq-dashboard
container_name: rmqdashboard
restart: always
ports:
- 8081:8081
environment:
JAVA_OPTS: "-Drocketmq.namesrv.addr=namesrv:9876"
depends_on:
- namesrv

这里的语法和 dockerfile 几乎差不多,此处便不再展开

为 docker 开启代理

https://cloud-atlas.readthedocs.io/zh-cn/latest/docker/network/docker_proxy.html

我是在 wsl2 里面做的,首先配好代理,在 .bashrc 里面加上

1
2
3
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export http_proxy="http://172.18.144.128:7890"
export https_proxy="http://172.18.144.128:7890"

好了之后 source .bashrc

随后根据教程配置 /root/.docker/config.json

然后配置 httpproxy.conf,最后需要重启 daemon

 评论