【学习笔记】一文打通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

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

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

首先在win本地生成公钥

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

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

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

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

image-20230803024954066

修改权限:

sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh

编辑ssh配置文件:

sudo vim /etc/ssh/sshd_config

image-20230803025242640

RSAAuthentication yes
PubkeyAuthentication yes

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

最后重启ssh服务

sudo service ssh restart

配置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.xxxUser kaliIdentityFile C:\Users\xxx\.ssh\sshdocker

到此在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
2.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

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

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

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4.启动和校验
# 启动Docker
systemctl start docker# 停止Docker
systemctl stop docker# 重启
systemctl restart docker# 设置开机自启
systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
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

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
image-20240124153402994

直接访问

#进入容器
docker exec -it nginx bash
#退出
exit
#删除容器
docker rm nginx
docker rm nginx -f   #强制删除

简化命令

预定义命令别名

编辑 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

命令解释:

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

其他命令:

#创建数据卷
[]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 <容器名>
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

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 .
  • -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

image-20240124233217481

创建成功

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

两个方法:

  1. 容器已经启动了

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

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

查看容器的网络状况

docker inspect <container>

容器互联:

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

docker exec -it <container> bash

使用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

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 .

image-20240125170745472

然后启动后端镜像

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

配置服务器安全组 开放8080

访问成功

image-20240125170900264

后端检测日志:

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

部署前端

挂载

访问前端就一定需要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

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

image-20240125172918566

DockerCompose

安装:

sudo yum install python3 python3-pipsudo pip3 install docker-composedocker-compose --version
#出现报错 需要更新
sudo yum update python3 python3-pippython3 --version  #需要3.6及以上pip3 install --upgrade pipsudo pip3 install docker-compose

参考: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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473116.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4 月 9 日至 4 月 10 日,Hack.Summit() 2024 首聚香江

Hack.Summit() 是一系列 Web3 开发者大会。2024 年的活动将于 2024 年 4 月 9 日至 4 月 10 日在香港数码港举行。自十年前首次举办以来&#xff0c;此次会议标志着 Hack.Summit() 首次在亚洲举办&#xff0c;香港被选为首次亚洲主办城市&#xff0c;这对 Hack VC 和该地区都具…

DNS出现问题了,怎么处理?-提供完整解决方案

DNS作用 将域名(网址)解析为IP地址 DNS的作用是将域名(网址)解析为IP地址,方便用户访问互联网。通过DNS,用户可以轻松地通过域名来获取对应的IP地址,无需记住复杂的数字串。 负载均衡 负载均衡是DNS的一种功能,它能够将访问请求转发到不同的服务器,从而实现负载均衡。…

MySQL篇之SQL优化

一、表的设计优化 表的设计优化&#xff08;参考阿里开发手册《嵩山版》&#xff09;&#xff1a; 1. 比如设置合适的数值&#xff08;tinyint int bigint&#xff09;&#xff0c;要根据实际情况选择。 2. 比如设置合适的字符串类型&#xff08;char和varchar&#xff09…

grafana配置钉钉告警模版(一)

1、配置钉钉告警模版 创建钉钉告警模版&#xff0c;然后在创建钉钉告警时调用模版。 定义发送内容具体代码 my_text_alert_list 是模版名称后面再配置钉钉告警时需要调用。 {{/* 定义消息体片段 */}} {{ define "my_text_alert_list" }}{{ range . }}告警名称&…

C++11---(1)

目录 一、C11简介 二、列表初始化 2.1、{ } 初始化 三、变量类型推导 3.1、auto 3.2、decltype 为什么需要decltype 四、final和override 4.1、final 4.2、override 五、默认成员函数控制 5.1、default修饰函数 5.2、delete修饰函数 六、nullptr 一、C11简介 C11是…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

2024年【天津市安全员B证】新版试题及天津市安全员B证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员B证新版试题参考答案及天津市安全员B证考试试题解析是安全生产模拟考试一点通题库老师及天津市安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助天津市安全员B证复审考试学员顺利通过考试。 1、…

Linux进程间通信(三)-----System V消息队列

消息队列的概念及原理 消息队列实际上就是在系统当中创建了一个队列&#xff0c;队列当中的每个成员都是一个数据块&#xff0c;这些数据块都由类型和信息两部分构成&#xff0c;两个互相通信的进程通过某种方式看到同一个消息队列&#xff0c;这两个进程向对方发数据时&#x…

STM32F1 - 中断优先级

Interrupt Priority 1> STM32F103ZET6异常向量表2> 中断优先级寄存器NVIC_IPRx3> 中断优先级分组4> 例程&#xff1a;设置EXTI4中断优先级5> 例程&#xff1a;设置SysTick中断优先级6> 为什么不能用NVIC_Init()设置Systick优先级&#xff1f;7> 函数NVIC_…

OpenCV 4基础篇| OpenCV简介

目录 1. 什么是OpenCV2. OpenCV的发展历程3. 为什么用OpenCV4. OpenCV应用领域5. OpenCV的功能模块5.1 基本模块5.2 扩展模块5.3 常用函数目录 1. 什么是OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

CSS的注释:以“ /* ”开头,以“ */ ”结尾

CSS的注释:以“ /* ”开头&#xff0c;以“*/”结尾 CSS的注释: 以“ /* ”开头&#xff0c;以“ */ ”结尾 在CSS中&#xff0c;注释是一种非常重要的工具&#xff0c;它们可以帮助开发者记录代码的功能、用法或其他重要信息。这些信息对于理解代码、维护代码以及与他人合作都…

【网站项目】154智能无人仓库管理

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…