Linux环境安装Docker Engine并打包部署Java项目

Docker是一个开源的应用容器引擎,由Go语言开发,基于Linux内核技术。Docker通过将应用及其依赖打包到可移植的容器中,实现了应用的快速部署和高效管理。Docker容器具有轻量级、快速启动、可移植性强等特点,能够显著提升资源利用率和开发效率。它广泛应用于开发、测试、生产等环境,是微服务架构和DevOps文化中的关键工具。Docker还提供了丰富的社区支持和生态系统,助力企业快速构建和部署应用。

docker有两个版本,一个是无界面的docker engine,另一个是有界面的docker desktop。

查看官网:https://docs.docker.com/engine/install/centos/

查看链接可能需要科学上网

当前Linux版本:

shell 复制代码
lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch
Distributor ID:	AlibabaCloud
Description:	Alibaba Cloud Linux release 3 (Soaring Falcon) 
Release:	3
Codename:	SoaringFalcon

由于docker官方网络原因,简简单单的安装也颇费周折,最后总算是安装成功了,详细记录如下:

1、卸载老版本

shell 复制代码
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、配置docker仓库

shell 复制代码
sudo yum install -y yum-utils
# 配置yum源 	
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

注意:上面这个官方链接可能访问不了(不翻墙),或者太慢,换成阿里云的镜像即可

shell 复制代码
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

下面是命令的详细解释:

  • yum-config-manager:这是 yum 工具包中的一个实用程序,用于管理 yum 仓库的配置文件。它允许你添加、删除、启用或禁用仓库,而无需直接编辑仓库的配置文件。
  • --add-repo:这个选项告诉 yum-config-manager 你要执行的操作是添加一个新的 yum 仓库。
  • https://download.docker.com/linux/centos/docker-ce.repo:这是 Docker CE 官方为 CentOS 系统提供的 yum 仓库的 URL。这个仓库包含了 Docker CE 的所有包和依赖项,使得安装和更新 Docker CE 变得简单。

3、安装最新版docker

shell 复制代码
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

官方的镜像访问不了

shell 复制代码
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker CE Stable - x86_64                         0.0  B/s |   0  B     02:00    
Errors during downloading metadata for repository 'docker-ce-stable':
  - Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/stable/repodata/repomd.xml [Connection timed out after 30000 milliseconds]

官方镜像访问不了,换成阿里云的就可以了

shell 复制代码
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@iZm5e33cshwe0x9z1t5yleZ ai]# sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker CE Stable - x86_64                          69 kB/s |  66 kB     00:00    
Dependencies resolved.
.................................
.........................
  Verifying        : docker-ce-cli-1:26.1.3-1.el8.x86_64                                              10/12 
  Verifying        : docker-ce-rootless-extras-26.1.3-1.el8.x86_64                                    11/12 
  Verifying        : docker-compose-plugin-2.27.0-1.el8.x86_64                                        12/12 

Installed:
  containerd.io-1.6.32-3.1.el8.x86_64                    docker-buildx-plugin-0.14.0-1.el8.x86_64          
  docker-ce-3:26.1.3-1.el8.x86_64                        docker-ce-cli-1:26.1.3-1.el8.x86_64               
  docker-ce-rootless-extras-26.1.3-1.el8.x86_64          docker-compose-plugin-2.27.0-1.el8.x86_64         
  fuse-overlayfs-1.13-1.0.1.al8.x86_64                   fuse3-3.3.0-17.al8.x86_64                         
  fuse3-libs-3.3.0-17.al8.x86_64                         libcgroup-0.41-19.2.al8.x86_64                    
  libslirp-4.4.0-2.al8.x86_64                            slirp4netns-1.2.3-1.al8.x86_64                    

Complete!

安装过程会出现两次需要确认的步骤Is this ok [y/N]: y 输入y就可以了

4、启动docker

启动
shell 复制代码
systemctl start docker
重启
shell 复制代码
systemctl restart docker
开机启动
shell 复制代码
systemctl enable docker
查看状态:已经启动
shell 复制代码
systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset>
   Active: active (running) since Sat 2024-08-03 00:52:32 CST; 18min ago
     Docs: https://docs.docker.com
 Main PID: 3810220 (dockerd)
    Tasks: 11
   Memory: 37.5M
   CGroup: /system.slice/docker.service
           └─3810220 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/conta>
查看状态:没有启动
shell 复制代码
systemctl status docker
?.docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com

5、查看版本

docker version

shell 复制代码
docker version
Client: Docker Engine - Community
 Version:           26.1.3
 API version:       1.45
 Go version:        go1.21.10
 Git commit:        b72abbb
 Built:             Thu May 16 08:34:39 2024
 OS/Arch:           linux/amd64
 Context:           default
 
docker --version
Docker version 26.1.3, build b72abbb

6、运行hello world测试

出现如下日志说明测试通过

shell 复制代码
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

由于特殊原因,出现连接超时,如下提示。需要配置国内镜像

shell 复制代码
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Retrying in 1 second 
docker: error pulling image configuration: download failed after attempts=6: dial tcp 199.16.156.11:443: i/o timeout.
See 'docker run --help'.

7、配置镜像

由于官方镜像被墙,所以需要配置其他可访问镜像

sudo vim /etc/docker/daemon.json

在daemon.json 中写入如下配置,没有就新建

json 复制代码
{
    "registry-mirrors": [
        "https://ustc-edu-cn.mirror.aliyuncs.com/",
        "https://ccr.ccs.tencentyun.com/",
        "https://docker.m.daocloud.io/"
    ]
}

保存配置后重启docker。systemctl restart docker

如果重启报错,使用命令查看错误原因:journalctl -xe | grep docker

8、使用docker安装一个应用

安装MQTT协议的broker EMQX

shell 复制代码
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
  • docker run: 这是Docker的一个基本命令,用于从镜像启动新的容器。
  • -d: 这个选项告诉Docker以"分离模式"(detached mode)运行容器,即容器在后台运行。
  • --name emqx: 这个选项允许你为容器指定一个名称,这里是emqx。给容器命名使得后续管理(如停止、删除、查看日志等)更加方便。
  • -p 1883:1883: 这个选项将容器的1883端口映射到宿主机的1883端口。MQTT协议的默认端口是1883,这个映射使得外部客户端可以通过宿主机的1883端口与EMQX通信。
  • -p 8083:8083: 这个选项将容器的8083端口映射到宿主机的8083端口。EMQX使用8083端口提供HTTP API和Dashboard服务,允许你通过Web界面管理EMQX。
  • -p 8084:8084: 这个选项将容器的8084端口提供给WebSocket服务。
  • -p 8883:8883: MQTT over SSL/TLS的默认端口是8883。这个映射使得外部客户端可以通过SSL/TLS加密的方式与EMQX通信。
  • -p 18083:18083: 类似于8083端口,但18083通常用于HTTP API的加密版本(HTTPS)。
  • emqx/emqx:latest: 这指定了要使用的Docker镜像的名称和标签。emqx/emqx是镜像的仓库名和所有者名,`la
    还有另外一种 基于Cloudflare Workers 的 Docker 镜像代理工具的方式:https://github.com/cmliu/CF-Workers-docker.io/tree/main

9、其他命令

查看运行的docker应用

shell 复制代码
docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                    NAMES
0f848b42a08d   emqx/emqx:latest   "/usr/bin/docker-ent??   13 minutes ago   Up 13 minutes   4369-4370/tcp, 5369/tcp, 6369-6370/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:8083-8084->8083-8084/tcp, :::8083-8084->8083-8084/tcp, 8081/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcp, 11883/tcp   emqx

查看容器信息

容器的id,用docker ps查看

shell 复制代码
docker inspect 0f848b42a08d
[
    {
        "Id": "0f848b42a08dfd1817cf708ae6962ada91cf03384af12452c8c4f7f920a6c406",
        "Created": "2024-08-12T06:48:42.879101974Z",
        "Path": "/usr/bin/docker-entrypoint.sh",
        "Args": [
            "/opt/emqx/bin/emqx",
            "foreground"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1148080,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-08-12T06:48:43.677078425Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:0ef9bc19d70ec1e5d1a32ac2aa57eb2f1057e19c3f7bccb3c37b300b57480560",
        "ResolvConfPath": "/var/lib/docker/containers/0f848b42a08dfd1
        .....

进入容器

shell 复制代码
docker exec -it 0f848b42a08d bash 
bash-5.0$ ls
bin          data         erts-11.1.8  etc          lib          log          releases
bash-5.0$ 

限制使用内存

shell 复制代码
允许容器最多使用500M内存和100M的swap:
# 允许使用的swap=memory-swap - memory
# memory-swap='-1'时,无限制使用swap
# memory-swap 不设置时,默认swap的值时memory的2倍
# memory-swap的值等于memory值时,禁用swap
docker run -d --name mynginx1 --memory="500m" --memory-swap="600M" nginx

限制使用CPU

允许容器最多使用一个半的CPU:

shell 复制代码
docker run -d --name mynginx2 --cpus="1.5" nginx

允许容器最多使用50%的CPU:

shell 复制代码
docker run -d --name mynginx3 --cpus='.5' nginx

10、打包java项目

10.1 创建 Dockerfile

文件名就是Dockerfile,没有任何前缀或后缀。当你运行docker build命令时,Docker会在当前目录下查找名为Dockerfile的文件,并根据其中的指令构建镜像。

shell 复制代码
# 使用官方Java运行时环境作为基础镜像  
# FROM openjdk:11-jre-slim  

# 使用官方OpenJDK 17 JDK镜像作为基础镜像  
FROM openjdk:17-jdk-slim  
  
# 设置工作目录为/app  
WORKDIR /app  
  
# 将当前目录下的jar文件复制到容器的/app目录下  
COPY ai-springboot.jar /app  
  
# 声明暴露端口。端口生效最终是由-p 9000:9000指定的,这里只是文档式声明
EXPOSE 9000

# 使用ENV指令设置环境变量
ENV SPRING_PROFILES_ACTIVE prod
  
# 定义容器启动时执行的命令  
ENTRYPOINT ["java","-jar","/app/ai-springboot.jar"]

环境变量也可以运行命令式时指定: -e SPRING_PROFILES_ACTIVE=prod 设置了环境变量SPRING_PROFILES_ACTIVE( spring.profiles.active )的值为prod

10.2 构建镜像

在Dockerfile所在的目录下,执行以下命令来构建镜像:

shell 复制代码
docker build -t ai-app .
  • -t ai-app 指定了镜像的名称为 ai-app ,仓库在本地
  • . 指定了构建上下文的路径,这里是当前目录
shell 复制代码
docker build -t ai-app .
[+] Building 38.8s (8/8) FINISHED                    docker:default
 => [internal] load build definition from Dockerfile           0.0s
 => => transferring dockerfile: 552B                           0.0s
 => [internal] load metadata for docker.io/library/openjdk:1  16.4s
 ........
 => [2/3] WORKDIR /app                                         0.0s
 => [3/3] COPY ai-springboot.jar /app                          0.2s
 => exporting to image                                         0.4s
 => => exporting layers                                        0.4s
 => => writing image sha256:2eaf1552bb3fa483258d0c617b0770f4d  0.0s
 => => naming to docker.io/library/ai-app                      0.0s

10.3 运行容器

shell 复制代码
docker run -d -p 9000:9000 ai-app

-d表示以守护进程模式运行容器
-p 9000:9000表示将容器的9000端口映射到宿主机的9000端口(前面一个是宿主机端口)。-p 9001:9000 则需要使用http://IP:9001访问

10.4 验证

可以通过访问http://IP:9000来验证应用是否正常运行

相关推荐
内核程序员kevin3 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
朝九晚五ฺ7 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream7 小时前
Linux的桌面
linux
xiaozhiwise8 小时前
Makefile 之 自动化变量
linux
Kkooe8 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒9 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
意疏10 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
虚拟网络工程师10 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
墨鸦_Cormorant10 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker