Docker讲解
Linux环境搭建
首先大家需要先准备一下镜像,这里主包使用的是centos7,然后大家去安装,这里比较简单,主包就不带大家仔细看了,需要注意的就是

这里

一定要按照上面给定的来配置,特别是默认路由和DNS一定要一摸一样,ip的话,大家去自己设置就行,这个比较随意,但是也不要和路由以及DNS一样


然后去等待安装就行,最后重新启动就行,这样的话,我们的虚拟机就安装完毕
配置SSH客户端
首先大家需要先安装一下MX,这里主包把链接给大家
https://mobaxterm.mobatek.net/download-home-edition.html
大家下载绿色的就行

然后就是带着大家去配置默认编辑器

这里选择第三个,将你自己喜欢用的编辑器就行,比如vscode,比如node都可以,根据自己的喜好来就行,最后将下面的勾选上

将这里的右击粘贴左击复制勾选上就行,然后将第二个去掉

这里跟主包一样就行

这里的话将画上横线的去掉,不让他自己开机去启动
这样的话咱们的Linux环境就搭建完毕
Docker安装
首先需要先卸载旧版的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
然后是配置Docker的yum库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
这里大家要是出现Cannot find a valid baseurl for repo: base/7/x86_64 的问题的话,大家先去检查自己的网络连接,看一看是不是能够连接到百度,要是没有问题的话大家去看这篇blog 解决问题大概就能解决问题了
更新一下docker的yum源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum,建立缓存
sudo yum makecache fast
安装docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动和校验
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
配置镜像加速
# 创建目录
mkdir -p /etc/docker
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
到这里咱们的基础工作就准备完毕
先手体验
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
这里先来带着大家解读一下mysql的命令,首先我的run是创建一个新的容器,注意是新的容器,大家在以后的运行的过程中要是没有删除掉容器的话,不要去执行这条命令,可以使用start这条命令,–name后面跟着的我给这个容器起的名字,注意一下,这个名字必须唯一,然后就是-e后面跟着的是作者规定的,跟大家没有关系,-e后面能跟着多个参数,这里配置的mysql的密码,我们需要注意的是-p后面跟着的是关于我需要映射的端口,因为在我的虚拟机中我的端口可以随便写哈(你能记住),但是我在docker里面的端口是固定的对不对,那我的冒号前面的3306就可以随便写我写3308,3309都可以,最后面跟着的是我们镜像的名称,这里要是不指定版本号的话,默认是最新版的
基础命令
默认情况下,大家的docker需要自己去启动,这里大家设置一下关于自启动
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]

# 第1步,去DockerHub查看nginx镜像仓库及相关信息
# 第2步,拉取Nginx镜像
docker pull nginx
# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
这里没啥好说的,都是命令,大家自己去记忆就行
大家需要注意的是关于查看所有的容起的后面加上-a
这样就能看到启动的容器和没有启动的容器了,还有就是去进入容命令后面记得跟上-it 然后加上容器的名称,当然,容器的名称后面也可以继续跟着别的

这里就是直接去启动mysql了
对于较长的第十步来说,大家完全可以参考git里面的起别名指令来给这里的起别名
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
配置完毕之后别忘记让配置文件生效
source /root/.bashrc

数据卷
先来说一下什么叫做数据卷?
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
以Nginx为例,我们知道Nginx中有两个关键的目录:
- html:放置一些静态资源
- conf:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。
说白了就是一个桥梁,能让我去修改nginx里面的内容,有同学说了,我在虚拟机里面不能使用vi命令进行修改吗,这里告诉你,不能
所以我们需要来学习数据卷
首先先来学一下最最基础的数据卷

这里是数据卷的相关的指令,大家没话说,直接记忆就行,这里的创建数据卷的时候可以不进行记忆,我在运行容器的时候就直接可以创建数据卷

这里先创建数据卷
然后去查看数据卷创建成功没有,这里没有报错,肯定是成功了的

这样的话我们的数据卷就创建成功了,类似于vue当中的双向绑定,这里的话我就给大家展示我写过的

这是在nginx当中修改的
但是对于数据卷来说,我要是将容器停止了我的数据是不是就会丢失,当然你要是将数据迁移也可以对不对,但是我们存放的目录太深了,在做数据迁移的时候不太好迁移,所以我们需要挂在到本地的目录
所以上面也是对于mysql迁移到本地目录的一个简单实例,因为mysql在创建的时候要是没有去指定数据卷的话也是会默认自己去创建出来一个数据卷的,这样我们的目录结构太深

就像这样,你说我去迁移肯定是会比较麻烦的,所以我直接就在本地创建就好,到时候去指定我创建的MySQL就行
这里首先需要先去创建一个目录叫做mysql

创建成这样的,然后将黑马老师给的上传上去就行

这样去创建的话我就算是删除,这样就实现数据的持久保存了(即使你删除mysql容器后,他依然还存在,只需创建mysql容器时并指定之前定好的目录或文件)
这样就能完成数据的迁移,里面的init和conf就是去参考官文档里面
MySQL 官方镜像有一个机制:当数据库目录为空时(即首次初始化),它会自动执行 /docker-entrypoint-initdb.d 目录下的 .sql、.sh 等文件。所以如果你在这个目录里放了 .sql 文件(比如 init.sql),并且这是第一次启动(数据目录为空),那么这些脚本会被执行,往数据库里插入数据
镜像
听着很复杂,其实我们只需要能看懂就行

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
这里也是直接copy的,至于构建镜像的话首先就需要进入到镜像目录里面去执行初始化操作

进入到这个文件夹里面去执行
docker build -t docker-demo .
这里面会进行初始化成镜像,注意最后面的是指定的当前目录,你要是不在当前目录的话,就需要指定出来dockerfile的路径

然后去启动就行,最后访问接口

这样的话我们的项目就简单部署完成了
网络
对于我们的Java项目来说我们还需要redis,mysql等中间件,所以我们需要能让他们能够互相访问才行,所以我们需要去构建一个属于我们的Java项目的网段

首先还是命令
然后就是去创建网段


这样的话我们的两个容器就能互相访问了,因为他们属于同一个网段
项目部署
首先先来带着大家白雪一下原来的手动部署项目
先来部署一下后端
我们需要先去打包一下Java项目

然后将已经准备好的项目和dockerfile文件传到虚拟机上面去,然后大家就开始部署了
使用指令来创建一下镜像,然后后面的我就不展示了,就是去运行容器并且将网段添加进去就行
这样我们的后端就部署完毕
接下来是前端的部署,这里需要的是
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 hmall \
nginx
我们需要将前端去用数据卷去双向绑定,这样就相当于我将我的上传的nginx的文件写到了docker的nginx上面
然后也是创建容器添加网段就完毕了

这是后端部署完毕访问接口的效果

这是前端部署完毕的结果
大家可以看到,我们部署一个简单的java项目,其中包含3个容器:
- MySQL
- Nginx
- Java项目
而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。
而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
所以现在我们来学习一下docker compose一键部署
docker compose
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
这里大家可以比较一下其实和我们去使用docker run的信息是一样的

docker compose的部署文档
大家可以去看看上面的官网

这里说一下-f是指定文件的路径的,要是不写的话默认是当前的目录下面的yaml,然后-p是去指定项目的名称,要是不写的话也是会给默认值的,接下来去运行一下



然后去访问也是没有问题的,这样看来我们只需要将yaml写好就能一键部署,要是需要部署到多台的服务器的话,大家可以去了解一下k8s,等主包学完后端就去看,到此大家对于基础的部署就基本上精通了,主包在这里祝贺大家距离资深架构师又近了一步
更多推荐



所有评论(0)