当前位置:   article > 正文

【学习笔记】一文打通Docker!(项目部署orCTF)

【学习笔记】一文打通Docker!(项目部署orCTF)

Docker

What is Docker?

利用Docker 可以快速安装应用,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库

注意这个系统函数库,相当于在不同的操作版本运行该应用都是没问题的,因为Docker自身打包了系统函数库,可以实现跨系统运行,也利于在一个服务器上部署多台应用

容器 : Docker在运行镜像时会创建一个隔离环境,称为容器

镜像仓库 : 存储和管理镜像的平台,Docker Hub 用户自身可以上传自己构建的应用

image-20240124095603481

Docker in VScode

注册dockerhub账号

用户名:happysuperman

在kali中可以进行登录

在root权限下输入 docker login

开启ssh服务

该服务所在位置

/etc/init.d/ssh status

设置为开机自启动

update-rc.d ssh enable
  • 1

建立win系统中的vscode与kali中的连接

为提高本地操作的流畅性 选择进行公私钥连接

首先在win本地生成公钥

C:\Users\xxx>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key 
  • 1
  • 2
  • 3

passphrase私钥密码 因为在本地操作 直接设置为空即可

生成ssh.txt 为私钥 ssh.pub为公钥

下面将公钥进行上传到kali中

image-20230803024954066

修改权限:

sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh
  • 1
  • 2

编辑ssh配置文件:

sudo vim /etc/ssh/sshd_config
  • 1

image-20230803025242640

RSAAuthentication yes
PubkeyAuthentication yes
  • 1
  • 2

首先i进入insert模式 然后esc退出
:wq 保存并退出

最后重启ssh服务

sudo service ssh restart
  • 1

配置win中的vscode

在vs中的ssh中配置

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host xxx.xxx.xxx.xxx(ip)
    HostName xxx.xxx.xxx.xxx
    User kali
    IdentityFile C:\Users\xxx\.ssh\sshdocker
  • 1
  • 2
  • 3
  • 4
  • 5

到此在vs中已经可以连接kali了

在左下角点开 connect to host即可

image-20230803031049342

Get The Docker Extension

刚进入拓展插件还是不行 存在权限问题 要把当前用户添加到组

image-20230803031532281

修改完后 重启docker服务

reboot重启 重新在vs登录


Docker in Package

在服务器安装Docker

本安装教程参考Docker官方文档,地址如下:

https://docs.docker.com/engine/install/centos/

1.卸载旧版

首先如果系统中已经存在旧的Docker,则先卸载:

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
2.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils
  • 1

安装成功后,执行命令,配置Docker的yum源:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 1
3.安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 1
4.启动和校验
# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
5.配置镜像加速

这里以阿里云镜像加速为例。

5.1.注册阿里云账号

首先访问阿里云网站:

https://www.aliyun.com/

注册一个账号。

5.2.开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

点击后进入控制台:

首次可能需要选择立刻开通,然后进入控制台。

5.3.配置镜像加速

找到镜像工具下的镜像加速器:

页面向下滚动,即可找到配置的文档说明:

具体命令如下:

# 创建目录
mkdir -p /etc/docker

# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

image-20240124020052395

到此安装成功!配置成功!

部署

docker创建命令:

官方文档:http://docs.docker.com/

image-20240124104355347

命令解释:


针对镜像:

docker build : 将自己本地编写的docker file文件创建为本地镜像

docker push + docker pull : 将自己本地的镜像 上传到镜像仓库中 便于其他人使用docker pull访问拉取

docker save + docker load -i xxx.tar : 利用本地拷贝的方式对镜像进行分享 首先对本地镜像进行打包生成压缩文件 然后拷贝到待分享的主机 对压缩包使用docker load加载即可 其中-i 全称input

docker images : 查看本地镜像

docker rmi : 全称 docker remove image 删除本地镜像


针对容器:

docker run : 创建并运行容器命令 在下面细致讲解

docker start + docker stop : 区分docker run,容器创建好之后一直存在 使用start和stop只是开关的作用(docker run相当于你买了个手机 start stop则是开关键)

docker ps : 查看正在启动运行的容器 相当于看看你有多少个开机的手机

docker ps -a : 添加-a参数之后 查看所有容器 相当于看看你有多少个手机 不管是否开机

docker rm : 全称 remove 删除容器 相当于把你刚刚的手机扔了

docker exec : 进入到容器中 如一个Nginx容器 里面相当于存在一个独立的操作系统

docker logs : 查看容器的运行状态 被访问情况等 加参数-f 表示跟随 不退出 一直检测


针对以上命令实践:

image-20240124110100075

image-20240124145309542

官网:hub.docker.com

注意一下网络,我们在配置的时候使用了阿里云的镜像加速 所以如果连接到外网 然后在拉取非常慢 相当于在国外访问我们国内的东西

---镜像
#拉取
docker pull nginx
#查看本地镜像列表
docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
#打包压缩本地镜像  将镜像名 输出到nginx.tar文件中
docker save -o nginx.tar nginx

#加载压缩镜像
docker load -i nginx.tar


---容器
#默认端口为80 创建并运行容器
docker run -d --name nginx -p 80:80 nginx
497cae5920378497a44673a7d66f2c1581364f8c58b7196c94cc9580cef2cd09
#查看容器
docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
497cae592037   nginx     "/docker-entrypoint.…"   26 seconds ago   Up 25 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
image-20240124153402994

直接访问

#进入容器
docker exec -it nginx bash
#退出
exit
#删除容器
docker rm nginx
docker rm nginx -f   #强制删除
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

简化命令

预定义命令别名

编辑 vi ~/.bashsrc

添加 alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'

生效 source ~/.bashsrc

docker run运行命令:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
  • 1

命令解释:

docker run : 创建并运行容器

-d : 容器在后台运行

--name : 给自己的容器起名字 必须唯一

-p : 端口映射,从宿主机的端口(前)映射到容器的端口(后), 其中容器端口固定不变 如果部署多个相同容器 需要调整宿主机的端口进行区分

image-20240124100814727

-e KEY=VALUE : 设置容器运行的环境变量 可以在docker hub中查看有哪些KEY

mysql : 指定运行镜像的名字 后面可以加版本号 如mysql:5.4 如果不加 默认latest

docker 数据卷挂载 部署静态资源

原理介绍:

我们创建一个Nginx, 这是一个web高性能的HTTP和反向代理Web服务器,其作用可以实现将我们的项目(静态资源)挂载到服务器上面,实现外部访问。

但是在docker容器中,我们进入到对应的目录·/usr/share/nginx/html,因为docker容器只包含一些必备的命令,所以如果想编辑文件的话可能命令无法执行,但是在宿主中命令是齐全的,同时各类编辑器效果更便捷,所以我们将docker容器中的数据卷挂载到宿主机中,实现该目录下的内容双向映射,即在宿主机编辑或者在docker容器中编辑两边都会同时更新

image-20240124174852990

命令执行过程:

按需image-20240124180154982

想把数据卷挂载 一定要在docker run启动容器的时候加参数 如果创建之后就无法实现挂载了 无需额外创建数据卷 因为如果不存在自动创建

docker run -d --name nginx -p 80:80 -v <数据卷名称>html:<容器目录在docker hub可以找到>/usr/share/nginx/html nginx
  • 1

其他命令:

#创建数据卷
[]docker volume create
84d95cfac67b448c74566823acd1769603325e57fc639a07282bed1ea82758c3


#查看所有数据卷
[]docker volume ls
DRIVER    VOLUME NAME
local     84d95cfac67b448c74566823acd1769603325e57fc639a07282bed1ea82758c3
local     html

#删除指定数据卷
docker volume rm

#清除数据卷 未使用的
docker volume prune

#查看某个数据卷的详情
[]docker volume inspect html
[
    {
        "CreatedAt": "2024-01-24T17:22:03+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]
[]cd /var/lib/docker/volumes/html/_data
[]ls
50x.html  index.html

#查看容器详情 查看容器是否有挂载 看Mounts
docker inspect <容器名>
  • 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
docker 目录挂载

相当于给数据卷指定一个本地的目录进行挂载

image-20240124181515199

在上面这个案例中 注意MySQL一般会自动创建一个匿名卷

所以在目录的挂载过程中 同样在容器创建的时候添加命令

docker run -d \
	--name mysql \
	-p 3306:3306 \
	-e TZ=Asia/Shanghai \
	-e MYSQL_ROOT_PASSWORD=123 \
	-v /root/mysql/data:/var/lib/mysql \
	-v /root/mysql/init:/docker-entrypoint-initdb.d \
	-v /root/mysql/conf:/etc/mysql/conf.d \
	mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Dockerfile

基本概念:

自定义镜像:目的在于给自己的java应用制作

镜像就是包含了应用程序,程序运行过程的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

解释其意义:

  • 部署一个Java应用的步骤:
    1. 安装一个Linux服务器
    2. 安装JRE并配置环境变量
    3. 拷贝Jar包
    4. 运行Jar包
  • 构建一个Java镜像的步骤:
    1. 准备一个Linux运行环境
    2. 安装JRE并配置环境变量
    3. 拷贝Jar包
    4. 编写运行脚本
image-20240124223615539

在编写镜像的时候是分层的,底层的一些逻辑其实是可以直接使用的,避免重复编写

image-20240124223504193

可以在上面这个例子中发现 第一个显示Already exits 就是证明之前已经拉取过

编写指令:

image-20240124223706047

示例:

image-20240124223745814

构建镜像:

docker build -t myImage:1.0 .
  • 1
  • -t : 给镜像起名,格式是repository:tag 不指定版本默认为latest
  • . : Dockerfile的相对路径

结构:

image-20240124230502108

注意上面Dockerfile的名字 必须一字不差

同时在部署的时候 Dockerfile中有from的基础镜像 这个需要提前拉取

Network

image-20240124231509953

注意/16 表示前16位不能动,也就是172.17不能动

但是在上面根据ip访问的话 因为内部的ip地址是随机生成的,所有当重启容器的时候可能会造成ip地址冲突,变化,被别的容器占用,导致MySQL服务可能出问题 所以这种连接方式不推荐

方法二:自定义网络

类比数据卷命令

image-20240124232147947

过程:

  • 首先创建一个网络

查看一下网络的初始情况

image-20240124233156202

docker network create happySu
  • 1

image-20240124233217481

创建成功

  • 然后可以把我们启动的容器添加到我们创建的自定义网桥中

两个方法:

  1. 容器已经启动了

    docker network connect <network> <container>
    
    • 1
  2. 容器未启动

    docker run -d --name <container> -p 8080:8080 --network <network> <image>
    
    • 1

查看容器的网络状况

docker inspect <container>
  • 1

容器互联:

进入到一个我们网桥上的容器

docker exec -it <container> bash
  • 1

使用ping命令可以测试互联结果

提醒:可以通过容器名ping 如ping mysql

Final work

理论部分全部学习完毕,下面通过真实的一个项目进行总结,部署一个java项目分为两个部分

  • 部署Java应用(后端)
  • 部署前端

部署后端

项目代码:D:\学习资料汇总\ctf\Docker\hmall

首先对java项目打包(好慢)

右侧Maven 去掉单元测试 就是那个闪电标 然后双击package

image-20240125095144256

服务器中Docker容器前置配置:

  • mysql

拉取镜像

image-20240125100848131

挂载到本地目录

image-20240125103039647

image-20240125103049446

创建结果 把mysql的配置文件导入D:\学习资料汇总\ctf\Docker\mysql

创建容器:挂载目录到宿主机 作用是数据的持久保存 不会因为Docker的变化丢失

docker run -d \
	--name mysql \
	-p 3306:3306 \
	-e TZ=Asia/Shanghai \
	-e MYSQL_ROOT_PASSWORD=123 \
	-v /root/mysql/data:/var/lib/mysql \
	-v /root/mysql/init:/docker-entrypoint-initdb.d \
	-v /root/mysql/conf:/etc/mysql/conf.d \
	mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

image-20240125104120678

data中自动生成

使用heidiSQL连接测试

注意这里有一个配置问题

因为开发一般在本地嘛 不会直接在服务器上面测 但是我这服务器没有任何资产 就是学习用着玩的就直接在服务器上面部署的

但是mysql去链接的时候不成功是因为服务器安全组的设置,无法访问到3306端口

所以在安全组里面设置一下 把3306端口打开就行 为了一定的安全性 源设置为本机ip即可 就是只有在你的电脑上才能访问到该服务器的3306端口

image-20240125104158185

  • 网络桥

创建一个网 happySu

image-20240125104407279

把mysql容器添加到该网桥中

image-20240125104533884

image-20240125104549528

添加成功

打包jar寄了

image-20240125153823864

把打包的内容jar包 + Dockerfile文件 放到root目录下 然后把jar包导入到Docker中

#基础镜像 可能有点慢
[root@happySu ~]# docker build -t hmall .
  • 1
  • 2

image-20240125170745472

然后启动后端镜像

#直接添加到我们的网桥中
[root@happySu ~]# docker run -d --name hmall -p 8080:8080 --network happySu hmall
  • 1
  • 2

配置服务器安全组 开放8080

访问成功

image-20240125170900264

后端检测日志:

[root@happySu ~]# docker logs -f hmall
  • 1

部署前端

挂载

访问前端就一定需要nginx 注意不仅仅是界面 还需要和后端连接

所以需要挂载conf文件

现将D:\学习资料汇总\ctf\Docker\nginx

这两个文件放到服务器的root/nginx 目录下

image-20240125172703538

然后运行下面的挂载

端口解释:

18080:前端

18081:管理员

挂载解释:

<服务器目录>:<容器目录>

docker run -d \
	--name nginx \
	-p 18080:18080 \
	-p 18081:18081 \
	-v /root/nginx/html:/usr/share/nginx/html \
	-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
	--network happySu \
	nginx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

修改服务器安全组 开放18080成功实现访问

image-20240125172918566

DockerCompose

安装:

sudo yum install python3 python3-pip

sudo pip3 install docker-compose

docker-compose --version
#出现报错 需要更新
sudo yum update python3 python3-pip

python3 --version  #需要3.6及以上

pip3 install --upgrade pip

sudo pip3 install docker-compose
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

参考:https://edu.yijinglab.com/post/273

使用:

这是一个工具 实现上面的快速构建n个相关联的容器

image-20240126000521785

服务描述的信息其实相当于docker run后面跟的命令去启动容器,只不过语法上有些不同下面举个例子

image-20240126001516048

image-20240126001721815 image-20240126001922311

depends_on: 表示依赖 创建会先创建依赖的内容

命令格式:

image-20240126002534593

注意该文件的放置位置

image-20240126002752362

Docker in CTF

主要进行题目的部署,后期会专门出一个密码交互题出题手册,先占坑,敬请期待~!

Reference

官方笔记文档
黑马程序员视频课
探姬师傅视频课

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/119355?site
推荐阅读
相关标签
  

闽ICP备14008679号