Docker笔记:docker compose部署项目, 常用命令与负载均衡
2023-12-14 00:08:11
docker compose的作用
- docker-compose是docker官方的一个开源项目
- 可以实现对docker容器集群的快速编排
- docker-compose 通过一个配置文件来管理多个Docker容器
- 在配置文件中,所有的容器通过 services来定义
- 然后使用docker-compose脚本来启动,停止和重启容器
- 使用docker-compose可以对我们项目进行快速部署
docker命令部署项目
- 比如,项目中有:nginx, web, mysql 三项服务
1 )mysql 的部署
- 拉取镜像 $
docker pull mysql
- 创建mysql, 并将mysql数据库导入到容器里
- $
docker run --name mysql_c -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
- 在物理机 $
mkdir /root/mysql/conf.d /root/mysql/data
来创建两个目录
- $
- 客户端 尝试连接 物理机上的mysql容器,成功
- 连接成功后,创建数据库或导入数据库,这里导入之前的数据库
2 )web的部署
- 测试本地的web项目是否可以链接容器数据库,检查连接配置,正常
- 这里如果mysql连接配置写的是ip最好改成 host对应的域名
- 打包或不打包的不同部署方式,参考前文
- 需要注意连接数据库的问题,这里简单举例: 这里用centos镜像来运行的,不是golang或已经打包好的镜像
- $
docker run -itd --name goweb1 --link mysql_c:mysql -p 8080:8080 -v /root/wwwroot/:/root centos
--link
之后,会在 /etc/host 生成mysql对应的别名配置,就可以连接到mysql了
- $
docker exec -it goweb1 /bin/bash
这里goweb1是容器,可以用自己的 - $
chmode -R goweb1
这里找到对应的目录修改执行权限, 这里goweb1是目录 - $
nohup ./goweb &
这里 goweb是可执行程序 - 客户端访问测试正常
3 )nginx的部署
- 如果想要不通过ip访问,通过域名访问,就要配置ng的转发
- 转发配置, 默认配置文件 default.conf,新建任意 xxx.conf 存放在物理机上 /root/nginx/conf.d
goweb.conf
upstream backend {
ip_hash;
server goweb1:8080; # 这里是 goweb1 容器服务的host别名
}
server {
listen 80;
server_name goweb.xxxx.com; # 你的域名地址
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://backend;
}
# 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 html;
}
}
-
启动nginx映射端口,配置映射目录,连接web服务
- $
docker run -itd --name nginxweb -p 80:80 --link goweb1:centos -v /root/nginx/conf.d/:/etc/nginx/conf.d nginx
- $
-
检查 host配置
- $
cat /etc/hosts
- 如果是客户端访问 goweb.xxxx.com 域名,客户端需要配置相关的host, 才能访问
- 确认配置文件无误
- $
-
ping 域名 成功
-
以上是纯docker命令部署,也可通过 Dockerfile来配置部署goweb应用程序
-
不管是原生docker命令部署,还是 Dockerfile部署,其实都比较麻烦
docker compose 部署项目
1 )安装 docker compose
- 如果你是安装的桌面版 Docker,不需要额外安装,已经包含了
- 如果是没图形界面的服务器版 Docker,你需要单独安装
- 如果是 centos8 默认源是有问题的,我们可以配置到阿里源
- 参考:http://bbs.itying.com/topic/6256730b212f3a0c78d4ac16
- $
rm -rf /etc/yum.repos.d/*
- $
touch /etc/yum.repos.d/CentOS-Base.repo
- 复制链接提供的内容
- $
yum clean all
- $
yum makecache
- 在安装 docker compose 前还要配置 docker的源,这里是时候的 阿里源
- $
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- $
- $
- 参考:http://bbs.itying.com/topic/6256730b212f3a0c78d4ac16
- $
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 如果在安装的时候,后面有 docker-compose-plugin 参数,也会被安装
- $
yum install docker-compose-plugin
- 这是单独安装
- 如果是 centos8 默认源是有问题的,我们可以配置到阿里源
- 运行 docker compose 检查是否安装成功
2 )配置 docker-compose.yml
version: "3"
services: # 定义容器服务
mysql_c: # 当前容器配置
image: mysql
container_name: mysql_c # 可以不写,和配置名保持一致
environment:
MYSQL_ROOT_PASSWORD: 123456
restart: always
ports:
- 3306:3306
volumes:
- /root/mysql/conf.d:/etc/mysql/conf.d
- /root/mysql/data:/var/lib/mysql
goweb1:
image: gowebimg # 这个golangweb的镜像需要提前准备好
build:
context: ./
dockerfile: Dockerfile
# container_name: goweb1
restart: always
ports:
- 8080:8080
depends_on: # 表示 mysql_c 容器创建完成后,再去创建 goweb1 容器
- mysql_c
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
depends_on:
- goweb1
volumes:
- /root/nginx/conf.d/:/etc/nginx/conf.d
- 验证配置文件: $
docker compose convert
- 如果有错,不会启动,输出错误,如: yaml: line3: did not find expected key
- 编译运行容器: $
docker compose up
- 后台运行: $
docker compose up -d
- $
docker ps / docker compose ps
- 这样,一次就起来了3个容器服务
- 之后,验证服务是否正常
- 如果不正常,进行检查,如 检查web服务
- $
docker compose exec 服务名 /bin/bash
- 例如: $
docker compose exec goweb1 /bin/bash
- 例如: $
- 查看里面的配置文件
- 注意一般而言,我们这样查看都是基于未打包的
- 因为打包后的可执行文件,不是docker打包可能结果和配置不匹配
- 上述配置,有可能会遇到一些问题,比如 mysql容器先启动起来,goweb应用接着启动起来,但是mysql可能还没启动起来
- 可重启应用解决 $
docker compose restart goweb1
- 可使用脚本解决
- 可重启应用解决 $
- 重启某个服务
- $
docker compose restart goweb1
- $
- docker compose 极大方便了我们结合不同的容器
- 通过一个配置文件,一个命令即可部署
3 )解决启动顺序问题导致的数据库访问不通
- 使用 wait-for-it.sh 脚本
- https://github.com/vishnubob/wait-for-it
-
改写 compose 文件
goweb1: image: gowebimg # 这个golangweb的镜像需要提前准备好 build: context: ./ dockerfile: Dockerfile # container_name: goweb1 restart: always ports: - 8080:8080 depends_on: # 表示 mysql_c 容器创建完成后,再去创建 goweb1 容器 - mysql_c command: ["./wait-for-it.sh", "mysql_c:3306", '--', './goweb'] # goweb是编译后的可执行文件
docker compose 常见命令
- $
docker compose build
可编译/重新编译服务- 如果有 Dockerfile会编译我们的镜像
–force-rm
:总是删除构建过程中的临时容器。–no-cache
:镜像构建过程中不使用 cache。–pull
:始终先尝试通过 pull 来获取最新版本的镜像
- $
docker compose logs
可查看操作日志 - $
docker compose ps
可查看当前主机容器信息,类似 docker ps - $
docker compose start
启动容器 - $
docker compose restart
重启容器 - $
docker compose stop
停止容器 后面不加容器,则全部停止 - $
docker compose rm
删除容器 不加容器,删除停止状态的容器-f
强制删除
- $
docker compose exec
进入容器 - $
docker compose version
查看版本
docker compose 实现容器扩容
1 )方案1:基于命令
- $
docker compose up --scale='goweb1=3' -d
- goweb1 是服务名, 3 是部署扩展3台用于负载均衡
- 注意,如果web服务启动多态,配置相同的端口会有问题,这时只需要注释掉 上面的 ports 配置
# ports: # - 8080:8080
- $
docker compose ps
可看见3台 goweb1 服务 - 结束掉一台,会自动重新负载均衡
- 可以进入 nginx 服务 ping goweb1 服务,ip地址会动态变化
2 )方案2: 基于docker-compose.yml文件
goweb1:
build:
context: ./
dockerfile: Dockerfile
restart: always
deploy:
replicas: 3 #副本数量
resources: #资源
limits: #配置cpu
cpus: "0.5" # 设置该容器最多只能使用 50% 的 CPU
memory: 500M # 设置该容器最多只能使用 500M内存
restart_policy: #定义容器重启策略, 用于代替 restart 参数
condition: on-failure #只有当容器内部应用程序出现问题才会重启
depends_on:
- mysql_c
command: ["./wait-for-it.sh","mysql_c:3306","--","./goweb"]
- 注意,启动多个副本不能指定 container_name
文章来源:https://blog.csdn.net/Tyro_java/article/details/134984389
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!