【momo的项目回顾】基于docker的项目迁移实战

在结束上一段实习以及秋招的gap time中自然而然也并没有闲着。实习阶段导师给的最后一个任务是修改一个php界面,服务端需要本地docker起一个服务(当然你也可以选择直接跑php)提供。接到任务后,docker的学习开始了......

为啥使用docker

之前我们宿舍曾经争论过dockervs虚拟机的话题。对于当时的他而言,他服务器的服务只需要用到java环境,安装jdk后,直接运行jar包就能跑起服务了。对于迁移而言,可以自行拷贝虚拟机,他认为会比使用docker更加方便。

于我而言,我之前个人项目的部署还是基于宝塔面板进行的,宝塔面板的操作对于赶时间、对命令好界面不感兴趣的同学而言简直了救赎。但是我选择他的原因是因为怕遇到复杂的环境变量、还有各种奇葩的安装过程,不用安装xftp就能进行文件操作、集成常见的服务。

我同学的情况可以抽象为不太复杂的、常用的生产环境,面对这种情况,是否使用docker也无所谓了;对于我实习阶段的需求来说,php环境并不是我常用的,如果进行安装相关环境,就会污染到本地的全局变量,安装相关东西也十分费劲啊。至于为啥使用docker而非宝塔面板,我给出的说法是,想更多将服务依托给自己管理。

项目迁移

数据卷管理

有一个在使用过程中非常值得注意的点是docker container产生的输入,在你删除本个container的时候,他是不保存的,也即是不可持久化的。为此,需要使用提供的数据卷功能进行控制相关数据,同时也方便修改相关的配置文件。数据卷需要统一管理。

我将需要部署的服务都放在/config目录下,仅供参考:

nginx

对于nginx而言,我觉得直接安装在你的服务器,我觉得会更好,但是这里也给出相关的实践经验分享:

js 复制代码
在docker pull相关镜像之后:
docker run --name momo-nginx -p 80:80 -p 443:443 --privileged --restart=always -v 
/config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v # 根配置
/config/nginx/conf.d:/etc/nginx/conf.d -v  # 这个很重要啊,将需要的配置文件拷贝到目录中,拷贝的是文件
/config/nginx/html:/usr/share/nginx/html -v # 这个是默认的nginx显示页面,其实也不太需要
/config/nginx/log:/var/log/nginx -v # 日志
/config/nginx/img:/img -v # 这个可以没有,因为我需要静态资源服务,所以才会有一个/img文件夹
/fondend:/fontend # 这个是用来放前端资源的,如果你去问gpt,他会单一项目单一nginx给你部署
-d nginx

使用docker exec -it containerName/conatinerId bash可以进入容器内部(一个麻雀虽小五脏俱全的操作系统)进行操作。如果你有修改conf配置文件,可以使用命令去进行nginx的重启。

顺便分享配置https

  1. 首先你需要去买一个域名
  2. 去域名商那里申请相关证书
  3. 放进容器内部的相关目录/etc/nginx目录,使用命令docker cp 在服务器的路径 containerId:container内的路径复制证书
js 复制代码
server {
    listen       80;
    server_name  域名;

    rewrite ^(.*)$ https://$host$1 permanent;
    add_header Content-Security-Policy upgrade-insecure-requests;
    location / {
       root   /usr/share/nginx/html;
       index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

server {
    listen 443 ssl;
    server_name ; #你的申请过证书的域名
    client_max_body_size 64M;
    fastcgi_read_timeout 3600;
    error_page   500 502 503 504  /50x.html;
 #   root   /usr/share/nginx/html;
    try_files $uri $uri/ @rewrite;
    # ssl on;
    ssl_certificate     .pem; # pem文件
    ssl_certificate_key .key; # key文件
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    ssl_prefer_server_ciphers on;

     location / {
      root   /usr/share/nginx/html;
      index  index.html index.htm;
    }

    location /img/ {
	root /;
	autoindex on;
    }

   location /demo {
	root /fontend;
	index index.html;
   }  
}

经过努力,你的小锁就出来了~

mysql

思路同样是,映射相关的配置文件,但是mysql需要设置密码:

bash 复制代码
在docker pull相关镜像之后:
sudo docker run -p 3306:3306 --name momo-mysql \
-v /config/mysql/mysql-files:/var/lib/mysql-files \
-v /config/mysql/conf:/etc/mysql/conf.d \
-v /config/mysql/logs:/var/log/mysql \
-v /config/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=密码密码密码 \
-d mysql

redis

思路同样是,映射相关的配置文件,但是要设置密码,redis不配置密码,也能进,你需要进入redis内部设置密码呢:

bash 复制代码
在docker pull相关镜像之后:
docker run -p 6379:6379 --name momo-redis --privileged=true -v 
/config/redis/redis.conf:/etc/redis/redis.conf -v 
/config/redis/data:/data 
-d redis

个人项目

对于个人项目,就会麻烦一点,需要我们制作镜像,但是别怕,gpt侠会帮助我们制作简单有效的镜像,虽然有时候不一定能跑起来。我们并不想将我们的制作的image公开,此时,我们可以使用服务器商提供的镜像服务。

  1. 新建用户实例: 新建仓库,填写相关信息

会有快捷命令提供给你的,当你本地docker登录到腾讯云后就能进行操作了,``: 腾讯云给出的文档

例如一个java 服务器端程序,原理也还是打包成jar包之后,进行打包镜像,在远程服务器上pull、run:

综上,对于各种服务,docker-compose 来了!

渐渐的,我们的服务多了起来,对于数据卷和容器的管理可以使用docker compose编写文件,一键起服务。将上面的服务整合起来就能弄成我们的docker-compose.yml文件了。

js 复制代码
version: '3'

services:
  nginx:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - # 上述挂载的数据卷

  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 密码
    ports:
      - "3306:3306"
    volumes:
      - # 上述挂载的数据卷

  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - # 上述挂载的数据卷

不断去学习docker,发现,docker的技术已经是很久之前出现的了,那时候,我还在玩泥沙。。。所以很多技术已经很成熟,作为软件开发工程师,不应该局限于前端、后端,其他也需要进行涉猎(前端小兵冲冲冲)。很感谢我mentor的指引,虽然他不一定看到这文章~

相关推荐
_.Switch3 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_850410833 小时前
文件系统和日志管理
linux·运维·服务器
JokerSZ.3 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
芯盾时代4 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方5 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘5 小时前
NFS服务器
运维·服务器
南猿北者5 小时前
docker容器
docker·容器
苹果醋35 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰6 小时前
[linux]docker基础
linux·运维·docker
time never ceases6 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle