【Docker】——在Docker工具上安装创建容器并完成项目部署
🎼个人主页:【Y小夜】
😎作者简介:一位双非学校的大三学生,编程爱好者,
专注于基础和实战分享,欢迎私信咨询!
🎆入门专栏:🎇【MySQL,Java基础,Rust】
🎈热门专栏:🎊【Python,Javaweb,Springboot】
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️
目录
🎈安装MySQL
🎈启动MySQL
🎈卸载MySQL
🎈安装nginx
🎈数据卷
🎃引入
🎃概念
🎃相关命令
🎈MySQL数据卷挂载
🎃本地目录挂载
🎈制作自己的镜像
🎃Dockerfile
🎃构建镜像
🎈网络
🎃自定义网络
🎈项目部署
🎃部署后端
🎃部署前端
🎈DockerCompose
🎈安装MySQL
执行拉取命令
docker pull mysql
但可能出现以下错误
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
解决方法:
更换镜像源即可
1.修改/etc/docker/daemon.json文件,没有的新建即可
vim /etc/docker/daemon.json
2、添加如下配置
{
"registry-mirrors": [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
3、重新加载配置文件
systemctl daemon-reload
4、重启docker服务
systemctl restart docker
重新运行拉去命令,然后等待即可
查看是否安装完成
docker images
🎈启动MySQL
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
参数说明:
- -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
- MYSQL_ROOT_PASSWORD=root:设置 MySQL 服务 root 用户的密码。
然后使用
docker ps -a
进行查看进程
进入MySQL
docker exec -it MySQL的名字 bash
mysql -uroot -p
输入密码,这样就成功了
要是刚进入时,应该使用
docker start 名字
进行启动工具。
将镜像保存到本地命令
docker sava -o 保存名字.rar 镜像名
加载本地镜像到docker中
docker load -i 本地名称
🎈卸载MySQL
首先查看在docker上运行的工具
docker ps -a
使用命令移除
docker rm mysql名字
再次运行
docker rm mysql-test
然后再移除mysql镜像即可
docker rmi mysql
使用命令查看docker中的镜像
docker images
这样就代表MySQL卸载成功了。
🎈安装nginx
docker pull nginx
docker run -d --name nginx -p 80:80 nginx
-d参数表示后台运行
--name 设置镜像名称
查询日志:
docker logs nginx
进入容器内部
docker exec -it 容器名 bash
-it 产生一个可交互的终端。
🎈数据卷
🎃引入
进入容器中
docker exec -it nginx bash
进入以下目录
cd /usr/share/nginx/html
执行修改命令
发现根本没有vi命令,这是因为docker只包含镜像运行必备的命令,所以需要使用数据卷解决。
🎃概念
数据卷:是一个虚拟目录,是容器内目录和宿主机目录之间的映射的桥梁。
例如:
🎃相关命令
我们可以使用该命令查询相关数据券指令
docker volume --help
例子:利用nginx容器部署静态资源:
提示:1.要在容器创建的时候进行挂载,如果容器已经创建完成了,就没有办法挂载。
2。在创建容器时。如果挂载了数据券且数据券不存在,会自动创建。
我们先将nginx进行删除
docker rm -f nginx
在进行创建
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
在执行docker run命令时,使用-v 数据券:容器内目录 可以完成数据券挂载。
使用命令查看数据券
docker volume ls
查看详情
docker volume inspect html
进入目录看一下
cd /var/lib/docker/volumes/html/_data
然后带点击可视化工具的按钮
直接对文件进行修改(在命令行中使用vim命令修改也可以)
我们去访问一下,看看是否可以
修改完成。
🎈MySQL数据卷挂载
要求:
首先我们先查看安装的容器,看是否有数据卷
docker inspect nginx
docker inspect mysql-test
发现,默认会产生数据卷挂载(匿名卷)
但是,当删除这个容器时,数据卷没有被删除
可数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
注意:本地目录或文件必须以 /
或 ./
开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
例如:
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
🎃本地目录挂载
删除原来的MySQL容器
docker rm -f mysql
进入root目录
cd ~
创建并运行新mysql容器,挂载本地目录
docker run -d
> --name mysql
> -p 3306:3306
> -e TZ=Asia/Shanghai
> -e MYSQL_ROOT_PASSWORD=123
> -v ./mysql/data:/var/lib/mysql
> -v ./mysql/conf:/etc/mysql/conf.d
> -v ./mysql/init:/docker-entrypoint-initdb.d
> mysql
查看root目录,可以发现~/mysql/data目录已经自动创建好了
ls -l mysql
🎈制作自己的镜像
镜像就是一堆文件的集合:但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。
🎃Dockerfile
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 |
|
ENV | 设置环境变量,可在后面指令使用 |
|
COPY | 拷贝本地文件到镜像的指定目录 |
|
RUN | 执行Linux的shell命令,一般是安装过程的命令 |
|
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
🎃构建镜像
例如:
docker build -t docker-demo:1.0 .
-
docker build
: 就是构建一个docker镜像 -
-t docker-demo:1.0
:-t
参数是指定镜像的名称(repository
和tag
) -
.
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.
代表当前目录,也可以直接指定Dockerfile目录:
当在dockerfile中需要下载Docker基础
这里我直接上传tar包(jdk镜像)
使用命令让它变为自己的镜像
docker load -i jdk.tar
使用命令查看
docker images
进行构建
docker build -t docker-demo .
运行镜像(-d参数代表后台运行)
docker run -d --name dd -p 8080:8080 docker-demo
查看日志
docker logs -f dd
到浏览器里面访问一下,发现访问成功!
🎈网络
当我们查看容器详情时,发现网络
docker inspect mysql
我们进入dd容器内
docker exec -it dd bash
然后ping一下ip
但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
🎃自定义网络
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | docker network create |
docker network ls | 查看所有网络 | docs.docker.com |
docker network rm | 删除指定网络 | docs.docker.com |
docker network prune | 清除未使用的网络 | docs.docker.com |
docker network connect | 使指定容器连接加入某网络 | docs.docker.com |
docker network disconnect | 使指定容器连接离开某网络 | docker network disconnect |
docker network inspect | 查看网络详细信息 | docker network inspect |
首先通过命令创建一个网络
docker network create hmall
然后查看网络
docker network ls
让dd和mysql都加入该网络
docker network connect hmall mysql
docker network connect hmall dd
进入容器
docker exec -it dd bash
ping一下
ping mysql
总结:
-
在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
-
在同一个自定义网络中的容器,可以通过别名互相访问
🎈部署HTML前端基础版
先将压缩包上传到页面中,然后开始解压缩到目录中
unzip zndw.zip
然后将我们的
(前提是Nginx已经下载好了)
docker stop $(docker ps -q)
然后开始运行一段代码(记得构建数据卷)
docker run -d -p 80:80 -v /root/zndw:/usr/share/nginx/html nginx:alpine
然后使用命令查看一下,正在运行的容器
docker ps
最后我们直接通过网址就行访问,比如,
http://100.116.103.26/login.html
发现我们访问成功了。
🎈项目部署
🎃部署后端
(这里使用黑马商城举例子)
先使用idea打开,设置一下配置
这里已经有了dockerfile文件
接下来进行打包
然后发现打包完成
将jar包和dockerfile文件放入虚拟机中
然后对镜像进行构建
docker build -t hmall .
查看一下所有的镜像
进行运行
docker run -d --name hmall --network hmall -p 8080:8080 hmall
查看日志:
docker logs -f hmall
访问一下,访问成功
🎃部署前端
要求:创建一个nginx.conf 、html目录与容器挂载
先上传Nginx文件
创建nginx容器并完成两个挂载:
-
把
/root/nginx/nginx.conf
挂载到/etc/nginx/ng
inx.conf
-
把
/root/nginx/html
挂载到/usr/share/nginx/html
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
接下来我们通过浏览器去进行访问,http://你的虚拟机ip:18080
访问成功
我们查一下日志
docker logs -f hmall
试一下搜索功能是否可以连上后端,发现可以搜索到数据库中的数据
输出日志:
🎈DockerCompose
Docker Compose 通过一个单独的Docker-compose.yml模版文件(YAML格式) 来定义一组相关的应用容器,帮助我们实现多个关联的Docker容器的快速部署。
进行描述一个项目内的多个服务(稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。)
Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
docker run 参数 | docker compose 指令 | 说明 |
---|---|---|
--name | container_name | 容器名称 |
-p | ports | 端口映射 |
-e | environment | 环境变量 |
-v | volumes | 数据卷配置 |
--network | networks | 网络 |