docker容器迁移操作记录
说明:
容器迁移原则:
- 拷贝挂载数据,并在新宿主机上恢复
- 导出容器使用的镜像,并在新宿主机上导入
- 使用原有镜像+挂载数据启动服务,完成迁移
- 当数据被保存在容器内时(mssql),只能导出容器完成迁移。后续要求研发配合修改为挂载数据方式。
- 迁移的相关服务,docker启动命令整理见下
迁移使用命令
1. 镜像(Image)
(图片来源网络,侵删)
- 导出镜像
docker save -o 导出包名.tar 镜像名
或
docker save 镜像名 > 导出包名.tar
- 导入镜像
docker load -i 已导出包名.tar
或
docker load
2. 容器(Container)
- 导出容器
docker export -o 导出包名.tar 容器名
或
docker export 容器名 > 导出包名.tar
- 导入容器名
docker import -i 已导出包名.tar
或
docker import
- 启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 详见 docker run --help 官方文档: https://docs.docker.com/reference/cli/docker/container/run/
3. 卷(Volume)
- 创建卷
docker volume create 卷名
- 查看卷
docker volume inspect 卷名
迁移启动命令
1.启动redis
- 查看redis旧容器上挂载路径
- docker inspect redis-jungong --format=‘{{ .Mounts}}’
docker inspect redis-jungong --format='{{ .Mounts}}' [{volume 3c78dd46f41427c146d60a22a930cfc52819e4f3b1752f502ef9af6d5b6e0904 /var/lib/docker/volumes/3c78dd46f41427c146d60a22a930cfc52819e4f3b1752f502ef9af6d5b6e0904/_data /data local true }]
- 创建卷,迁移dump.rdb
我检查了redis旧容器中的key,里面只有1个测试key,可以不用拷贝。
docker volume create redis-vol
- 查看卷的存储路径
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" } ]
- 启动容器
docker run -d \ --name redis \ --restart=always \ -p 6379:6379 \ --mount type=volume,src=redis-vol,dst=/data \ redis:latest
- 建议启动容器,增加访问密码
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,后续服务调用会用。
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下一个配置,防止应用连接数据库时被拒
# 加入最大连接错误数量,默认是100 max_connect_errors = 1000
2.2 迁移236上的mysql
236上的mysql是build生成的,不确定修改内容,所以采用容器导出方式迁移
- 创建挂载卷
docker volume create mysql-jg
- 查看挂载卷目录
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卷对应的目录)
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作为监听端口
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
vi /mydata/nacos/conf/application.propertiess
- 修改后的配置文件。
- 官方文档:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
- 增加了几个鉴权key,配置文件里加了注释。
# 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服务器保存一致。
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个卷中
docker volume create onlyoffice_custom docker volume create onlyoffice_rabbitmq docker volume create onlyoffice_redis
- 启动容器
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
- 访问地址
http://192.168.2.132:9099
5.启动mssql
- mssql没有挂载卷,数据都存在容器里,只能导出容器生成镜像。
- 建议从旧容器中备份mssql数据库,然后新容器挂载数据卷后恢复数据,需要与需求方沟通。
- 启动容器时没有传入密码,需要需求方提供后重启。
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命令生成旧容器镜像,再迁移。
- 建议的启动方式
#创建mssql2022文件夹 sudo mkdir /opt/mssql2022
#进入/opt目录更改mssql2022文件家权限,这里不设置权限,sqlserver 启动会失败 sudo chmod 777 mssql2022
#运行容器 "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中
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"
- 访问地址
http://192.168.2.132:9003
7.启动gitlab
- 启动容器
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
- 启动容器
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没有初始化,未启用
- 访问地址
http://192.168.2.132:8090
9.启动禅道
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
- 访问地址
http://192.168.2.132:9090
10.启动nginx
- 启动容器
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
- 访问地址
http://192.168.2.132:8085
- 访问地址
- 启动容器
- 访问地址
- 访问地址
- 启动容器
- 访问地址
- 启动容器
- 访问地址
- 注意:console的port必须在映射的port中
- 建议的启动方式
- 访问地址
- 启动容器
- 创建3个卷,启动时挂载。需要将旧容器下卷中的数据迁移至创建的3个卷中
- 访问地址
- mysql 的参数是启动容器时传入的,参数内容与连接的mysql服务器保存一致。
- 启动容器命令
- 修改后的配置文件。
- 启动容器
- 迁移旧容器挂载卷下文件至新宿主机/var/lib/docker/volumes/mysql-jg/_data(mysql-jg卷对应的目录)
- 查看挂载卷目录
- 创建挂载卷
- 增加传入密码 -e MYSQL_ROOT_PASSWORD,后续服务调用会用。
- 建议启动容器,增加访问密码
- 启动容器
- 查看卷的存储路径
- 创建卷,迁移dump.rdb
- docker inspect redis-jungong --format=‘{{ .Mounts}}’
- 查看redis旧容器上挂载路径
- 查看卷
- 创建卷
- 启动容器
- 导入容器名
- 导出容器
- 导入镜像
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。