Contents

Study Docker

中文文档

https://yeasy.gitbook.io/docker_practice

关于部署

mac可以用docker-desktop,或者是orbstack(这个真的好用xd),linux就直接指令操作吧。win不推荐,推荐wsl里面搞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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
docker search nginx 寻找镜像 ok的是官方的
docker pull nginx 直接下载
docker images 查看镜像
docker hub 镜像仓库
docker rmi删除镜像

docker run 运行
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d: 后台运行容器,并返回容器ID
-i: 以交互模式运行容器,通常与 -t 一起使用。
-t: 分配一个伪终端。
-p HOST_PORT:CONTAINER_PORT: 将主机的端口映射到容器的端口。
-v HOST_DIR:CONTAINER_DIR: 将主机目录挂载到容器中。
--name NAME: 为容器指定一个名称。
-e KEY=VALUE: 设置环境变量。
示例
运行带有交互终端的 Ubuntu 容器:
docker run -it ubuntu
在后台运行 Nginx 容器并映射端口:
docker run -d -p 8080:80 nginx
挂载本地目录到容器中:
docker run -v /local/path:/container/path my-image


docker ps 查看容器
docker ps -a 查看所有容器(包括停止的)

docker stop 停止容器
docker rm 删除容器
docker start 启动容器
docker stats 查看容器状态
docker logs 查看容器日志
docker exec 进入容器

docker commit 创建镜像
docker save 保存
docker load 加载

docker inspect zsm_2 查看容器信息(主要是ip)

docker network create 创建网络
--driver 指定网络驱动(默认是bridge)
--subnet 指定子网
--gateway 指定网关
--ip-range 指定ip范围
--attachable 是否允许容器加入网络

docker network rm my_custom_network  删除网络
docker run -d --name my_container --network my_custom_network nginx 启动容器时指定网络
docker network connect my_custom_network my_container  将运行的容器加入网络

compose.yaml编写

顶级元素

1
2
3
4
5
6
name # 容器组名称
services # 容器组,服务
networks # 网络
volumes: # 卷
configs: # 配置
secrets: # 密钥

dockerfile编写

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
FROM #指定镜像基础环境
RUN #运行自定义命令
CMD #容器启动命令或者是参数
LABEL #标签
EXPOSE #暴露端口
ENV #环境变量
ADD #添加文件到镜像
COPY #复制文件到镜像
ENTRYPOINT #容器固定启动命令
WORKDIR #工作目录
USER #用户
VOLUME #挂载目录
ARG #参数

动态端口实现

在ctf题目里面,总有一些题的环境打开后发现端口是不定的,就是这样实现的。想gzctf平台上面是已经自动实现了,自己练习的时候可以用以下方式实现

动态端口映射

1
2
3
4
5
6
7
version: "3"
services:
  server:
    build: .
    restart: always
    ports:
      - "2222-2232:2222"  # 这里定义了一个端口范围

环境变量配置端口

1
2
3
4
5
6
7
8
9
version: "3"
services:
  server:
    build: .
    restart: always
    environment:
      SERVICE_PORT: 2222  # 容器内服务监听的端口
    ports:
      - "${HOST_PORT:-2222}:2222"  # 外部端口可以通过环境变量 HOST_PORT 设置

注意事项

在用docker打包一个项目时,可以利用.dockerignore文件,把不需要直接打包的文件除去,比如nodejs项目的node_modules文件夹等。

这样的好处是,在docker中去配置环境,避免冲突,也避免了打包时因为内存太大而造成的速度影响

未完结

咕咕咕