介绍
Docker 是一个开源的容器化平台,它可以让开发者打包应用程序及其依赖环境到一个可移植的容器中,然后在任何安装了 Docker 的机器上运行。容器类似于虚拟机,但更轻量级,因为它们共享操作系统内核而不是每个容器一个独立的操作系统。
简单来说就是可以快速配置环境以及部署项目。
在Ubuntu上安装Docker
1.更新包索引并安装必要的包
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg
2.添加 Docker 的官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
3.设置 Docker 存储库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4.更新包索引并安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5.启动 Docker 服务并验证安装,看到 "Hello from Docker!" 的信息,说明 Docker 安装成功。
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world
6.配置阿里云镜像加速器,直接复制粘贴运行即可
部署MySQL
镜像可以理解为绿色便携版的应用安装包(即下即用),而容器可以理解为应用的多开,容器间是隔离的不会相互影响。比如微信这个应用和同时多开几个微信,多开的微信互不影响。
无需考虑安装包、环境、配置的关系,只需使用下面代码,docker便会一键部署。
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
使用docker ps查看正在运行的容器,包括容器的 ID、镜像名称、创建时间、状态、端口映射和名称等信息。可以看到mysql数据库已经安装成功。
使用idea测试数据库连接,可以成功连接。
更改命令参数可以部署第二个MySQL数据库
docker run -d --name mysql2 -p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
常见命令
案例——创建Nginx容器
1.DockerHub搜索Nginx镜像,直接用docker pull nginx命令下载最新版镜像。
2.使用docker images查看所有镜像可以看到拉取的nginx镜像。
3.创建nginx容器并使用docker ps命令查看。
docker run -d --name nginx -p 80:80 nginx
4.使用docker stop nginx命令暂停容器并使用docker ps -a命令查看(加了-a会显示暂停的容器)。
5.使用docker start nginx命令启动容器,注意不是docker run(这个是创建容器),并使用docker ps命令查看。
6.使用docker exec -it nginx bash进入容器内部,并使用伪终端和命令行进行交互。容器内部有模拟的文件系统。使用exit命令可以退出容器。
7.暂停并删除mysql2容器。
数据卷挂载
1.删除原先的nginx容器后重新创建,这次创建数据卷,再使用指令进行查看。
docker rm -f nginx
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
2.查看虚拟机的目录,发现成功映射。
本地目录挂载
与前面挂载不同点:可以自定义映射的虚拟机路径,而不是固定的映射路径下。
自定义镜像
1.将demo文件夹上传到虚拟机root目录下,此处使用的是Xftp。
2.demo文件夹包含打包的jar包和Dockerfile文件。
3.进入demo目录下创建docker镜像,注意不要漏了空格和.
cd demo
docker build -t docker-demo .
4.使用docker images可以看到创建的docker-demo镜像。
5.用该镜像创建容器,然后查看其运行状态和日志。
docker run -d --name dd -p 8080:8080 docker-demo
docker ps
docker logs -f dd
6.成功访问网页:虚拟机ip地址+:8080/hello/count
容器网络互联
创建网络命名为hmall ,查看所有网络,将mysql容器加入到网络并起别名db。
docker network create hmall
docker network ls
docker network connect hmall mysql --alias db
部署前后端项目
部署后端Java应用
1.对mysql数据库执行sql文件。
2.加载完maven依赖后,打包hmall项目。
3.将这两个文件拖到虚拟机root/demo2目录下。
4.进入demo2目录创建镜像,然后创建容器加入到hmall网络中。(注意前面容器网络互联中已经将mysql容器加入到hmall网络,因此二者可以互联)
cd demo2
docker build -t hmall .
docker run -d --name hm -p 8080:8080 --network hmall hmall
5.接下来访问网页,若出现数据说明部署成功,网址举例:虚拟机ip地址:8080/search/list?pageNo=1&pageSize=5
部署前端
1.将nginx文件夹上传到虚拟机root目录。
2.由于nginx.conf文件使用的是hmall,因此输入docker rename hm hmall将容器名改为hmall。
3.创建nginx容器,配置端口和路径映射,并加入到网络hmall以便能和后端项目互联。
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
4.查看网页 虚拟机ip地址:18080
Docker Compose
1.将如下内容的docker-compose.yml文件上传到虚拟机root目录。
version: "3.8" # 指定Docker Compose文件的版本
services: # 定义多个服务
mysql:
image: mysql # 使用官方MySQL镜像
container_name: mysql # 容器名称为mysql
ports:
- "3306:3306" # 将主机的3306端口映射到容器的3306端口
environment:
TZ: Asia/Shanghai # 设置时区为亚洲/上海
MYSQL_ROOT_PASSWORD: 123 # 设置MySQL的root用户密码为123
volumes:
- "./mysql/conf:/etc/mysql/conf.d" # 挂载本地的mysql配置文件夹到容器中的配置目录
- "./mysql/data:/var/lib/mysql" # 挂载本地的数据文件夹到容器中的MySQL数据目录
- "./mysql/init:/docker-entrypoint-initdb.d" # 挂载初始化脚本目录到容器中的初始化脚本目录
networks:
- hm-net # 将服务连接到自定义网络hm-net
hmall:
build:
context: . # 指定构建上下文为当前目录
dockerfile: Dockerfile # 使用当前目录中的Dockerfile文件构建镜像
container_name: hmall # 容器名称为hmall
ports:
- "8080:8080" # 将主机的8080端口映射到容器的8080端口
networks:
- hm-net # 将服务连接到自定义网络hm-net
depends_on:
- mysql # 依赖于mysql服务,确保mysql服务先启动
nginx:
image: nginx # 使用官方Nginx镜像
container_name: nginx # 容器名称为nginx
ports:
- "18080:18080" # 将主机的18080端口映射到容器的18080端口
- "18081:18081" # 将主机的18081端口映射到容器的18081端口
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf" # 挂载本地的Nginx配置文件到容器中的配置目录
- "./nginx/html:/usr/share/nginx/html" # 挂载本地的HTML文件夹到容器中的Nginx静态文件目录
depends_on:
- hmall # 依赖于hmall服务,确保hmall服务先启动
networks:
- hm-net # 将服务连接到自定义网络hm-net
networks:
hm-net:
name: hmall # 定义一个自定义网络hmall
2.删除所有容器和镜像以及自定义网络。(数据卷volume别删,不然要重新配数据库)
3.使用docker compose up -d命令进行部署,发现报错找不到Dockfiles文件。经分析是因为将hmall项目放在root/demo2目录下的原因。
4.修改docker-compose.yml文件重新上传,再次执行docker compose up -d命令成功部署,也可以成功刷新网页。
(by 归忆)