Docker安装、基础知识、项目部署笔记
安装MobaXterm
为方便操作,下载一个终端模拟器MobaXterm:MobaXterm free Xserver and tabbed SSH client for Windows
解压后运行exe文件
进入linux虚拟机,输入ifconfig查看当前虚拟机的ip地址
然后进入MobaXterm的操作界面创建session,其中remote host填的是上面的看到的ip
安装docker
以下所有操作都在VMware虚拟机中进行,用的是CentOS7
1、首先如果系统中已经存在旧的Docker,则先卸载
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux
2、安装yum工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
若安装失败并显示是镜像源的问题,则切换镜像源
1、检查是否安装wget,若执行以下命令后有返回路径,则代表安装,若无则执行安装命令
which wget
安装wget命令
sudo yum install wget
2、进入yum源配置目录
cd /etc/yum.repos.d
3、修改yum源,就是修改CentOS-Base.repo的内容,所以我们要先备份一下原来的
sudo mv CentOS-Base.repo CentOS-Base.repo.backup
4、CentOS7切换阿里云镜像
sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
5、打开文件编辑(进入文件后按一下 i 进入编辑模式,编辑完成后按住Esc,然后输入 :wq 退出编辑)
sudo vi /etc/yum.repos.d/CentOS-Base.repo
6、将文件中的三条阿里云镜像源删除两条,只保留一条(记住不止改[base]下的模块,但凡出现
http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
的地方都要把这两条删除
初始
更改后
7、 先清除原来的元数据缓存
sudo yum clean all
8、更新新的元数据缓存
sudo yum makecache
9、再次执行刚才失败的安装yum工具命令
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3、安装成功后,执行命令,配置Docker的yum源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
4、更新yum,建立缓存
sudo yum makecache fast
5、安装docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
6、启动和校验
1、检测docker是否安装完成
docker -v
2、启动和校验(设置开机自启动和启动docker)
# 启动Docker
systemctl start docker# 停止Docker
systemctl stop docker# 重启
systemctl restart docker# 设置开机自启
systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
检验是否连接成功
7、配置镜像加速
镜像地址可能会变更,如果失效可以百度找最新的docker镜像
# 创建目录
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
查看文件/etc/docker/daemon.json
cat /etc/docker/daemon.json
Docker部署基础知识
mysql部署
docker pull mysql #拉取mysql
部署mysql命令(docker部署mysql不是直接下载mysql的安装包,本质上是下载mysql的绿色免安装版(将我们平时安装应用后生成的一大堆安装文件配置文件直接打包,解压缩后直接运行,无需按照,所以叫绿色免安装(下载一个已经安装好的mysql))
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
docker将应用所需的系统环境一起打包配置,所有docker的镜像能够做到忽略操作系统的环境,忽略系统本身的差异直接部署
mysql部署的命令解读
设置端口映射的原因:由于部署好的mysql容器是对外隔离的,所以即使mysql容器内部有属于它自己的IP地址,外界也是无法访问的。想要外界(windows去使用虚拟机部署的mysql)访问mysql容器,则需要外界先访问宿主机的ip地址(虚拟机的ip地址)和端口(虚拟机的端口号),然后再由宿主机把访问转向mysql容器。第一个3306代表宿主机的端口,第二个3306代表mysql容器的端口(mysql容器的端口总是3306,但是宿主机的端口可以更改,假设现在在虚拟机里启动了两个mysql,那么在宿主机里第一个mysql端口是3306,其中第一个mysql容器的端口是3306,第二个在宿主机里的mysql端口是3307,其中第二个mysql容器的端口是3306)
Docker基础知识
常见命令
docker pull :从镜像仓库拉取镜像到本地
docker images:查看本地拉取过的镜像
docker rmi:删除拉取的镜像
docker build:把自己的项目建立成镜像
docker save:将镜像打包为压缩文件
docker load:下载压缩好的镜像文件
docker push:把自己建立好的镜像推送到公开的镜像仓库或者公司私服(运维就可以直接拉取你的镜像)
docker run:创建并运行镜像容器
docker stop:停止运行容器
docker start:重新开始运行容器(run是创造新的,start没有创造新的)
docker ps:查看本地的容器
docker rm:删除容器
docker logs:查看容器运行日志
docker exec:进入容器内部修改
案例
1、拉取nginx
docker pull nginx
2、查看是否部署完成
docker images
3、把nginx打包为压缩包
docker save -o nginx.tar nginx:latest
4、删除nginx
docker rmi nginx:latest
5、利用之前打包的压缩包重新部署nginx
docker load -i nginx.tar
6、启动nginx容器
docker run -d --name nginx -p 80:80 nginx
7、进入nginx容器内部
docker exec -it mysql bash
ls
exit
8、停止容器运行
docker stop nginx
9、删除容器
docker rm nginx
数据卷挂载
假如我们想要进入nginx容器里面修改它的index.html文件,但是无法直接用 vi 命令直接进入html文件里面进行读写,这个时候就要用到数据卷。
我们在数据卷创建文件html和conf,然后宿主机(虚拟机)会自动在本地的特定目录下创建html和conf目录,然后我们可以将宿主机的文件挂载到nginx容器内的指定路径,也就是将宿主机下的html和conf文件和nginx容器下的html和conf文件之间架起桥梁,这样就可以通过修改宿主机的文件,然后同步更改容器里的文件,不需要进入nginx容器修改文件内容了。
案例1
1、删除已有的nginx容器
docker rm -f nginx
2、在创建nginx容器的同时创建数据卷挂载到nignx的html目录
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
#html是创建的数据卷名称,/urs/share/nginx/html是要挂载的目录
3、查看创建的数据卷
docker volume ls
4、查看数据卷详情
docker volume inspect html
数据卷在宿主机位置
5、进入数据卷的宿主机位置
cd /var/lib/docker/volumes/html/_data
ls
6、如果安装了MobaXterm终端,则可以像在Windows那样直接对文件修改,点击左侧的follow terminal folder则可以跳转到目录
7、将idnex.html下的Nginx修改为here,在浏览器输入虚拟机ip地址访问nginx的index.html源码
案例2(基于本地目录直接挂载)
1、查询mysql的容器挂载情况,可以发现在我们并没有创建mysql容器数据卷的情况下,mysql在mount下仍旧有一个匿名卷(自行创建的数据卷,匿名卷的主要目的是持久化存储容器数据,容器本身是无状态的,重启或删除容器会导致数据丢失,而匿名卷将数据存储在宿主机的 Docker 数据目录中(默认位于 /var/lib/docker/volumes/
),从而实现数据持久化)。但是如果我们在当前mysql容器创建数据库和表,做数据修改删除,然后后面删除当前mysql容器,创建新的mysql容器,我们可以发现mysql容器出现了新的名字的匿名卷,而新的容器并没有复用旧的匿名卷,因此新容器看不到旧容器的数据。
docker inspect mysql
2、最好就是在创建mysql容器的是时候直接创建数据卷(如果删除容器后重新创建容器,只要新容器创建的数据卷和旧容器相同,那么新容器就会继承旧容器的数据),在root下创建mysql目录
cd ~
pwd
mkdir mysql
cd mysql/
mkdir data
mkdir conf
mkdir init
3、创建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
自定义镜像
java的JVM:执行字节码,将其翻译成特定系统的机器码,没有 JVM,字节码无法在任何系统上运行。
java的JRE:包含 JVM 和运行 Java 程序的基础类库,提供运行所需的一切,但不同系统需安装对应版本的 JRE。
部署一个java应用:为了能够直接在linux上使用java应用,打包了JRE,但是又因为不知道java应用要在什么系统上运行,打包的JRE可能不匹配系统需求。
构建一个java镜像:把和当前打包的JRE所需要所匹配的系统运行环境一起打包,这样就可以直接用了。
镜像打包的时候不是直接把所有需要的文件打包在一起,而是先分别压缩为一层,将每层打包在一起。这样可以把每层单独挑出来,以后可以共享很多基础层(复用),就不用每次打包都从头开始。
Dockerfile(构建描述文件)
. 的含义:代表当前终端所在的目录(叫做构建上下文),执行命令时,Docker 会把这个目录整体作为构建的基础素材。它告诉 Docker 从哪里找构建镜像所需的 “原材料”,Docker 会把这个路径下的所有文件和目录,打包传给 Docker 守护进程用于构建镜像。
比如写了 COPY app.jar /app/
这类拷贝指令时,Docker 会从 .
(当前目录)里找 app.jar
去拷贝。
Dockerfile文件内容(构建自定义镜像必须有的文件,后面构建自定义镜像的时候因为没有用 -f 指定名字,所以必须叫Dockerfile(当使用 docker build
命令且不通过 -f
参数指定构建描述文件时,Docker 会默认在构建上下文(即命令中最后的 .
所指定的目录 )里寻找名为 Dockerfile
的文件,把它作为构建镜像的 “蓝图”)。其中第一行的基础镜像直接上传到虚拟机的root目录下(jdk.tar),demo是我们要自定义镜像的文件夹(docker-demo.jar和Dockerfile文件))
1、解压jdk的tar包
docker load -i jdk.tar
2、切换到要自定义镜像的demo文件夹下
cd demo/
3、开始构建自定义镜像(构建里涉及到的本地文件(像 jdk.tar
、docker-demo.jar
等 )要结合 Dockerfile
里的指令,利用构建上下文(也就是自己自定义的 . 目录)合理处理,让它们在镜像构建过程中发挥作用,组成最终的自定义镜像 )
docker build -t docker-demo .
4、运行构建好的镜像容器
docker run -d --name dd -p 8080:8080 docker-demo
5、浏览器运行
网络
在docker安装完成后会自动创建docker0,然后后面部署的容器全都会和docker0连接,这样不同的容器就可以相互访问。但是如果当前容器停止后另一个容器补上来就会占用上一个容器的ip地址,容器的ip地址在变化,这样的相互访问是不稳定的。
自定义网络
只要配置好要访问的对应的容器名,那么就算是ip地址变了也能找到
1、查看所有网络
docker network ls
2、创建自定义网络
docker network create hz
3、查看所有网络
docker network ls
4、查看虚拟机网段
ip addr
docker0
自定义
5、使容器连接自定义的网络
docker network connect hz nginx
6、查看容器详情可以发现有两个网络
docker inspect nginx
7、删除容器
docker rm -f nginx
8、在创建容器的时候同时指定network
docker run -d --name nginx -p 8080:8080 --network hz nginx
9、查看容器详情,并没有两个network, 默认的消失了,只剩下自定义网络
docker inspect nginx
10、将另一个容器加入自定义网络
docker network connect hz mysql
11、进入容器内部
docker exec -it mysql bash
12、ping其他加入自定义网络的容器成功
ping nginx
项目部署
数据库
1、在创建mysql容器的同时创建数据卷挂载(密码一定要和idea项目配置的数据库密码一致)
cd ~
pwd
mkdir mysql
cd mysql/
mkdir data
mkdir conf
mkdir init
2、将数据库的conf文件和init的sql文件分别放到/root/mysql/conf和/root/mysql/init目录下,然后创建mysql容器:
创建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
3、将mysql容器添加进自定义网络hz
docker network connect hz mysql
4、进入mysql容器内部
docker exec -it mysql mysql -u root -p
输入密码后,查看数据库和数据表看有没有自己导入数据库。
后端
1、用idea打开某个项目(项目中配置好本地数据库连接数据项和数据库容器连接数据项)
2、准备好Dockerfile
3、打包
4、点开项目目录可以看到target下已经打包好的jar包,根据jar包和Dockerfile即可完成镜像构建
5、将打包好的jar包和Dockerfile拖入虚拟机下的root目录下
6、构建项目镜像(可通过docker images 查看是否成功)
docker build -t hmall .
7、创建容器(要和mysql在同一个网络下,如果由容器占用了8080端口,记得终止,可用docker ps查看是否成功)
docker run -d --name hm -p 8080:8080 --network hz hmall
8、测试
9、报错
如果访问mysql失败,则可能原因
1、没有将mysql和项目防止到同一网络下,可以进入项目内部,然后ping mysql看看能不能ping通
2、可能是给创建mysql容器时给mysql容器设置的root密码和项目里配置文件配置的密码对不上。
这个是时候需要删除mysql容器,以及所有数据卷挂载目录,然后重新把数据库配置操作一遍,注意创建mysql容器的时候要在root目录下。
前端
1、把前端的html和conf和虚拟机nginx容器里的html和conf做相关挂载,将nginx文件夹放入root目录下(包括前端代码html和配置文件conf)
2、删除原先的nginx容器,然后创建nginx容器
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 hz \
nginx
3、测试
DockerCompose
DockerCompose快速部署的描述内容和docker run相似,只是语法有些不同
上述项目部署过程的通过DockersCompose
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall
Docker Compose一键部署
1、将Docker Compose的docker-compose.yml文件放入root目录下
2、删除之前所有前端、数据库、后端的容器和镜像部署
docker rm -f nginx hm mysql/
docker rmi hmall
3、docker compose一键部署
docker compose up -d
查看部署结果
4、查看部署容器
docker compose ps
5、一键取消部署
docker compose down