Docker安装及基本操作

发布时间 2023-11-09 09:43:44作者: 五官一体即忢

说明

本文介绍在 Docker 平台上部署 Java 版 EC 项目。Linux 有众多发行版,使用 Docker 部署可以使开发人员不受服务器环境的干扰,从而避免"本地可以,服务器上不行"的尴尬局面。运维人员使用 Docker 部署可以快速部署、迁移、缩扩容。
本文仅以 CentOS 为例介绍 Docker 平台上的部署方式。

准备工作

环境说明

  • 操作系统: CentOS 64位 7.0以上
  • Linux内核版本: 3.10 及以上,强制
  • SSH工具: 推荐 Putty,不强制
  • 文本编辑工具:推荐 Vim,不强制

生成部署包

请根据参考文档的介绍,生成 jar 格式的部署包(以下简称 jar 包)

安装 Docker

  1. 确认服务器上是否已安装 Docker

    docker --version

    如果已安装会返回类似的内容:
    image.png

  2. 如果已安装,请跳过安装 Docker 环节

  3. 下载docker-ce-19.03.5-3.el7.x86_64.rpm并将其上传到服务器,假设上传到/vdb/strongsoft/soft

  4. 执行命令

    rpm -ivh /vdb/strongsoft/soft/docker-ce-19.03.5-3.el7.x86_64.rpm

PS:提示缺少依赖可以从依赖包下载
image.png
5. 修改镜像和容器数据存储位置,默认存储位置为/var/lib/docker,为避免系统盘被占满,应该存储到数据盘上,假设存储目录为/vdb/lib/docker,修改步骤如下:

修改docker默认路径

docker默认安装在根目录下,运行一段时间镜像、容器、日志等会占用大量磁盘,导致根目录磁盘不足。所以一般我们会将docker的存储路径进行修改。提供以下两种方式修改

方法一:通过修改docker默认存储位置实现

  • 打开/usr/lib/systemd/system/docker.service 文件,找到ExecStart配置项,在其后面加上 -g /vdb/lib/docker --log-opt max-size=50m --log-opt max-file=5,如图所示
    image.png
  • 重载配置文件
systemctl daemon-reload
  • 重启docker
systemctl restart docker

方法二:通过创建软连接实现(该方法无需修改docker配置)

  • 停止docker
systemctl stop docker
  • 如果已经出现了磁盘满的情况需要先将/var/lib/docker下的东西拷到新磁盘上,如果刚装的docker则忽略此步
cp -r /var/lib/docker /vdb/lib/
  • /vdb/lib/docker/创建软连接
ln -s /vdb/lib/docker/ /var/lib/
  • 重启docker
systemctl restart docker

6.修改docker服务开机自动启动

systemctl enable docker

构建容器镜像

  1. 下载helloworld.tar.gz,并在本地解压,得到以下内容
    image.png
  2. 替换 rest 目录下的 jar 包,假设项目的 jar 包名字是gdhz.jar
  3. 修改start.sh文件,将helloworld.jar修改为gdhz.jar,其他内容为默认设置,建议不要修改
    image.png
  4. 如果有独立配置文件,将其命名为application.properties,并替换config目录下的默认配置文件
  5. 将 config Dockerfile rest start.sh 几个文件夹和文件都上传到服务器上,并放在同一个目录里
  6. 登录服务器
  7. 进入上传的目录
  8. 输入命令开始构建镜像,java-helloworld:0.1代表的是镜像名:版本号,可以自行命名,但是不能有特殊字符和中文
    docker build ./ -t java-helloworld:0.1

创建并启动容器

docker run -d --name java-hello -p 8088:8080 java-helloworld:0.1

停止容器

docker stop java-hello

重启容器

docker restart java-hello

移除容器

docker rm java-hello

docker容器自动启动

# 启动容器时加 --restart=always # 如果已经启动的项目,则使用update更新 docker update --restart=always 容器名/容器id

更新升级

假设更新java-helloworld:0.2

1, 构建新容器

docker build ./ -t java-helloworld:0.2

2, 停止并移除旧容器

docker stop java-hello && docker rm java-hello

3, 创建并启动新容器

docker run -d --name java-hello -p 8088:8080 java-helloworld:0.2

4, 验证更新结果

  1. 更新成功: 无需操作
  2. 更新失败: 停止并移除新容器,创建并启动旧版本容器,
docker stop java-hello && docker rm java-hello docker run -d --name java-hello -p 8088:8080 java-helloworld:0.1

拓展

添加镜像库源

注意方法一与方法二不可同时存在!!!配置完成后需要重载配置,重启docker
方法一: /usr/lib/systemd/system/docker.service文件中添加--insecure-registry 122.112.162.230:2234
方法二: /etc/docker/daemon.json文件中添加{"insecure-registries":["192.168.242.132","10.3.13.184"]}

资源监控

docker stats

连接容器

docker exec -it <容器名/容器ID> /bin/bash

查看最后100行日志

docker logs --tail 100 <容器名/容器ID>

部署建议

以上更新方案在更新或失败后版本回退时,都需要短暂的停机,在需要高可用的场景下,可以使用 nginx 反向代理容器的接口,创建新容器时可以用其他端口,验证没有问题后,切换反向代理的端口,即可实现不停机无缝切换