我们在测试服务器上,辛辛苦苦开发,各种配置好了服务,然后想着傻瓜式的迁移部署。接下来的就是干货了
过程描述:
为了体现一个完成性的描述,我们最初拉镜像开始,一直说到迁移后的服务正常运行。
接下来以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
成功效果如下:
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;'
然后查看我们的成功:
至此,大功告成,您学废了么
过程遇到任何其他问题,欢迎留言探讨
此致~