windows安装linux部署docker服务全过程

windows安装linux

https://blog.csdn.net/laterstage/article/details/131460688

如果不能查看linux ip信息,需要安装:yum install net-tools.x86_64 -y

linux安装Docker

随着容器技术的兴起,Docker 已经成为了最为流行的容器引擎。它可以快速构建、部署、运行应用程序,并且具有高度的灵活性和可移植性。在 Linux 环境下安装 Docker 非常容易,本文将向您介绍如何在 Linux 上安装 Docker。

步骤1:检查系统是否满足要求

在安装 Docker 之前,我们需要检查当前的 Linux 系统版本是否满足要求。Docker 仅支持 64 位的操作系统,而且内核版本需要在 3.10 或以上。可以通过运行以下命令来检查内核版本:

uname -r

如果您的系统内核版本低于3.10,那么您需要升级到较新的版本。

步骤2:卸载旧版本的 Docker

如果您之前安装过旧版本的 Docker,您需要卸载它们。可以运行以下命令卸载:

sudo apt-get remove docker docker-engine docker.io containerd runc

步骤3:安装 Docker CE

可以使用官方安装脚本来安装 Docker CE。您可以使用以下命令将该脚本下载到您的系统:

curl -fsSL https:``//get.docker.com -o get-docker.sh

运行以下命令以启动 Docker 安装:

sudo sh get-docker.sh

该命令将下载并安装 Docker CE,以及必要的依赖项和工具。安装程序应该自动将 Docker 服务设置为 Linux 系统引导项之一,并启动 Docker 服务。

步骤4:验证 Docker 安装

完成安装后,需要验证 Docker 是否正确安装。可以运行以下命令来验证安装:

sudo docker run hello-world

如果 Docker 正确安装,您将看到以下输出:

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

步骤5:使用非 root 用户运行 Docker

为了更加安全地使用 Docker,我们建议您不要在 root 用户下运行 Docker。可以创建一个名为 docker 的组,并将非 root 用户添加到该组中,以允许该用户管理 Docker。此外,还可以设置 Docker 守护进程,以仅接受通过 Unix 套接字访问 Docker API的请求。可以运行以下命令来完成操作:

sudo groupadd docker``sudo usermod -aG docker ``$USER``sudo systemctl restart docker

步骤6:使用 Docker

现在,您已经成功将 Docker 安装在 Linux 系统上,并为非 root 用户设置了访问权限。您可以在 Docker Hub 上查找和下载任何容器镜像,并使用以下命令运行容器:

sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

例如,如果您想运行 ubuntu 镜像并在其中运行 bash 终端,则可以使用以下命令:

sudo docker run -it ubuntu /bin/bash

以上命令将启动一个名为 ubuntu 的容器,并在其中启动一个交互式 shell。此时,您可以在其中执行任何命令。

可以使用以下命令列出当前正在运行的容器:

sudo docker ps

如果要停止运行的容器,请使用以下命令:

sudo docker stop [CONTAINER ID]

注意事项

  • 在安装 Docker 过程中,安装脚本将添加 Docker apt 仓库,并使用 apt 包管理器安装 Docker。
  • Docker 依赖于 cgroups 和 namespace 功能,因此需要启用 Linux 内核中的这些功能才能正常运行。
  • 如果您使用的是 Ubuntu 系统,则可以访问 Canonical 的 Docker 安装文档,以获取详细的安装说明和建议。
  • 如果您正在使用 Red Hat Enterprise Linux 或 CentOS 等基于 RPM 包管理器的系统,则可以访问 Docker 的 RHEL 安装文档,以获取详细的安装说明和建议。

关闭防火墙

systemctl disable firewalld

systemctl stop firewalld

Docker部署Mysql8.0

1.可能会出现报错:网络不通或者拉取镜像失败

解决方案
(1)查看DNS客户机的配置文件

cat /etc/resolv.conf

出现了报错信息中的ip
猜测应该是这个DNS服务器出现了问题

(2)修改文件

vim /etc/resolv.conf

注释掉:nameserver 192.168.100.2
新增DNS:nameserver 114.114.114.114 nameserver 8.8.8.8
请添加图片描述

2.拉取镜像

docker pull mysql:8.0.20

3.拉取镜像加速:

使用docker的时候,总是需要去search镜像,使用国外的源下载太慢,还有诸多的限制,无意中发现可以使用阿里云进行加速,实测有用,废话少说,操作如下:

1.打开阿里云控制台,没有的可以用淘宝账号或者支付宝账号直接登录

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

实例:

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://8sbrqqbm.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

提醒:阿里云其实也很慢最好用如下推荐:

Docker中国区官方镜像
https://registry.docker-cn.com

网易
http://hub-mirror.c.163.com

ustc 
https://docker.mirrors.ustc.edu.cn

中国科技大学
https://docker.mirrors.ustc.edu.cn

安装 docker-compose(redis、mysql 、项目)

安装插件

yum update
yum install docker-compose-plugin# 安装完成后查看版本号
docker compose version

多个服务配置文件(过于专业,可以看下面的案例即可):

# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"

# 定义服务
services:
  # 为project定义服务
  redis:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: redis:5.0.8
    # 配置端口 - "宿主机端口:容器暴露端口"
    ports:
      - "6379:6379"
    # 配置容器连接的网络,引用顶级 networks 下的条目(就是最下面配置的networks(一级目录))
    networks:
      network_name:
        # 为单redis创建别名, REDIS_URL标记为redis服务的地址. (不配置aliases也可以, 这样就通过定义的服务名: redis链接)
        aliases:
          - REDIS_URL
    # 挂载
    volumes:
      - "/docker/redis/conf/redis.conf:/etc/redis/redis.conf"
      - "/docker/redis/data:/data"
# 容器总是重新启动
    restart: always
    # 相当于执行一些命令
    command:
      redis-server /etc/redis/redis.conf --appendonly yes
    # 指定一个自定义容器名称,而不是生成的默认名称。
    container_name: redis
    # 使用该参数,container内的root拥有真正的root权限。
    privileged: true

  db:
    image: mysql:8.0.33
    ports:
      - "3306:3306"
    # 添加环境变量
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    volumes:
      - "/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
      - "/docker/mysql/logs:/var/log/mysql"
      - "/docker/mysql/data:/var/lib/mysql"
      - "/docker/mysql/sql/init.sql:/docker-entrypoint-initdb.d/init.sql"
      - "/etc/localtime:/etc/localtime"
    networks:
      network_name:
        aliases:
          - MYSQL_URL
    restart: always
    command: --init-file /docker-entrypoint-initdb.d/init.sql
    container_name: mysql
    privileged: true

  project-name:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: 9c7a54a9a43c
    # 构建镜像
    build:
      # 指定项目的地址
      context: /root/docker_mysql_redis
      # 指定Dockerfile
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    # 从文件添加环境变量
    env_file:
      - /root/environment.env
    networks:
      network_name:
        aliases:
          - PROJECT_URL
    privileged: true
    restart: always
    container_name: hello-project

# ........可以继续添加


networks:
  # bridge:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信
  network_name:
    driver: bridge
注意:这些命令需要在 compose的文件目录下执行才可以

# 创建容器并启动 docker compose up
# 停止并删除容器 docker compose down
# 创建容器并后台启动 docker compose up -d
# 容器全部启动 docker compose start
# 仅启动abbix-server服务对应的容器 docker-compose stop zabbix-server
# 容器全部停止 docker compose stop
# 仅停止zabbix-server服务对应的容器 docker compose stop zabbix-server
# 容器全部重启 docker compose restart
# 要注意端口冲突的问题,指定的services不应该有ports属性 docker compose scale zabbix-java-gateway=3

参考示例(重要):

# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"

# 定义服务
services:
  # 为project定义服务
  redis:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: redis:5.0.8
    # 配置端口 - "宿主机端口:容器暴露端口"
    ports:
      - "6379:6379"
    # 挂载
    volumes:
      - "/jcdata/redis5/conf/redis.conf:/etc/redis/redis.conf"
      - "/jcdata/redis5/data:/data"
    # 容器总是重新启动
    restart: always
    # 相当于执行一些命令
    command:
      redis-server /etc/redis/redis.conf --appendonly yes
    # 指定一个自定义容器名称,而不是生成的默认名称。
    container_name: redis
    # 使用该参数,container内的root拥有真正的root权限。
    privileged: true

  db:
    image: mysql:8.0.33
    container_name: mysql8
    privileged: true
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: csh
      MYSQL_PASS: 123456
      TZ: Asia/Shanghai
    command:
      --wait_timeout=28800
      --interactive_timeout=28800
      --max_connections=1000
      --default-authentication-plugin=mysql_native_password
    volumes:
      - "/jcdata/mysql8/data:/var/lib/mysql"
      - "/jcdata/mysql8/config/my.cnf:/etc/mysql/my.cnf"

my.cnf

# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_log_file_size=256M
max_allowed_packet=64M
max_connections=1024
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[client]
default-character-set=utf8mb4

项目参考案例:

project-name:
    image: project-name-iamge
    container_name: project-name
    restart: always
    privileged: true
    volumes:
      - /data/app/logs/project-name/:/jcdata/logs/
      - /etc/localtime:/etc/localtime:ro
    environment:
      - CFG_NS=1bfa8e1d-6324-4469-8f6d-4ee7b12c13a4
      - CFG_ADDR=192.168.0.35
      - NACOS_REG=true
    ports:
    	# 对外IP:容器内部ip
      - "8084:8080"

迁移 Docker 镜像到另一个 Linux 系统

docker images

docker save -o <文件名>.tar <镜像名称>:<标签> (镜像名称)

docker load -i <文件名>.tar 

开启Docker远程访问

[root@docker]# vim /lib/systemd/system/docker.service
#修改execstart这行
execstart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock
# 重新加载配置文件
[root@idocker]# systemctl daemon-reload   
# 重启服务
[root@docker]# systemctl restart docker.service
# 查看端口是否开启
[root@docker]# netstat -nlpt
# 直接curl看是否生效
[root@docker]# curl http://127.0.0.1:2375/info

ideadocker插件

image

将springboot项目制作成镜像

1.参考文档:https://blog.csdn.net/linLearn/article/details/123426777
2.pom文件
<build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
                <mainClass>com.example.TestDemoApplication</mainClass>
            </configuration>
        </plugin>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <!--将插件绑定在某个phase执行-->
            <executions>
                <execution>
                    <id>build-image</id>
                    <!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!--指定生成的镜像名-->
                <imageName>csh/${project.artifactId}</imageName>
                <!--指定标签-->
                <imageTags>
                    <imageTag>latest</imageTag>
                </imageTags>
                <!-- 指定 Dockerfile 路径  ${project.basedir}:项目根路径下-->
                <dockerDirectory>${project.basedir}</dockerDirectory>
                <!--指定远程 docker api地址-->
                <dockerHost>http://192.168.1.5:2375</dockerHost>
                <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <!--jar 包所在的路径  此处配置的 即对应 target 目录-->
                        <directory>${project.build.directory}</directory>
                        <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
                        <include>${project.build.finalName}.war</include>
                    </resource>
                </resources>
                <!-- 以下两行是为了docker push到DockerHub使用的。 -->
                <serverId>docker-hub</serverId>
                <registryUrl>https://index.docker.io/v1</registryUrl>
            </configuration>
        </plugin>
    </plugins>
</build>
3.根目录下文件 DockerFile
# 指定基础镜像
FROM java:8
# 维护者信息
MAINTAINER csh
# 用于指定持久化目录
VOLUME /tmp
# 将本地文件添加到容器中(这时是打包到本地项目中的target目录下,因为jar有个前缀是target)
ADD target/testdemo-0.0.1-SNAPSHOT.jar testdemo.jar
#ADD target/config config
#COPY target/lib
#ADD target/conf
# 指定于外界交互的端口
EXPOSE 8081
#设置时区 run后面
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

# 配置容器,使其可执行化
#ENTRYPOINT exec java -Xms512m -Xmx512m -jar /app.jar
ENTRYPOINT exec java $JAVA_OPTS -jar -Duser.timezone=GMT+08 /testdemo.jar

ENV LC_ALL en_US.UTF-8
4.部署镜像到linux

image

5.linux查看镜像

image

idea制作镜像的另一种方式

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                    <mainClass>com.example.helloworld.HelloworldApplication</mainClass>
                </configuration>
            </plugin>
            <!-- docker插件-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <!-- 远程Docker的地址 -->
                    <dockerHost>http://192.168.0.126:2375</dockerHost>
                    <!-- 镜像名称、前缀、项目名 -->
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <baseImage>java:8</baseImage>
                    <!--作者-->
                    <maintainer>119@qq.com</maintainer>
                    <!--命令行-->
                    <workdir>/ROOT</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <entryPoint>["java", "-jar", "${project.artifactId}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!-- 表示的target文件夹 -->
                            <directory>${project.build.directory}</directory>
                            <!-- 表示打出来的JAR包-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

命令:

第一步:mvn clean package -DskipTests
第二步:找到docker插件执行 docker build

image

在linux环境下制作镜像(我一般用这个,如果内网的话可能行不通)

1.上传jar和新建一个Dockerfile文件

image

2.编辑Dockerfile文件

#FROM java:8
FROM openjdk:8
# 维护者信息
MAINTAINER csh
# 用于指定持久化目录
VOLUME /tmp
# 将本地文件添加到容器中(这时是打包到本地项目中的target目录下,因为jar有个前缀是target)
ADD helloworld-0.0.1-SNAPSHOT.jar helloworld.jar
# 指定于外界交互的端口
EXPOSE 8081
#设置时区 run后面
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

# 配置容器,使其可执行化
ENTRYPOINT exec java $JAVA_OPTS -jar -Duser.timezone=GMT+08 /helloworld.jar

ENV LC_ALL en_US.UTF-8

3.制作镜像命令

docker build -t helloworld .

第一次制作可能比较时间比较长,需要下载openjdk,耐心等待

posted @ 2023-09-15 00:52  土木转行的人才  阅读(194)  评论(0编辑  收藏  举报