在结束上一段实习以及秋招的gap time中自然而然也并没有闲着。实习阶段导师给的最后一个任务是修改一个php界面,服务端需要本地docker起一个服务(当然你也可以选择直接跑php)提供。接到任务后,docker的学习开始了......
为啥使用docker
之前我们宿舍曾经争论过docker
vs虚拟机
的话题。对于当时的他而言,他服务器的服务只需要用到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
- 首先你需要去买一个域名
- 去域名商那里申请相关证书
- 放进容器内部的相关目录
/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
公开,此时,我们可以使用服务器商提供的镜像服务。
- 新建用户实例: 新建仓库,填写相关信息
会有快捷命令提供给你的,当你本地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
的指引,虽然他不一定看到这文章~