docker高级
前言:最近让我部署一个项目,该项目是多个服务的,在启动多个容器的时候是比较麻烦的。于是就想到了docker-compose 容器编排。
结构:
- docker-compose 容器编排
- docker-swarm 容器集群
目录:
docker compose
docker 容器编排。当需要启动多容器的时候,需要docker-compose进行编排管理
结构:
- 安装
- docker-compose 文件的组成
- docker-compose 常用命令
- 实战
安装
流程:
- 下载
- 添加可执行权限
- 测试安装结果
1、下载
- 从gitHub下载
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- daocloud镜像下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
2、添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
3、
docker-compose --version
docker-compose 文件的组成
docker-compose 文件是一个定义服务,网络,数据卷的yaml
文件,默认文件名为 docker-compose.yml
。
组成:
-
version
-
services
-
images
-
ports
-
volumes
-
container_name
-
command
-
build
-
depends_on
-
networks
-
sysctls
-
ulimits
-
environment
-
env_file
案例:
version: "3.7"
services:
saas_group:
build:
context: ../saas-group
dockerfile: ../saas-group/Dockerfile
container_name: saas_group
restart: "no"
external_links:
- nacos_server:nacoshost
- mysql_db:mysqlhost
- redis_db:redishost
volumes:
- /private/docker/application-logs:/mnt/logs
environment:
- nacoshost=xx.xx.xx.xx
- mysqlhost=xx.xx.xx.xx
- redishost=xx.xx.xx.xx
- NACOS_CONFIG_GROUP=develop_group
- DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
- NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
ports:
- 20880-20085:20880-20885
- 6000-6005:6000-6005
networks:
- qa-overlay
application_group:
build:
context: ../application-group
dockerfile: ./Dockerfile
container_name: application_group
restart: "no"
external_links:
- nacos_server:nacoshost
- mysql_db:mysqlhost
- redis_db:redishost
volumes:
- /private/docker/application-logs:/mnt/logs
environment:
- nacoshost=xx.xx.xx.xx
- mysqlhost=xx.xx.xx.xx
- redishost=xx.xx.xx.xx
- NACOS_CONFIG_GROUP=develop_group
- DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
- NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
ports:
- 30880-30889:30880-30889
- 9000-9005:9000-9005
networks:
- qa-overlay
global_gateway:
build:
context: middleware-group/global-gateway
dockerfile: ./Dockerfile
container_name: global_gateway
restart: "no"
external_links:
- nacos_server:nacoshost
- mysql_db:mysqlhost
- redis_db:redishost
ports:
- 8080:8080
volumes:
- /private/docker/application-logs:/mnt/logs
environment:
- nacoshost=xx.xx.xx.xx
- mysqlhost=xx.xx.xx.xx
- redishost=xx.xx.xx.xx
- NACOS_CONFIG_GROUP=develop_group
- DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
- NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
networks:
- qa-overlay
deploy:
resources:
limits:
cpus: '0.50'
memory: 1024M
networks:
qa-overlay:
external: true
1、version
- 定义版本号,一般
3.0
-4.0
都行,可以在官网查对应的关系:Compose file | Docker Documentation
2、services
service
代表一个容器,servieces
下可以有多个容器
3、image
- 指定为镜像名称【:版本号】或者镜像ID,如果镜像在本地不存在,
compose
会尝试拉取这个镜像。
image: centos7.7
image: orchardup/postgresql
image: a4bc65fd
4、ports
- 暴露端口信息
宿主端口:容器端口host:container
格式;或者仅仅指定容器的端口,宿主机将会随机选择端口。
ports:
- "3000"
- "49100:22"
5、volumes
- 数据卷所挂载的路径设置,可以设置为宿主机路径
host:container
,并且可以设置访问模式host:container:ro
- 支持相对路径
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
- 如果路径为数据卷名称,必须在文件中配置数据卷
version: "3"
services:
my_src:
image: mysql:8.0
# 数据卷声明
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data: # 声明的数据卷
6、container_name
- 指定容器名称,将会默认使用
项目名称_服务名称_序号
这样的格式
version: "3"
services:
docker-service-name: # 容器服务名
container_name: docker-web-container # 容器名称
7、command
- 覆盖容器后,默认执行命令
command: echo "hello world"
8、build
- 指定
Dockerfile
所在文件夹路径(可以是绝对路径,或者是相对 docker-compose.yaml 文件的路径),compose
将会利用它自动构建这个镜像,然后使用这个镜像
version: '3'
services:
webapp:
build: ./dir
- 也可以使用
context
指令指定Dockerfile
所在文件夹路径 - 使用
dockerfile
指令指定Dockerfile
文件名,使用arg
指令指定构建镜像时的变量
version: '3'
services:
webapp:
build:
context: /opt/docker
dockerfile: Dockerfile-alternate
args:
buildno: 1
container_name: webapp
ports:
- "8080:8080"
9、depends_on
- 解决容器的依赖,启动先后的问题,以下例子中启动顺序为:
db
,redis
,web
- 注意:不是【完全启动后】才启动,只是启动顺序
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
10,networks
- 配置容器连接的网络
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
11、sysctls
- 配置容器内核参数
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
12、ulimits
- 指定容器的
ulimits
限制值
例如:指定最大进程数为 65535 ,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过应限制)和 40000(系统硬限制,只能用户root 提高)
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
13、environment
- 设置环境变量,例如设置mysql 默认启动密码
environment:
- MYSQL_ROOT_PASSWORD=root
14、env_file
- 从文件中获取环境变量,可以为单独的文件路径或者列表
- 如果通过
docker-compose -f FILE
方式来指令 compose 模板文件,则env_file
中变量的路径会基于模板文件的路径 - 如果
env_file
的环境变量名称 与environment
指令冲突,以environment
为准
env_file: .env
env_file:
- ./apps/web.env
- /opt/secrets.env
支持 #
开头的注释,同dockerfile文件一致。
docker-compose 常用命令
注意:
对于docker-compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。
如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令的影响。
基本命令格式:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
结构:
- up
- down
- ps
- log
1、up
docker-compose up [options] [SERVICE…]
- 该命令十分强大,它将尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作
- 链接的服务都会被自动启动,除非已经处于运行状态
- 可以说大部分时候都可以直接通过该命令,来启动一个项目
- 默认情况下,,
docker-compose up
启动并进入容器;如果当前容器正在运行,将会重新加载 yml 文件,重新创建。 - 使用
ctrl c
退出容器 docker-compose up -d
后台启动
2、dokcer-compose down
- 停止
up
命令所启动的容器,并移除网络
3、docker-compose ps [options] [service…]
- 列出项目中目前所有的容器 ,
-q
只打印容器的id
4、docker-compose log 容器id
- 查看服务日志
实战
实战列表:
docker-compose tomcat
yml文件:
version: "3.0"
services:
tomcat-docker: # 唯一服务名
image: tomcat:8.0-jre8 # 创建当前这个容器的镜像
ports:
- 8094:8080 # 映射端口
启动:
- 进入docker-compose.yml 文件目录下
#启动并进入容器
docker-compose up
#启动容器后台运行
docker-compose up -d
访问:
ip地址:8094
docker swarm
相当于简单版k8s
CI/CD
-
持续集成/部署
-
jenkins 流水线