目录
2.4 Dockerfile以及SpringBoot项目打包部署
今天的最佳表现应该作为明天的最低要求
1 Docker基础
1.1 什么是Docker
Docker是一个开源的应用容器引擎,基于Go语言并遵循Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到Linux机器上,也可以实现虚拟化。
1.2 Docker相关概念
Docker镜像
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),Docker镜像不包含任何动态数据,其内容在构建后不会被改变,它是创建容器的模板。由于镜像包含操作系统完整的root文件系统,其体积一般很庞大,因此Docker设计时设计为分层存储的架构。镜像只是一个虚拟概念,其实际体现并非由一个文件组成,而是由多层文件系统联合组成。
Docker容器
Docker容器是镜像的运行时实例,适用于基于Linux和Windows的应用程序,无论基础架构如何,容器化软件都将始终运行相同。容器将软件与其环境隔离开来,并确保它可以统一运行。每一个容器运行时是以镜像为基础层在其上创建一个当前容器的存储层,可以称为容器存储层。容器存储层的生存周期和容器一样,随着容器的消亡而消亡。因此任何保存于容器存储层的信息都会随容器删除而丢失。按照Docker最佳实践的要求,容器不应该向其存储层写入任何数据,应该使用volume数据卷或绑定宿主目录,这样性能和稳定性更高。
Docker仓库
Docker仓库是一个集中存储、分发镜像的服务,Docker Registry就是这样的服务。一个Docker Registry可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。一个仓库通常包含同一软件不同版本的镜像,可以通过<仓库名>:<标签>指定镜像的版本。如果不给出标签,默认标签为latest。
2 Docker实战
2.1 Docker操作
首先我们得有一台自己的远程服务器,通过FinalShell或者Xshell连接远程服务器,比如我这里使用的是FinalShell,下面的例子都是在FinalShell上操作。
FinalShell下载地址: FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本3.9.2,更新时间2021.6.28 - SSH工具 客户端
使用FinalShell连接上远程服务器之后,就可以进行我们的操作了
如何安装Docker?
1、首先卸载旧版本的Docker
yum erase docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2、安装所需要的软件包,yum-utils 提供了 yum-config-manage
yum install -y yum-utils
3、在安装Docker之前,先设置一下镜像仓库,我这里将镜像仓库设置为阿里云的,推荐使用!
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、还可以查看一下可安装的Dokcer版本(也可以不查看)
yum list docker-ce --showduplicates | sort -r
5、开始安装Docker
- docker-ce: 表示社区版本,我这里选择的是社区版本
- docker-ee: 表示企业版本
yum install docker-ce -y
6、查看Docker版本,确定是否安装成功
docker version

7、开始启动Docker
systemctl start docker
8、最后我们来运行Docker并把镜像名称设置为hello-world,但是它会提示我们还没有安装Docker镜像,并自动的帮我们安装镜像
[root@eusoft ~]# docker run hello-world #docker run 表示的就是运行docker
Unable to find image 'hello-world:latest' locally #没有寻找到镜像
latest: Pulling from library/hello-world #然后就去拉取镜像
b8dfde127a29: Pull complete #然后下面这堆表示的是镜像拉取成功
Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Status: Downloaded newer image for hello-world:latest #到这里截止
Hello from Docker! #说明成功了
9、查看所有镜像,你会发现我们刚刚运行的镜像hello-world
docker images

10、那么如何卸载docker并删除资源呢?(包括镜像、容器等)
#卸载Docker
yum remove docker-ce -y
#删除资源
rm -rf /var/lib/docker
如何配置阿里云镜像加速
1、登录阿里云,找到容器镜像服务ACR

2、点击进入容器镜像服务ACR,然后进入容器镜像管理控制台

3、根据自己实际情况选择不同操作系统的镜像加速

4、最后就可以开始配置镜像加速了,我这里使用的是CentOS镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vx1gaskb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- sudo mkdir -p /etc/docker 表示的是新建一个docker目录
- sudo tee /etc/docker/daemon.json <<-'EOF' 表示的是在这个docker目录下新建一个daemon.json文件
- {
"registry-mirrors": ["https://vx1gaskb.mirror.aliyuncs.com"] 表示的是文件内容
} - sudo systemctl daemon-reload 表示的是重启镜像
- sudo systemctl restart docker 表示的是重启docker
2.2 容器操作
Nginx部署实战
1、有了镜像才可以创建容器,我们这里以创建Nginx为例
首先拉取Nginx镜像,因为有了Nginx镜像才可以创建Nginx容器
docker pull nginx

2、开始创建Nginx容器
docker run -d -p 3344:80 --name nginx01 nginx

-d 表示的是在后台运行
-p 表示的是端口映射
端口映射:端口映射是指把外网的IP地址的某一个端口映射到内网的某台主机的某个端口上,比如可以把192.168.1.8的80端口映射到公网的1314端口,那么通过1314也可以访问你的服务器
3、查看正在运行的容器列表,发现我们刚刚创建的Nginx容器nginx01存在了
docker ps

4、这时我们就可以访问部署的Nginx了,首先使用命令行的形式在本地进行访问
curl localhost:3344
出现以下的html代码,说明访问成功了!! culr的作用是发起请求并获取数据,这里获取到了数据说明访问成功

5、设置安全组,使用远程服务器IP访问
本地虽然是访问成功了,但是既然部署在了远程服务器上,那么我们应该是可以通过服务器的IP加3344端口访问到的,但是在这之前我们必须设置服务器的安全组,我这里以移动云服务器

6、然后我们在浏览器输入 http:36.134.75.199:3344,回车,Nginx访问成功!!

这就是Nginx的简单部署,以后类似的tomcat,gitlab等的部署也是一样的!!
2.3 Docker容器数据卷
容器之间有一个数据共享的技术,Docker容器中产生的数据,同步到本地,本地的可以同步到容器,也就是目录的挂载,总结一句话就是容器之间是可以实现数据共享的
MySQL数据同步
MySQL数据库同步需要挂载多个文件,包括配置文件,数据文件(其他如果需要挂载只需要在后面加即可)等
1、首先拉取MySQL镜像
docker pull mysql
2、开始进行MySQL同步操作
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysqlwjw mysql
-d: 表示后台运行
-p: 表示端口映射
-v: 表示数据卷挂载
-e: 表示环境配置
--name: 表示容器名字
3、启动之后我们在本地使用navicat来连接测试,navicat和容器内的3306端口进行映射

4、然后我们在数据库里面新建一张表testdb,再来查看一下本地的data中有没有这张表,如果一切正常是会有的!果然是有的
cd data #进入data文件
ls #查看data的所有内容

至此,简单的MySQL数据库同步就完成了!
2.4 Dockerfile以及SpringBoot项目打包部署
Dockerfile介绍
Dockerfile是构建Docker镜像的,通过脚本可以生成镜像,镜像是分层的,我们通过打包部署SpringBoot项目来认识Dockerfile
构建项目并打包
1、创建一个SpringBoot项目并确保能够正常访问,端口为8089

2、点击package打包此项目

如图出现BUILD SUCCESS表示打包成功

3、此时项目的target目录下会出现打包的JAR包

4、使用cmd运行此JAR包,确保JAR包没问题

Dockerfile创建
1、在此项目中创建并编写DockerFile文件

Dockerfile文件内容说明可参考菜鸟教程: Docker Dockerfile | 菜鸟教程
开始部署
1、在home目录下创建一个文件夹idea,用于存放Dockerfile文件和funnyspring-0.0.1-SNAPSHOT.jar
cd /home #进入home目录
mkdir idea #新建idea目录
然后将Dockerfile文件和 funnyspring-0.0.1-SNAPSHOT.jar上传到idea目录中,这个使用FinalShell手动传即可,很方便!
2、开始构建镜像
docker build -t wjwdemo .
构建完成后,查看一下镜像是否存在 wjwdemo,如果存在说明构建成功!
3、最后运行
docker run -d -p 3377:8089 --name wjw-springboot wjwdemo
运行成功后,依旧先使用curl访问并获取资源,如果可以访问,那说明成功了!
curl localhost:3377
然后依旧是配置安全组,使用元远程服务器的IP + 3377端口在浏览器上进行访问!比如这里输入的是 http://36.134.75.199:3377/index/test

3 结束语
至此,Docker就算入门了,但是作为真正的软件开发工程师而不是API调用工程师,原理性的东西必须要去了解,包括Docker分层原理、端口暴露原理等
后期依旧会更新包括Docker容器和镜像常用命令、Docker分层原理、端口暴露原理、DockerCompose,DockerSwarm等内容
目前我们只构建了一个镜像,那么假设有多个镜像,比如我们真正的企业项目部署中,会有MySQL,Redis,Nginx等,如果按照这种方式一个个构建的话,迟早把部署的人累死,那么有没有一种技术可以一次完成呢?还真有,那就是接下来的容器编排(Docker Compose)技术,后面会更新!
持续学习是一个软件工程师必备的素质之一,也是打造个人核心竞争力所必须付出的努力!
本文详细介绍Docker的基础概念、安装配置及实战操作,包括Nginx部署、MySQL数据同步及SpringBoot项目打包部署。


被折叠的 条评论
为什么被折叠?



