【Docker】——在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
指定基础镜像
FROM centos:6
ENV
设置环境变量,可在后面指令使用
ENV key value
COPY
拷贝本地文件到镜像的指定目录
COPY ./xx.jar /tmp/app.jar
RUN
执行Linux的shell命令,一般是安装过程的命令
RUN yum install gcc
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
网络