Docker
What is Docker?
利用Docker 可以快速安装应用,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。
注意这个系统函数库,相当于在不同的操作版本运行该应用都是没问题的,因为Docker自身打包了系统函数库,可以实现跨系统运行,也利于在一个服务器上部署多台应用
容器
: Docker在运行镜像时会创建一个隔离环境,称为容器
镜像仓库
: 存储和管理镜像的平台,Docker Hub 用户自身可以上传自己构建的应用
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中
修改权限:
sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh
编辑ssh配置文件:
sudo vim /etc/ssh/sshd_config
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.xxx
User kali
IdentityFile C:\Users\xxx\.ssh\sshdocker
到此在vs中已经可以连接kali了
在左下角点开 connect to host即可
Get The Docker Extension
刚进入拓展插件还是不行 存在权限问题 要把当前用户添加到组
修改完后 重启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
到此安装成功!配置成功!
部署
docker创建命令:
官方文档:http://docs.docker.com/
命令解释:
针对镜像:
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
表示跟随 不退出 一直检测
针对以上命令实践:
官网: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
直接访问
#进入容器
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
: 端口映射,从宿主机的端口(前)映射到容器的端口(后), 其中容器端口固定不变 如果部署多个相同容器 需要调整宿主机的端口进行区分
-e KEY=VALUE
: 设置容器运行的环境变量 可以在docker hub中查看有哪些KEY
mysql
: 指定运行镜像的名字 后面可以加版本号 如mysql:5.4
如果不加 默认latest
docker 数据卷挂载 部署静态资源
原理介绍:
我们创建一个Nginx, 这是一个web高性能的HTTP和反向代理Web服务器,其作用可以实现将我们的项目(静态资源)挂载到服务器上面,实现外部访问。
但是在docker容器中,我们进入到对应的目录·/usr/share/nginx/html
,因为docker容器只包含一些必备的命令,所以如果想编辑文件的话可能命令无法执行,但是在宿主中命令是齐全的,同时各类编辑器效果更便捷,所以我们将docker容器中的数据卷挂载到宿主机中,实现该目录下的内容双向映射,即在宿主机编辑或者在docker容器中编辑两边都会同时更新
命令执行过程:
按需
想把数据卷挂载 一定要在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 目录挂载
相当于给数据卷指定一个本地的目录进行挂载
在上面这个案例中 注意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应用的步骤:
- 安装一个Linux服务器
- 安装JRE并配置环境变量
- 拷贝Jar包
- 运行Jar包
- 构建一个Java镜像的步骤:
- 准备一个Linux运行环境
- 安装JRE并配置环境变量
- 拷贝Jar包
- 编写运行脚本
在编写镜像的时候是分层的,底层的一些逻辑其实是可以直接使用的,避免重复编写
可以在上面这个例子中发现 第一个显示Already exits 就是证明之前已经拉取过
编写指令:
示例:
构建镜像:
docker build -t myImage:1.0 .
-
-t
: 给镜像起名,格式是repository:tag
不指定版本默认为latest -
.
: Dockerfile的相对路径
结构:
注意上面Dockerfile的名字 必须一字不差
同时在部署的时候 Dockerfile中有from的基础镜像 这个需要提前拉取
Network
注意/16
表示前16位不能动,也就是172.17
不能动
但是在上面根据ip访问的话 因为内部的ip地址是随机生成的,所有当重启容器的时候可能会造成ip地址冲突,变化,被别的容器占用,导致MySQL服务可能出问题 所以这种连接方式不推荐
方法二:自定义网络
类比数据卷命令
过程:
- 首先创建一个网络
查看一下网络的初始情况
docker network create happySu
创建成功
- 然后可以把我们启动的容器添加到我们创建的自定义网桥中
两个方法:
-
容器已经启动了
docker network connect <network> <container>
-
容器未启动
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
服务器中Docker容器前置配置:
- mysql
拉取镜像
挂载到本地目录
创建结果 把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
data中自动生成
使用heidiSQL连接测试
注意这里有一个配置问题
因为开发一般在本地嘛 不会直接在服务器上面测 但是我这服务器没有任何资产 就是学习用着玩的就直接在服务器上面部署的
但是mysql去链接的时候不成功是因为服务器安全组的设置,无法访问到3306端口
所以在安全组里面设置一下 把3306端口打开就行 为了一定的安全性 源设置为本机ip即可 就是只有在你的电脑上才能访问到该服务器的3306端口
- 网络桥
创建一个网 happySu
把mysql容器添加到该网桥中
添加成功
打包jar寄了
把打包的内容jar包 + Dockerfile文件 放到root目录下 然后把jar包导入到Docker中
#基础镜像 可能有点慢
[root@happySu ~]# docker build -t hmall .
然后启动后端镜像
#直接添加到我们的网桥中
[root@happySu ~]# docker run -d --name hmall -p 8080:8080 --network happySu hmall
配置服务器安全组 开放8080
访问成功
后端检测日志:
[root@happySu ~]# docker logs -f hmall
部署前端
挂载
访问前端就一定需要nginx 注意不仅仅是界面 还需要和后端连接
所以需要挂载conf文件
现将D:\学习资料汇总\ctf\Docker\nginx
这两个文件放到服务器的root/nginx
目录下
然后运行下面的挂载
端口解释:
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成功实现访问
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
参考:https://edu.yijinglab.com/post/273
使用:
这是一个工具 实现上面的快速构建n个相关联的容器
服务描述的信息其实相当于docker run
后面跟的命令去启动容器,只不过语法上有些不同下面举个例子
depends_on: 表示依赖 创建会先创建依赖的内容
命令格式:
注意该文件的放置位置
Docker in CTF
主要进行题目的部署,后期会专门出一个密码交互题出题手册,先占坑,敬请期待~!文章来源:https://www.toymoban.com/news/detail-831712.html
Reference
官方笔记文档
黑马程序员视频课
探姬师傅视频课文章来源地址https://www.toymoban.com/news/detail-831712.html
到了这里,关于【学习笔记】一文打通Docker!(项目部署orCTF)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!