在内网部署docker工程总结

前言

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

  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 [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的语法,需要修改三个地方:

  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
	```

你可能感兴趣的:(docker,容器,运维)