说明:
容器迁移原则:
- 拷贝挂载数据,并在新宿主机上恢复
- 导出容器使用的镜像,并在新宿主机上导入
- 使用原有镜像+挂载数据启动服务,完成迁移
- 当数据被保存在容器内时(mssql),只能导出容器完成迁移。后续要求研发配合修改为挂载数据方式。
- 迁移的相关服务,docker启动命令整理见下
迁移使用命令
1. 镜像(Image)
- 导出镜像
bash
docker save -o 导出包名.tar 镜像名
或
bash
docker save 镜像名 > 导出包名.tar
- 导入镜像
bash
docker load -i 已导出包名.tar
或
bash
docker load < 导出包名.tar
2. 容器(Container)
- 导出容器
bash
docker export -o 导出包名.tar 容器名
或
bash
docker export 容器名 > 导出包名.tar
- 导入容器名
bash
docker import -i 已导出包名.tar
或
bash
docker import < 导出包名.tar
- 启动容器
bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
详见 docker run --help
官方文档: https://docs.docker.com/reference/cli/docker/container/run/
3. 卷(Volume)
- 创建卷
bash
docker volume create 卷名
- 查看卷
bash
docker volume inspect 卷名
迁移启动命令
1.启动redis
- 查看redis旧容器上挂载路径
- docker inspect redis-jungong --format='{{ .Mounts}}'
bash
docker inspect redis-jungong --format='{{ .Mounts}}'
[{volume 3c78dd46f41427c146d60a22a930cfc52819e4f3b1752f502ef9af6d5b6e0904 /var/lib/docker/volumes/3c78dd46f41427c146d60a22a930cfc52819e4f3b1752f502ef9af6d5b6e0904/_data /data local true }]
- 创建卷,迁移dump.rdb
我检查了redis旧容器中的key,里面只有1个测试key,可以不用拷贝。
bash
docker volume create redis-vol
- 查看卷的存储路径
bash
docker inspect redis-vol
[
{
"CreatedAt": "2024-04-14T11:18:34+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/redis-vol/_data",
"Name": "redis-vol",
"Options": null,
"Scope": "local"
}
]
- 启动容器
bash
docker run -d \
--name redis \
--restart=always \
-p 6379:6379 \
--mount type=volume,src=redis-vol,dst=/data \
redis:latest
- 建议启动容器,增加访问密码
bash
docker run -d \
--name redis \
--restart=always \
-p 6379:6379 \
--mount type=volume,src=redis-vol,dst=/data \
redis:latest --requirepass yourpassword
-服务端口
192.168.2.132:6379
2.启动mysql
2.1 迁移235上的mysql
- 增加传入密码 -e MYSQL_ROOT_PASSWORD,后续服务调用会用。
javascript
docker run -d --name mysql \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=yourpassword\
-v /data/mysql/my.cnf:/etc/my.cnf:ro \
-v /data/mysql/config:/etc/mysql/conf.d:rw \
-v /etc/timezone:/etc/timezone:rw \
-v /data/mysql/data:/var/lib/mysql:rw \
-v /etc/localtime:/etc/localtime:rw \
mysql:latest
注意:增加了/data/mysql/my.cnf下一个配置,防止应用连接数据库时被拒
bash
# 加入最大连接错误数量,默认是100
max_connect_errors = 1000
2.2 迁移236上的mysql
236上的mysql是build生成的,不确定修改内容,所以采用容器导出方式迁移
- 创建挂载卷
bash
docker volume create mysql-jg
- 查看挂载卷目录
bash
docker volume inspect mysql-jg
[
{
"CreatedAt": "2024-04-14T13:46:01+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql-jg/_data",
"Name": "mysql-jg",
"Options": null,
"Scope": "local"
}
]
- 迁移旧容器挂载卷下文件至新宿主机/var/lib/docker/volumes/mysql-jg/_data(mysql-jg卷对应的目录)
bash
ll /var/lib/docker/volumes/mysql-jg/_data
总用量 106992
drwxr-x---. 2 polkitd input 48 4月 11 11:50 11
-rw-r-----. 1 polkitd input 56 4月 11 10:16 auto.cnf
-rw-r-----. 1 polkitd input 3040348 4月 11 10:16 binlog.000001
-rw-r-----. 1 polkitd input 16065 4月 11 11:50 binlog.000002
-rw-r-----. 1 polkitd input 32 4月 11 10:16 binlog.index
-rw-------. 1 polkitd input 1676 4月 11 10:16 ca-key.pem
-rw-r--r--. 1 polkitd input 1108 4月 11 10:16 ca.pem
-rw-r--r--. 1 polkitd input 1108 4月 11 10:16 client-cert.pem
-rw-------. 1 polkitd input 1680 4月 11 10:16 client-key.pem
-rw-r-----. 1 polkitd input 196608 4月 11 11:51 #ib_16384_0.dblwr
-rw-r-----. 1 polkitd input 8585216 4月 11 10:16 #ib_16384_1.dblwr
-rw-r-----. 1 polkitd input 5715 4月 11 10:16 ib_buffer_pool
-rw-r-----. 1 polkitd input 12582912 4月 11 11:50 ibdata1
-rw-r-----. 1 polkitd input 12582912 4月 11 10:16 ibtmp1
drwxr-x---. 2 polkitd input 4096 4月 11 10:16 #innodb_redo
drwxr-x---. 2 polkitd input 187 4月 11 10:16 #innodb_temp
drwxr-x---. 2 polkitd input 143 4月 11 10:16 mysql
-rw-r-----. 1 polkitd input 32505856 4月 11 11:50 mysql.ibd
-rw-r--r--. 1 root root 6422669 4月 14 13:46 mysql_jg_data.tar
drwxr-x---. 2 polkitd input 8192 4月 11 10:16 performance_schema
-rw-------. 1 polkitd input 1680 4月 11 10:16 private_key.pem
-rw-r--r--. 1 polkitd input 452 4月 11 10:16 public_key.pem
-rw-r--r--. 1 polkitd input 1108 4月 11 10:16 server-cert.pem
-rw-------. 1 polkitd input 1680 4月 11 10:16 server-key.pem
drwxr-x---. 2 polkitd input 28 4月 11 10:16 sys
-rw-r-----. 1 polkitd input 16777216 4月 11 11:51 undo_001
-rw-r-----. 1 polkitd input 16777216 4月 11 11:51 undo_002
- 启动容器
因为3306端口被占用了,所以使用13306作为监听端口
bash
docker run -d \
--name mysql-jg \
--restart=always \
-p 13306:3306 \
--mount type=volume,src=mysql-jg,dst=/var/lib/mysql \
mysql-jg:20240414 \
docker-entrypoint.sh mysqld
说明:如果迁移容器不能满足要求,就只能使用docker commit命令生成旧容器镜像,再迁移。
3.启动nacos
- 之前nacos旧容器启动采用非持久化保存数据方式,所以里面的数据无法保留下来。我看了旧nacos里只有几条测试数据,可以不用管。
- nacos新容器,改成mysql持久化存储数据的方式。并在启动配置中增加了数据挂载和配置文件挂载
- 修改/mydata/nacos/conf/application.properties,增加鉴权内容。新版不增加无法启动服务nacos
javascript
vi /mydata/nacos/conf/application.propertiess
- 修改后的配置文件。
- 官方文档:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
- 增加了几个鉴权key,配置文件里加了注释。
bash
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:012345678901234567890123456789012345678901234567890123456789key}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:identitykey}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:identityvalue}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
##### 鉴权说明 https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,在2.2.0.1后无默认值
#nacos.core.auth.plugin.nacos.token.secret.key=012345678901234567890123456789012345678901234567890123456789key
# useragent白名单的身份识别key
# nacos.core.auth.server.identity.key=identitykey
# 用于替换useragent白名单的身份识别value
# nacos.core.auth.server.identity.value=identityvalue
# 同nacos.core.auth.plugin.nacos.token.secret.key
# nacos.core.auth.default.token.secret.key=012345678901234567890123456789012345678901234567890123456789key
#是否开启鉴权功能
nacos.core.auth.enabled=true
### 1.4以上版本,关闭使用user-agent判断服务端请求并放行鉴权的功能,系统默认值是false
nacos.core.auth.enable.userAgentAuthWhite=false
- 启动容器命令
- mysql 的参数是启动容器时传入的,参数内容与连接的mysql服务器保存一致。
bash
docker run -d -p 8848:8848 -p 9848-9849:9848-9849 \
--name nacos \
--restart=always \
-e MODE=standalone \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_PASSWORD=yourpassword\
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.2.132 \
-v /mydata/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties \
-v /mydata/nacos/data:/home/nacos/data \
-v /mydata/nacos/logs:/home/nacos/logs \
nacos/nacos-server
- 访问地址
- http://192.168.2.132:8848/nacos
- 系统安装完成后默认用户名:nacos
- 系统安装完成后默认密码:nacos
4.启动onlyoffice
- 创建3个卷,启动时挂载。需要将旧容器下卷中的数据迁移至创建的3个卷中
javascript
docker volume create onlyoffice_custom
docker volume create onlyoffice_rabbitmq
docker volume create onlyoffice_redis
- 启动容器
javascript
docker run -d -p 9099:80 \
--name onlyoffice\
--restart=always \
-v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \
-v onlyoffice_custom:/usr/share/fonts/truetype/custom \
-v /app/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice \
-v /app/onlyoffice/DocumentServer/db:/var/lib/postgresql \
-v onlyoffice_rabbitmq:/var/lib/rabbitmq \
-v onlyoffice_redis:/var/lib/redis \
-v /app/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \
onlyoffice/documentserver
5.启动mssql
- mssql没有挂载卷,数据都存在容器里,只能导出容器生成镜像。
- 建议从旧容器中备份mssql数据库,然后新容器挂载数据卷后恢复数据,需要与需求方沟通。
- 启动容器时没有传入密码,需要需求方提供后重启。
javascript
docker run -d --name sql1 -p 1433:1433 mcr.microsoft.com/mssql/server:2022-container /opt/mssql/bin/permissions_check.sh /opt/mssql/bin/sqlservr
说明:如果迁移容器不能满足要求,就只能使用docker commit命令生成旧容器镜像,再迁移。
- 建议的启动方式
bash
#创建mssql2022文件夹
sudo mkdir /opt/mssql2022
bash
#进入/opt目录更改mssql2022文件家权限,这里不设置权限,sqlserver 启动会失败
sudo chmod 777 mssql2022
bash
#运行容器 "MSSQL_PID=Enterprise" 默认Developer(开发版) Enterprise(企业版)或Express(免费专用版)EnterpriseCore(企业核心版),MSSQL_AGENT_ENABLED=true 表示开启代理
docker run -d \
--name sqlserver2022 \
-e "ACCEPT_EULA=Y" \
-e "MSSQL_SA_PASSWORD=password" \
-e "MSSQL_PID=Enterprise" \
-e "MSSQL_COLLATION=Chinese_PRC_BIN" \
-e "MSSQL_AGENT_ENABLED=true"\
-e TZ=Asia/Shanghai \
-p 1433:1433
-v /opt/mssql2022:/var/opt/mssql \
-v /opt/mssql2022_backup:/opt/mssql2022_backup \
mcr.microsoft.com/mssql/server:2022-latest
6.启动minio
- 注意:console的port必须在映射的port中
javascript
docker run -d -p 9002:9002 -p 9003:9003 \
--name minio \
--restart=always \
-v /usr/local/minio/data:/data \
-v /usr/local/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=yourpassword" \
minio/minio server /data --console-address ":9003"
7.启动gitlab
- 启动容器
javascript
docker run -d \
--name gitlab \
--restart=always \
-p 8022:22 -p 80:80 -p 8443:443 \
-v /home/gitlab/etc:/etc/gitlab \
-v /home/gitlab/log:/var/log/gitlab \
-v /home/gitlab/data:/var/opt/gitlab \
twang2218/gitlab-ce-zh
说明: 服务已启动,需要研发登录确认数据
- 访问地址
http://192.168.2.132
迁移常见问题参见: 迁移docker部署的GitLab
8.启动confluence
- 启动容器
javascript
docker run -d \
--name wiki \
-p 8090:8090 \
-v /data/confluence/data:/var/atlassian/application-data/confluence:rw \
-v /data/confluence/atlassian-agent.jar:/var/atlassian/atlassian-agent.jar:rw \
-v /etc/timezone:/etc/timezone:rw \
-v /data/confluence/mysql-connector-j-8.0.33.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-j-8.0.33.jar:rw \
-v /etc/localtime:/etc/localtime:rw \
atlassian/confluence-server
说明:旧confluence没有初始化,未启用
9.启动禅道
javascript
docker run -d \
--name zentao2 \
-p 9090:80 \
-p 3307:3307 \
--restart=always \
-e MYSQL_INTERNAL=true \
-e MYSQL_ROOT_PASSWORD=yourpassword\
-v /public/zentao:/data \
-v /public/zentao/zentaopms:/www/zentaopms \
-v /public/zentao/mysqldata:/var/lib/mysql \
easysoft/zentao:latest
10.启动nginx
- 启动容器
javascript
docker run -d \
-p 8085:80 \
-p 8086:8086 \
-p 8089:8089 \
--name nginx \
--restart=always \
-v /public/nginx/log:/var/log/nginx \
-v /public/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /public/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /public/nginx/html:/usr/share/nginx/html \
-v /public/nginx/conf/xunku.org.pem:/usr/share/web/ssl/xunku.org.pem:ro \
-v /public/nginx/conf/xunku.org.key:/usr/share/web/ssl/xunku.org.key:ro \
nginx:latest