在内网部署docker工程总结

2023-09-15 17:45:59

前言

本次部署的内容主要包括:mysql,redis,nacos,java项目,前端项目,python项目。

一 安装docker环境

首先在拥有网络环境的电脑上下载docker安装包,下载地址可以参考如下:

https://download.docker.com/linux/static/stable/x86_64/

下载完成之后,将安装包通过sftp等方式上传到要部署的机器上:

tar zxf docker-20.10.9.tgz
sudo cp docker/* /usr/bin/

然后注册docker services服务,进入/etc/systemd/system/ 目录,并创建 docker.service 文件,输入以下内容

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
  
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
  
[Install]
WantedBy=multi-user.target

启动docker

# 给docker.service文件添加执行权限
chmod +x /etc/systemd/system/docker.service
# 重新加载配置文件(每次有修改docker.service文件时都要重新加载下)
systemctl daemon-reload
# 启动
systemctl start docker
# 设置开机启动
systemctl enable docker.service
# 查看docker服务状态
[root@localhost system]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-06-28 00:54:47 PDT; 10s ago
Docs: https://docs.docker.com
Main PID: 45475 (dockerd)
CGroup: /system.slice/docker.service
├─45475 /usr/bin/dockerd --selinux-enabled=false --insecure-registry=10.1.20.150
└─45487 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
Jun 28 00:54:46 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:46.158519178-07:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd..." module=grpc
Jun 28 00:54:46 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:46.158525449-07:00" level=info msg="ClientConn switching balancer to "pick_first"" module=grpc
Jun 28 00:54:46 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:46.202943588-07:00" level=info msg="Loading containers: start."
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.021854086-07:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon...d IP address"
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.126281901-07:00" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.244251569-07:00" level=info msg="Loading containers: done."
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.264592112-07:00" level=info msg="Docker daemon" commit=a89b842 graphdriver(s)=overlay2 version=20.10.17
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.265027319-07:00" level=info msg="Daemon has completed initialization"
Jun 28 00:54:47 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.300116789-07:00" level=info msg="API listen on /var/run/docker.sock"
Hint: Some lines were ellipsized, use -l to show in full.
# 如上表示docker已安装成功

docker环境检查

docker info
[root@localhost system]# docker info
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.17
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc version: v1.1.2-0-ga916309f
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.624GiB
Name: localhost.localdomain
ID: ZHES:U53P:FOPX:QKRO:4PQE:BIKC:OEQJ:7VUS:NBUQ:U47D:R3QO:JKKX
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
10.1.20.150
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
docker version
[root@localhost system]# docker version
Client:
Version:           20.10.17
API version:       1.41
Go version:        go1.17.11
Git commit:        100c701
Built:             Mon Jun  6 22:56:42 2022
OS/Arch:           linux/amd64
Context:           default
Experimental:      true
Server: Docker Engine - Community
Engine:
Version:          20.10.17
API version:      1.41 (minimum version 1.12)
Go version:       go1.17.11
Git commit:       a89b842
Built:            Mon Jun  6 23:01:45 2022
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          v1.6.6
GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version:          1.1.2
GitCommit:        v1.1.2-0-ga916309f
docker-init:
Version:          0.19.0
GitCommit:        de40ad0

二、docker-compose安装

# docker-compose下载并放到/usr/local/bin/下面:
curl -L "https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 下载好docker-compose的前提下,拷贝到指定位置
sudo cp docker-compose /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
docker-compose -v
# 最后使用 docker-compose -v 命令测试是否安装成功(如果提示“没有那个文件或目录”可以重启下服务器再试试)

以上内容来源 Linux下 安装Docker
本人实测有效,其中docker-compose是自己下载之后上传的,其中版本问题是越新越好。

三、MySQL离线安装

  1. 从有网络环境的机器上获取MySQL镜像
docker pull mysql:5.7
  1. 导出镜像到指定机器
#有网络环境的机器
docker save  mysql:5.7 -o ./mysql5.7.tar
#拷贝数据到工作机
scp ./mysql5.7.tar xxx@192.168.20.4:/home/xxx/software/
#进入工作机指定目录,将文件转换成镜像文件
sudo docker load -i ./mysql5.7.tar

运行MySQL镜像

sudo docker run -p 3306:3306 --name mysql --restart=always --privileged=true \
-e LANG=C.UTF-8 \                      #设置容器内MySQL客户端支持中文
-v /home/xxx/software/mysql/log:/var/log/mysql \ #映射日志文件
-v /home/xxx/software/mysql/data:/var/lib/mysql \  #映射MySQL数据
-v /home/xxx/software/mysql/conf:/etc/mysql \  #映射配置信息
-v /etc/localtime:/etc/localtime:ro \  #同步宿主机和容器内时间 ro readonly
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • --restart=always:这个选项告诉 Docker 在以下任何情况下都要尝试重新启动容器:容器正常退出、容器出错退出、Docker 重新启动。这可以确保你的容器在出现问题或者系统重启后能够自动恢复运行。

  • --privileged=true:这个选项给予容器几乎与宿主机相同的权限,容器内的进程可以获取并操作宿主机的许多系统资源。这个选项在某些特殊情况下可能会很有用,比如你需要在容器中运行一些需要特殊权限的程序。然而,它也会带来安全风险,因为容器内的进程可以影响到宿主机的系统状态,甚至可能影响到宿主机的安全性。

  1. 创建my.cnf文件
    进入工作机映射的目录,编辑配置信息
cd /home/xxx/software/mysql/conf
sudo vi my.cnf
[client]

default-character-set=utf8mb4

[mysql]

default-character-set=utf8mb4

[mysqld]

# 设置东八区时区
default-time_zone = '+8:00'

explicit_defaults_for_timestamp = 1
# 设置密码验证规则,default_authentication_plugin参数已被废弃

# 改为authentication_policy

default_authentication_plugin=mysql_native_password
#authentication_policy=mysql_native_password

# 限制导入和导出的数据目录
# 为空,不限制导入到处的数据目录;
# 指定目录,必须从该目录导入到处,且MySQL不会自动创建该目录;
# 为NULL,禁止导入与导出功能
#secure_file_priv=/var/lib/mysql
secure_file_priv=

init_connect='SET collation_connection = utf8mb4_unicode_ci'

init_connect='SET NAMES utf8mb4'

character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci

skip-character-set-client-handshake

主要设置了时区,编码排序等参数信息。
4. 重启MySQL,查看容器信息

sudo docker restart mysql
sudo docker ps -a | grep mysql
  1. 进入MySQL客户端,添加账号密码和数据库信息
sudo docker exec -it mysql mysql -uroot -p
CREATE USER 'jianke'@'%' IDENTIFIED BY 'Jianke@2023';

create database gat_gs;

GRANT ALL PRIVILEGES ON gat_gs.* TO 'jianke'@'%';

@'%'意思是允许所有ip使用该用户远程登录;

四、Nacos离线安装

Nacos也是同样的安装逻辑,首先从另一台可以联网的机器下载镜像,然后导出导入镜像。

docker pull nacos/nacos-server
docker save nacos/nacos-server:latest -o /home/xxx/software/nacos.tar
scp /home/xxx/software/nacos.tar xxx@192.168.20.4:/home/xxx/software/
#进入工作机指定目录
sudo docker load -i ./nacos.tar
#检查Nacos镜像是否存在
sudo docker images | grep nacos

在上面建的MySQL中,新建Nacos用户和Nacos数据库,准备存储Nacos配置信息。

CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@2023';

create database nacos;

GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'%';

FLUSH PRIVILEGES;

建议先启动Nacos容器,进入容器获取对应建表语句之后删除容器,再进入MySQL进行建表,建完表之后,再从新启动容器。这样做的原因是:docker中的Nacos对应的版本和github上对应的Nacos建表语句不一样,会导致启动Nacos之后,所有的数据无法保存。

#先启动容器
sudo docker run --name nacos -p 8848:8848 -d nacos/nacos-server
#进入容器
sudo docker exec -it nacos bash
#进入指定文件夹
cd /home/nacos/conf
[root@bd9b3498ca52 conf]# ll
-rw-r--r-- 1  502 games  1224 Jun 18  2021 1.4.0-ipv6_support-update.sql
-rw-r--r-- 1 root root   2532 Jul 31  2021 application.properties
-rw-r--r-- 1  502 games 31156 Jul 15  2021 nacos-logback.xml
-rw-r--r-- 1  502 games  8795 Jun 18  2021 schema.sql
[root@bd9b3498ca52 conf]# cat schema.sql

获取到对应的建表语句,注意:此语句的语法会有一些问题,应该是默认使用了oracle的语法,需要修改三个地方:

  1. GENERATED BY DEFAULT AS IDENTITY全局替换为: AUTO_INCREMENT;
  2. usage用 `` 符号包起来;
  3. 将日期 1970-01-01 08:00:00.0 修改为 1970-01-01 08:00:01;

建议全局替换,将修改好的sql在对应nacos数据库执行完之后,删除之前创建的容器;

# 删除对应容器
sudo docker stop nacos
sudo docker rm nacos
# 重新启动容器
sudo docker run -d -p 8848:8848  -p 9848:9848 -p 9849:9849 \
-e MODE=standalone \
-e PREFER_HOST_MODE=ip \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.18.135 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=nacos \
-e MYSQL_SERVICE_PASSWORD=Nacos@2023 \
-e MYSQL_SERVICE_DB_NAME=nacos \
--name nacos \
--restart=always nacos:latest

在 Nacos 中,PREFER_HOST_MODE 是一个环境变量,它用于控制 Nacos 应该使用 IP地址还是主机名来识别和通信。

  • PREFER_HOST_MODE=ip:这意味着 Nacos 会使用 IP 地址作为节点的标识。在这种模式下,Nacos 会获取容器的 IP 地址,并使用这个 IP 地址进行通信。这在大多数情况下都可以正常工作,但是如果你的容器的 IP
    地址发生变化,可能会导致问题。

  • PREFER_HOST_MODE=hostname:这意味着 Nacos 会使用主机名作为节点的标识。在这种模式下,Nacos 会获取容器的主机名,并使用这个主机名进行通信。这在容器的 IP 地址可能发生变化的情况下特别有用,例如在某些 Kubernetes
    环境中。使用主机名可以保证即使 IP 地址发生变化,节点之间的通信仍然可以正常进行。

选择哪种模式取决于你的具体环境和需求。如果你不确定应该选择哪种模式,你可以尝试使用默认的设置(ip),并观察是否有任何问题。如果出现问题,你可以尝试切换到hostname 模式。

然后在指定地址(http://ip:8848/nacos)登录nacos,初始用户名密码为:nacos/nacos;

五、redis离线安装

步骤和上述基本相同,安装比较简单可以参考如下安装教程:
Redis安装教程

六、一些操作命令总结

1. MySQL数据库迁移

通过dump命令并没有成功,但花费了很长时间研究,决定还是记录一下:
本次是将MySQL从win server 2019的虚拟机迁到Ubuntu linux上。
在windows上执行备份:
进入到MySQL的安装bin目录:

.\mysqldump.exe -u root -p --default-character-set=utf8mb4 gdt_gs > .\backup-0914.sql

输入密码后,生成对应的备份文件。
将对应备份文件copy到工作机的MySQL映射data目录,进入到MySQL容器客户端中的对应backup-0914.sql目录:

mysql -u nengke -p --default-character-set=utf8mb4 gdt_gs < /var/lib/mysql/backup-0913.sql

这里出现了乱码问题。
确定了双方数据库的编码格式,对应表格式 都是utf8mb4, 也修改了windows中powershell的编码格式:

chcp 65001

但是最终导出的sql文件还是中文乱码,有机会再仔细研究一下。
本次通过将对应的工作机MySQL端口对外暴露,通过使用windows上的navicat软件分别连接两个数据库,在 工具 > 数据传输 中进行数据的迁移。

后来发现一些其他的方法,记录在此,留以后验证:

MySQL 数据库可以通过 LOAD DATA INFILESELECT ... INTO OUTFILE 语句来导入和导出 txt 文件中的数据。
导出数据到 txt 文件:

SELECT * INTO OUTFILE '/path/to/yourfile.txt' FIELDS TERMINATED
BY '\t'  LINES TERMINATED BY '\n' FROM your_table;

这个 SQL 语句会将 your_table 表中的所有数据导出到 /path/to/yourfile.txt文件中。每个字段由制表符 (\t) 分隔,每行由换行符 (\n) 分隔。
注意:你需要确保 MySQL 服务器对你指定的文件路径有写入权限。

从 txt 文件导入数据

LOAD DATA INFILE '/path/to/yourfile.txt' INTO TABLE your_table
FIELDS TERMINATED BY '\t'  LINES TERMINATED BY '\n'; 

这个 SQL 语句会将 /path/to/yourfile.txt 文件中的数据导入到 your_table
表中。它假设每个字段由制表符 (\t) 分隔,每行由换行符 (\n) 分隔。
注意:你需要确保 MySQL 服务器对你指定的文件路径有读取权限。
在使用这些命令时,你需要确保你的数据文件和你的 MySQL服务器的数据格式是一致的。例如,如果你的数据文件中使用的是其他字符来分隔字段或行,你需要在 FIELDS TERMINATED BYLINES TERMINATED BY 语句中指定这些字符。

2. docker的一些操作命令

设置容器自启动

docker update --restart=unless-stopped my_container

查看docker容器是否设置了自动启动

sudo docker inspect --format "{{.HostConfig.RestartPolicy.Name}}" redis

为docker设置代理

	# 1、创建docker.service目录
	mkdir -p /etc/systemd/system/docker.service.d

	# 2、创建HTTP&HTTPS代理文件
	vi /etc/systemd/system/docker.service.d/http-proxy.conf
	
	[Service]
	Environment="HTTP_PROXY=http://192.xxx.xxx.xxx:897" 
	Environment="HTTPS_PROXY=http://192.xxx.xxx.xxx:897"      
	Environment="NO_PROXY=localhost,127.0.0.0,xxx.xxx.xxx.xxx"
	
    # 3、重启docker
	sudo systemctl daemon-reload
	sudo systemctl restart docker
	```
更多推荐

spring:实现初始化动态bean|获取对象型数组配置文件

0.引言近期因为要完成实现中间件的工具包组件,其中涉及要读取对象型的数组配置文件,并且还要将其加载为bean,因为使用了spring4.3.25.RELEASE版本,很多springboot的相关特性无法支持,因此特此记录,以方便后续同学有相同情况可以参考1.获取对象型数组配置文件首先对象型数组配置文件如下所示:min

什么是实时操作系统(UCOS简介)

uC/OS-III官网:HomePage-WestonEmbeddedSolutions一、裸机与RTOS介绍下面我将从不同方面阐述裸机与试试操作系统的区别,从而进一步介绍裸机和实时操作系统定义:裸机:裸机指的是没有任何操作系统或软件层的硬件系统。在裸机状态下,程序可以直接访问硬件资源。实时操作系统:实时操作系统(RT

[Python进阶] 程序打包之Pyinstaller参数介绍

5.4Pyinstaller参数介绍5.4.1选项参数参数名说明-h、–help查看Pyinstaller所有命令的用法和帮助-v、–version查看当前Pyinstaller版本–distpathDIR设置dist位置,默认当前目录–workpathWORKPATH设置build位置,默认当前目录-y、–nocon

Java基础之lambda表达式(JDK1.8新特性)

文章目录Lambda表达式各种函数式接口Lambda的语法Lambda表达实例举例说明变量作用域处理lambda表达式变量作用域函数式接口使用实例1使用实例2使用示例3(集合排序)使用示例4(按照对象属性给list排序)使用示例4总结参考Lambda表达式Lambda表达式允许把函数作为一个方法的参数(函数作为参数传递

第十四届蓝桥杯省赛 Python B 组 D 题——管道(AC)

目录1.管道1.问题描述2.输入格式3.输出格式4.样例输入5.样例输出6.评测用例规模与约定2.解题思路3.AC_Code1.管道1.问题描述有一根长度为len\text{len}len的横向的管道,该管道按照单位长度分为len\text{len}len段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始

OpenHarmony应用开发—ArkUI组件集合

介绍本示例为ArkUI中组件、通用、动画、全局方法的集合。效果预览使用说明:1.点击组件、通用、动画、全局方法四个按钮或左右滑动切换不同视图。2.点击二级导航(如通用属性、通用事件等),若存在三级导航则展开三级导航(如Border边框、点击事件等);若不存在三级导航,则跳转至详情页面。若存在三级导航(如Border边框

从腾讯跳槽到英特尔,真实感受爆料

腾讯已经不像互联网公司了,之前国内的互联网还是要感谢一下外企,但是后面就开始卷起来了!在卷的环境里,食堂再好吃也没有用,因为是不会补回来的,而且英特尔已经是外企的天花板了知足吧!如果办公区很有生活的气息,那只能说明这些人根本没有生活,只为事业奋斗!还有很多网友询问英特尔的工作情况和面试情况“面试和工作都是英文吗?”“英

python爬虫:新兴动态渲染工具Playwright的简单介绍和教程

Playwright是一个用于自动化浏览器操作的工具,它支持Chromium、Firefox和WebKit浏览器,并提供了Python、JavaScript和其他编程语言的API。以下是Playwright的介绍和入门教程:1.安装Playwright首先,你需要安装Playwright。在Python中,你可以使用p

PCB布线之电源线干扰?|深圳比创达EMC

一客户画户外摄像头的板子,板子上电源线非常多,6层板,电源层已经被分割完了,还有2根电源线,没办法只能并行走线了,板子画完后发主管评审,主管让其在2根电源线中间走一根地线,该客户感觉没必要,因为地线太长了,太细了会形成天线,而且中间也没有地方可以打地孔。如下图:其实直流电源之间的影响有几个基本的优先原则:电源交流分量高

蓝牙技术|蓝牙轻松部署物联网项目,智能照明利用蓝牙特性快速发展

蓝牙物联网,特别是在低功耗蓝牙(BLE)普及的推动下,在物联网领域取得了显著增长和采用。由于低能耗和长时间使用小型电池的能力,BLE已成为许多物联网应用的首选无线技术。BLE使用与蓝牙相同的无线电频段,同样可以实现两个设备之间的数据交换。主要区别在于,BLE设备在连接之间的大部分时间都处于睡眠模式,并进行简短的通信会话

基于微信小程序的校园生活管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录前言运行环境学生微信端的主要功能有:管理员的主要功能有:具体实现截图视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利代码参考源码获取前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ

热文推荐