docker容器原样迁移完整过程(nignx例子)
  9OVhFvwkhDei 2023年12月13日 27 0


我们在测试服务器上,辛辛苦苦开发,各种配置好了服务,然后想着傻瓜式的迁移部署。接下来的就是干货了

过程描述:
为了体现一个完成性的描述,我们最初拉镜像开始,一直说到迁移后的服务正常运行。

接下来以nginx为例,正文开始

1.拉取镜像

获取镜像文件:
docker pull nginx

2.镜像文件对应

没有本地与容器关键性文件映射的容器,没有灵魂啊 亲
nginx 我们对应什么呢 通常就是 logs文件 html 即Web对应发布文件 etc配置文件
这些文件我们不知道在容器中的样子怎么办,先跑一个容器,进去探查一番

测试 跑一个容器:
docker run -d --name nginx01 -p 80:80  nginx
进入容器:
docker exec -it nginx01 bash
搜索nginx相关:
find / -name nginx
root@d95b2788b9cc:/# find / -name nginx
/etc/default/nginx
/etc/init.d/nginx
/etc/logrotate.d/nginx
/etc/nginx
find: '/proc/1/map_files': Operation not permitted
find: '/proc/24/map_files': Operation not permitted
find: '/proc/25/map_files': Operation not permitted
find: '/proc/26/map_files': Operation not permitted
find: '/proc/27/map_files': Operation not permitted
find: '/proc/28/map_files': Operation not permitted
find: '/proc/36/map_files': Operation not permitted
/usr/lib/nginx
/usr/sbin/nginx
/usr/share/doc/nginx
/usr/share/nginx
/var/cache/nginx
/var/log/nginx

进入这几个目录发现:

/usr/share/nginx目录下的html为映射文件目录

这几个目录中没有发现配置文件的踪影…

再次精准检索:
find / -name nginx.conf
root@d95b2788b9cc:/var/cache/nginx# find / -name nginx.conf
/etc/nginx/nginx.conf
find: '/proc/1/map_files': Operation not permitted
find: '/proc/24/map_files': Operation not permitted
find: '/proc/25/map_files': Operation not permitted
find: '/proc/26/map_files': Operation not permitted
find: '/proc/27/map_files': Operation not permitted
find: '/proc/28/map_files': Operation not permitted
find: '/proc/52/map_files': Operation not permitted

于是找到路配置文件目录。

我们宿主机建立映射文件 体检建立好目录(否则run的时候你想要的文件夹会意外的变成了文件)

/mydata/nginx/html/ 映射文件

对应容器文件夹 /usr/share/nginx/html/

把配置文件拿过来:
docker cp nginx01:/etc/nginx/nginx.conf /mydata/nginx/conf

/mydata/nginx/conf/ nginx.conf配置文件夹

对应容器文件夹/etc/nginx/nginx.conf

删除测试容器:
docker rm nginx01

我的习惯:跟目录mydata作为所有docker容器的映射大本营,建立一个nginx_test作为我们本次案例的根文件夹使用

基于我们收集的信息,run我们的目标容器
docker run 
--name nginx 
-p 8123:80 
-v /mydata/nginx_test/conf/nginx.conf:/etc/nginx/nginx.conf  
-v /mydata/nginx_test/html:/usr/share/nginx/html  
-d  nginx

这一步骤的整合思路就是:

docker run -p 80:80 --name nginx -d nginx:1.10
将容器内的配置文件拷贝到当前目录:docker container cp nginx:/etc/nginx .  别忘了后面的点
修改文件名称:mv nginx conf 把这个 conf 移动到/mydata/nginx 下
终止原容器:docker stop nginx
执行命令删除原容器:docker rm $ContainerId
创建新的 nginx;执行以下命令
docker run -p 8123:80 --name nginx \
-v /mydata/nginx_test/html:/usr/share/nginx/html \
-v /mydata/nginx_test/logs:/var/log/nginx \
-v /mydata/nginx_test/conf:/etc/nginx \
-d nginx:1.10
 给 nginx 的 html 下面放的所有资源可以直接访问;

注意:我们已经本机与容器对应好的文件,假设有删除或者重命名的需求。举个例子,我在 /mydata/nginx_test 目录下,放了一个project_vue文件夹,这个文件夹有好多项目文件,你想偷懒 rm -rf html删掉原来对应容器的html,mv project_vue ./html更新[project_vue]->[html]。这样你需要重启你的容器才可以完整映射对应,否则访问不到哦!docker restart nginx_test

成功效果如下:

docker容器原样迁移完整过程(nignx例子)_docker

3.导出容器

至此,你以完成了容器的配置和正常运行了,接下来我们去 /mydata/nignx_test/html下建立一个 index.html
在里面随便写点什么 作为你的记号,验证迁移后的正常

导出容器命令:

docker export <容器名/容器ID>  > xx.tar

执行:

docker export nginx_test > nginx_test.tar

注意:这样得到的是一个nginx_test.tar是带有你辛苦成果的镜像

4.镜像倒入新机器

docker import nginx_test.tar nginx_test1/nginx_test2:1.10
[root@localhost mydata]# docker import nginx_test.tar nginx_test1/nginx_test2:1.10
sha256:00e56e75740930bcc25e875107845c8b75f11faa50a4b5b2099165ae48e0bbc3

看一眼的镜像成功:

docker images
[root@localhost mydata]# docker ps
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED         STATUS             PORTS                                                                                                                                                 NAMES
45f6f259f6c8   6c3c2a225947                                           "docker-entrypoint.s…"   10 months ago   Up About an hour   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq

5.运行这个倒入镜像前的操作

在run运行时候需要在命令最后追加上 容器运行时的 command
否则报错:
docker: Error response from daemon: No command specified. 这个命令在哪里?
我们去刚才那台机器上:

docker ps --no-trunc
[root@localhost mydata]# docker ps --no-trunc
CONTAINER ID                                                       IMAGE                                                                     COMMAND                                                                                                                                                                                             CREATED         STATUS             PORTS                                                                                                                                                 NAMES
45f6f259f6c88a631d4719d76cf207c40dc7bf9a7ac58154e0e89e680dc80f42   sha256:6c3c2a225947fba15a76015eb596fd1e768b0fbec7829008e57d54d35cee039c   "docker-entrypoint.sh rabbitmq-server"                                                                                                                                                              10 months ago   Up About an hour   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq
64527788a0e4c817a00299090ebc8ffdbc8d93dda5410566fa1a1b8343aefc7d   registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g                      "/bin/sh -c '/home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/dbstart /home/oracle/app/oracle/product/11.2.0/dbhome_2 && tail -f /home/oracle/app/oracle/product/11.2.0/dbhome_2/startup.log'"   12 months ago   Up About an hour   0.0.0.0:1521->1521/tcp, :::1521->1521/tcp                                                                                                             oracle11
20665fe106fa94d8bd1c7145948a74d6cabf4393b7be9b77be6a77ac684bde10   nginx:1.10                                                                "nginx -g 'daemon off;'"                                                                                                                                                                            17 months ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp                                                                                                            nginx1.10
7445bc8c9e5e48f1ba914fe6091678fbda0835f00e4fb7a2ad1289aff14036e8   mysql:5.7                                                                 "docker-entrypoint.sh mysqld"                                                                                                                                                                       18 months ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                                                                                  mysql
6a850788e223148369f9bd01c04a8a319ab6eb65143eef331b0d0de94e42a5c3   elasticsearch:7.4.2                                                       "/usr/local/bin/docker-entrypoint.sh eswrapper"                                                                                                                                                     18 months ago   Up About an hour   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp                                                                  elasticsearch
fdf9a188cc6eaa56c661e67b213e01a946b592018789a6238b1e42ccbd6a0b13   nginx                                                                     "/docker-entrypoint.sh nginx -g 'daemon off;'"                                                                                                                                                      18 months ago   Up About an hour   0.0.0.0:8001->80/tcp, :::8001->80/tcp                                                                                                                 nginx
aab1557dd008363f908aff5d0be30ff4ed28ef7534e54d9efac066be4f1dabd0   redis                                                                     "docker-entrypoint.sh redis-server /etc/redis/redis.conf"                                                                                                                                           20 months ago   Up About an hour   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                                                                                             redis

摘除我们想要的command:
nginx -g 'daemon off;'

6.机器映射提前准备好

把机器的 /mydata/nginx_test/ 拷贝到新机器/nydata/nginx_test

运行我们自己的容器命令,注意,自己导出容器时候的版本号要加上哦
否则会报这个错

Unable to find image 'nginx_test1:latest' locally

docker: Error response from daemon: pull access denied for nginx_test1, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.

这得益于docker么,你不写版本号,他就去镜像库找最新的版本,这个镜像是老板您自己div的,根本找不到的嘛

另外,第五部的步骤工作带过来,我们就得道了命令:

docker run -p 8123:80 --name nginx_test \
-v /mydata/nginx_test/html:/usr/share/nginx/html \
-v /mydata/nginx_test/logs:/var/log/nginx \
-v /mydata/nginx_test/conf:/etc/nginx \
-d nginx_test1/nginx_test2:1.10 \
nginx -g 'daemon off;'

然后查看我们的成功:

docker容器原样迁移完整过程(nignx例子)_运维_02

至此,大功告成,您学废了么

过程遇到任何其他问题,欢迎留言探讨

此致~


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月13日 0

暂无评论

推荐阅读
  wURKzOHw9Irf   2023年12月24日   24   0   0 HTMLicoicohtml
  8l4CZpTOKa7P   2023年12月26日   32   0   0 htmlhtml
  dwHry2iKGG0I   2023年12月26日   28   0   0 githubgithubhtmlhtml
9OVhFvwkhDei