docker容器迁移操作记录

04-19 1280阅读

说明:

容器迁移原则:

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

迁移使用命令

1. 镜像(Image)

docker容器迁移操作记录
(图片来源网络,侵删)
  • 导出镜像
    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

                                      1. 之前nacos旧容器启动采用非持久化保存数据方式,所以里面的数据无法保留下来。我看了旧nacos里只有几条测试数据,可以不用管。
                                      2. 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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]