docker容器迁移操作记录

说明:

容器迁移原则:

  1. 拷贝挂载数据,并在新宿主机上恢复
  2. 导出容器使用的镜像,并在新宿主机上导入
  3. 使用原有镜像+挂载数据启动服务,完成迁移
  4. 当数据被保存在容器内时(mssql),只能导出容器完成迁移。后续要求研发配合修改为挂载数据方式。
  5. 迁移的相关服务,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

  1. 之前nacos旧容器启动采用非持久化保存数据方式,所以里面的数据无法保留下来。我看了旧nacos里只有几条测试数据,可以不用管。
  2. nacos新容器,改成mysql持久化存储数据的方式。并在启动配置中增加了数据挂载和配置文件挂载
  • 修改/mydata/nacos/conf/application.properties,增加鉴权内容。新版不增加无法启动服务nacos
javascript 复制代码
vi  /mydata/nacos/conf/application.propertiess
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 

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

说明: 服务已启动,需要研发登录确认数据

迁移常见问题参见: 迁移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
相关推荐
dessler12 分钟前
Linux系统-ubuntu系统安装
linux·运维·云计算
向阳121818 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
荒Huang1 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
海阔天空_20131 小时前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能1 小时前
气爪在自动化装配线中是如何应用的?
运维·自动化
MonkeyKing_sunyuhua1 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林2 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€3 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘3 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
其乐无涯3 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器