一、安装docker
1.旧版卸载:下面是docker应用的一些相关运行的包
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
2.配置docker的yum库(类似于npm和maven)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
如果此处安装失败,依次执行如下命令:(替换yum的软件源再启动)
# 备份现有的yum仓库
sudo mv /etc/yum.repos.d /etc/yum.repos.d.backup
# 创建新的yum.repos.d目录
sudo mkdir /etc/yum.repos.d
# curl命令从aliyun下载centos的基础仓库的配置文件,保存到CentOS-Base.repo
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理yum缓存
sudo yum clean all
# 生成或刷新yum缓存,会根据新的仓库配置文件下载最新的元数据到本地缓存中
sudo yum makecache
# 同时安装三个软件包:-y 参数用于自动确认默认的“Yes”响应
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.安装成功后配置docker的yum源
# 使用yum-config-manager添加新仓库。
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 替换掉docker-ce.repo文件中出现的download.docker.com地址替换为阿里云的镜像地址mirrors.aliyun.com/docker-ce
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
4.安装Docker(即一组docker组件,包括docker-ce、docker-ce-cli等)
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5.启动和校验Docker
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
6.配置镜像加速(嫌麻烦也可以不做,有一个比较快的稳定的仓库就可以了,从前往后寻找镜像,所以稳定和快的调到前面,调好了再执行)
# 创建目录
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"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",
"https://docker.211678.top",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://do.nark.eu.org",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
如果自己在aliyun或huaweiyun的注册了,就可以使用它们的docker镜像仓库,把仓库源加入到上面命令的第一位。
二、部署应用
需求:部署一个应用mall
2.1 前置设置
2.1.1 创建一个网桥
用于各个容器之间的相互通信
docker network create mall-net
2.1.2 创建一个应用目录
(如果你是一台服务器部署单个项目,也可以直接使用linux的/root)
mkdir /root/mall # 创建应用名的目录
2.1.3 创建各个容器的挂载目录
容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建,所以要提前创建好相关目录。
# 创建mysql的挂载目录,包括数据、配置文件、初始化脚本(脚本也可以在外部刷)
mkdir -p /root/mall/mysql/data
mkdir /root/mall/mysql/conf
mkdir /root/mall/mysql/init
# 创建nginx的挂载目录
mkdir -p /root/mall/nginx/html
touch /root/mall/nginx/nginx.conf
2.2 部署mysql
1.mysql相关配置文件上传到/root/mall/mysql/conf
文件名为hm.cnf,文件内容如下:(也可以不用管,使用默认配置也行)
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect=‘SET NAMES utf8mb4’
2.创建容器并运行
docker run -d \
--name hm-mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=admin@1234 \
-v /root/mall/mysql/data:/var/lib/mysql \
-v /root/mall/mysql/conf:/etc/mysql/conf.d \
-v /root/mall/mysql/init:/docker-entrypoint-initdb.d \
--network mall-net \
--restart=always \
mysql
上诉命令实际上只有一条,下面是其参数的解释,请根据实际情况修改相关参数的值。
docker run # 创建并运行一个容器
-d # 在后台运行容器
\ # 命令未结束换行(命令太长可以使用)
–name hm-mysql # 给容器命令,必须唯一
-p 3306:3306 # 端口映射
-v 宿主机目录:/var/lib/mysql \ # 数据卷挂载
-e key=value # 设置环境变量(是否需要设置由镜像制作者提供,需要查看官方文档)
mysql # 运行指定镜像的名字
3.工具访问
对启动的mysql应用进行访问,比如说navicat工具,将初始表结构和数据刷入进去。
2.3 部署nginx
1.上传nginx.conf和前端资源
nginx.conf覆盖/root/mall/nginx/nginx.conf
前端资源放置到/root/mall/nginx/html
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 18080;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/hmall-portal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hm-nginx:8080;
}
}
server {
listen 18081;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/hmall-admin;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hm-nginx:8080;
}
}
}
2.创建并运行nginx
docker run -d \
--name hm-nginx \
-p 18080:18080 \
-v /root/mall/nginx/html:/usr/share/nginx/html \
-v /root/mall/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network mall-net \
nginx
访问地址:远程地址+端口号(注意,如果是云服务器需要在相关控制台开启端口号访问权限)
2.4 部署java应用
2.4.1 自定义镜像
制镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。
打包镜像包括如下步骤:
- 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
- 安装并配置JDK
- 拷贝jar包(注意数据库访问密码)
- 配置启动脚本
1.编写Dockerfile运行脚本(注意写完后,放置到应用mall目录下)
# 基础镜像
FROM openjdk:11.0-jre-buster # 包括jdk和Linux系统环境
# 设定时区(也可以不用设置)
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /root/mall/app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/root/mall/app.jar"]
2.构建镜像(注意到mall目录下执行)
# 进入镜像目录
cd /root/mall
# 开始构建
docker build -t hm-app:1.0 .
2.4.2 创建容器并运行java应用
通过2.4.1运行之后会生成自定义的镜像文件,通过docker run运行:
# 1.创建并运行容器
docker run -d --name hm-app -p 8080:8080 --network mall-net hm-app:1.0
2.5 DockerCompose
对于2.2/2.3/2.4部署容器的过程可以实现一键部署,重点就是编写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
执行:
# 1.进入root目录
cd /root
# 2.删除旧容器
docker rm -f $(docker ps -qa)
# 3.删除hmall镜像
docker rmi hmall
# 4.清空MySQL数据
rm -rf mysql/data
# 5.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 358B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 15.4s
=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 98B 0.0s
=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 0.0s
=> CACHED [3/3] COPY hm-service.jar /app.jar 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71 0.0s
=> => naming to docker.io/library/root-hmall 0.0s
[+] Running 4/4
✔ Network hmall Created 0.2s
✔ Container mysql Started 0.5s
✔ Container hmall Started 0.9s
✔ Container nginx Started 1.5s
# 6.查看镜像
docker compose images
# 结果
CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 32eebee16acd 362MB
mysql mysql latest 3218b38490ce 516MB
nginx nginx latest 605c77e624dd 141MB
# 7.查看容器
docker compose ps
# 结果
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hmall root-hmall "java -jar /app.jar" hmall 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql mysql "docker-entrypoint.s…" mysql 54 seconds ago Up 53 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint.…" nginx 54 seconds ago Up 52 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
三、docker部署常用命令
# 镜像相关命令
sudo docker images # 查看镜像列表
sudo docker search ubuntu # 镜像搜索ubuntu(可选)
sudo docker pull 镜像名 # 下拉镜像
sudo docker pull 镜像名:Tag # 下拉镜像(tag表示版本,没写表示最新版本)
sudo docker rmi -f 镜像名/镜像ID # 删除镜像
docker save 镜像名/镜像ID -o 文件保存地址 # 保存镜像
docker load -i 文件保存地址 # 加载镜像
# 容器相关命令
sudo docker ps # 查看正在运行的容器
sudo docker ps -a # 查看所有容器
sudo docker stop 容器名/容器ID # 停止容器
docker rm -f 容器名/容器ID # 删除一个容器
docker rm -f 容器名/容器ID 容器名/容器ID # 删除多个容器
docker rm -f $(docker ps -aq) # 删除全部容器
sudo docker attach 容器ID/容器名 # 进入容器
docker update --restart=unless-stopped nacos # 更新为容器自启动
# 创建容器
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash
-it 表示 与容器进行交互式启动
-d 表示可后台运行容器 (守护式运行)
--name 给要运行的容器 起的名字
/bin/bash 交互路径
-p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
-v 将容器内的指定文件夹挂载到宿主机对应位置
# 数据卷相关命令
docker volume create 数据卷名 # 创建数据卷
docker volume rm 数据卷名 # 删除指定数据卷
docker volume inspect 数据卷名 # 查看某个数据卷的详情
docker volume ls # 查看所有数据卷
docker volume prune # 清除所有数据卷
# 网络相关命令
docker network create 网络名 # 创建一个网络
docker network ls # 查看所有网络
docker network rm 网络名 # 删除指定网络
docker network prune 网络名 # 清除未使用的网络
docker network connect 网络名 容器名 # 使指定容器连接加入某网络
docker network disconnect 网络名 容器名 # 使指定容器连接离开某网络
docker network inspect 网络名 # 查看网络详细信息
# linux命令
clear # 清空命令行
systemctl start docker # 启动软件docker(其他软件类似)
systemctl stop docker # 停止软件docker
systemctl restart docker # 重启软件docker
systemctl enable docker # 设置开机自启docker
mkdir 文件夹名 # 创建文件夹
touch 文件名 # 创建文件
补充1:脚本编写的指令