本次部署的内容主要包括:mysql,redis,nacos,java项目,前端项目,python项目。
首先在拥有网络环境的电脑上下载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下载并放到/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是自己下载之后上传的,其中版本问题是越新越好。
docker pull mysql:5.7
#有网络环境的机器
docker save mysql:5.7 -o ./mysql5.7.tar
#拷贝数据到工作机
scp ./mysql5.7.tar [email protected]:/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
:这个选项给予容器几乎与宿主机相同的权限,容器内的进程可以获取并操作宿主机的许多系统资源。这个选项在某些特殊情况下可能会很有用,比如你需要在容器中运行一些需要特殊权限的程序。然而,它也会带来安全风险,因为容器内的进程可以影响到宿主机的系统状态,甚至可能影响到宿主机的安全性。
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
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也是同样的安装逻辑,首先从另一台可以联网的机器下载镜像,然后导出导入镜像。
docker pull nacos/nacos-server
docker save nacos/nacos-server:latest -o /home/xxx/software/nacos.tar
scp /home/xxx/software/nacos.tar [email protected]:/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的语法,需要修改三个地方:
GENERATED BY DEFAULT AS IDENTITY
全局替换为: AUTO_INCREMENT
;usage
用 `` 符号包起来;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安装教程
通过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 INFILE
和SELECT ... 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 BY
和LINES TERMINATED BY
语句中指定这些字符。
设置容器自启动
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
```