接上一节docker-compose模板指令接着说,再补几个模板指令:
1、接上节最后补几个docker-compose模板指令
几个非必要性的:
healthcheck: #心跳检测机制
test: [ "CMD", "curl", "-f", "http://localhost" ]
interval: 1m30s
timeout: 10s
retries: 3
sysctls: #用来修改容器中系统内部参数 并不是必须 有些服务启动受容器内操作系统参数限制可能会无法启动必须通 过修改容器中参数才能启动
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits: #用来修改容器中系统内部进程数限制 日后使用时可根据当前容器运行服务要求进行修改
nproc: 65535
nofile:
soft: 20000
hard: 40000
env_file: #用来将environment环境中配置放入指定配置文件 这里mysql.env是和docker-compose目录平级
- ./mysql.env
#其实就是把environment指令的操作参数放文件里去读了
重要指令:
depends_on: #代表这个容器必须依赖哪些容器启动之后才能启动
- tomcat02 #这里写的是服务名,不是容器名
- redis #这里写的是服务名,不是容器名
- mysql #这里写的是服务名,不是容器名
build: #启动服务时先将build命令中指定dockerfile打包成镜像,再运行该镜像
context: springbootDockerfile #指定上下文目录dockerfile所在目录 这里写的是相对路径 和docker-compose.yml一层就行
dockerfile: Dockerfile
depends_on:解决容器的依赖、启动先后的问题。(容器编排关键指令)
build:指定 Dockerfile
所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose
将会利用它自动构建这个镜像,然后使用这个镜像。 其实就是把Dockerfile也指定到docker-compose里了,不过Dockerfile该有还得有。。比如下面的myspringboot服务就是拉Dockerfile构建然后使用的意思:
myspringboot:
build: #启动服务时先将build命令中指定dockerfile打包成镜像,再运行该镜像
context: springbootDockerfile #指定上下文目录dockerfile所在目录 这里写的是相对路径 和docker-compose.yml一层就行
dockerfile: Dockerfile
container_name: myspringboot
ports:
- "9999:9999"
networks:
- hello
depends_on:
- tomcat01 #因为tomcat01是依赖于其他的,所以这里直接依赖于一个tomcat01就能在最后启动了
2、docker-compose指令使用
不同于docker-compose模板指令,docker-compose的指令没有特殊说明是针对项目的,而模板指令是针对单一服务(容器)的,常用的docker-compose指令:
up:格式为 `docker-compose up [options] [SERVICE...]`。
- 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
- 链接的服务都将会被自动启动,除非已经处于运行状态。
- 可以说,大部分时候都可以直接通过该命令来启动一个项目。
- 默认情况,`docker-compose up` 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
- 当通过 `Ctrl-C` 停止命令时,所有容器将会停止。
- 如果使用 `docker-compose up -d`,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
- 默认情况,如果服务容器已经存在,`docker-compose up` 将会尝试停止容器,然后重新创建(保持使用 `volumes-from` 挂载的卷),以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容
down:此命令将会停止 `up` 命令所启动的容器,并移除网络
ps:格式为 `docker-compose ps [options] [SERVICE...]`。
列出项目中目前的所有容器。
选项:
- `-q` 只打印容器的 ID 信息。
exec:进入指定的容器。
restart:格式为 `docker-compose restart [options] [SERVICE...]`。
重启项目中的服务。
选项:
- `-t, --timeout TIMEOUT` 指定重启前停止容器的超时(默认为 10 秒)。
rm:格式为 `docker-compose rm [options] [SERVICE...]`。
删除所有(停止状态的)服务容器。推荐先执行 `docker-compose stop` 命令来停止容器。
选项:
- `-f, --force` 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
- `-v` 删除容器所挂载的数据卷。
start:格式为 `docker-compose start [SERVICE...]`。
启动已经存在的服务容器。
stop:格式为 `docker-compose stop [options] [SERVICE...]`。
停止已经处于运行状态的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器。
选项:
- `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
top:查看各个服务容器内运行的进程。
unpause:格式为 `docker-compose unpause [SERVICE...]`。
恢复处于暂停状态中的服务。
docker-compose几个常用指令:
docker-compose up
docker-compose down
docker-compose ps
docker-compose logs 服务id
注意:有一个关键点就是docker-compose的命令接的参数都是 服务id 而docker命令接的参数是 容器id !
3、使用Portainer——Docker可视化工具
下载命令:
docker pull portainer/portainer
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
以上为docker run启动,用docker-compose启动也可以,但是没必要,因为这玩意一般启动一次就:
portainer:
image: portainer/portainer
container_name: portainer
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data portainer/portainer
networks:
- hello
ports:
- "8000:8000"
- "9000:9000"
截止到最后,写好的docker-compose.yml文件如下:
version: "3.2"
services:
myspringboot:
build: #启动服务时先将build命令中指定dockerfile打包成镜像,再运行该镜像
context: springbootDockerfile #指定上下文目录dockerfile所在目录 这里写的是相对路径 和docker-compose.yml一层就行
dockerfile: Dockerfile
container_name: myspringboot
ports:
- "9999:9999"
networks:
- hello
depends_on:
- tomcat01 #因为tomcat01是依赖于其他的,所以这里直接依赖于一个tomcat01就能在最后启动了
myspringboot02:
build: #启动服务时先将build命令中指定dockerfile打包成镜像,再运行该镜像
context: springbootDockerfile #指定上下文目录dockerfile所在目录 这里写的是相对路径 和docker-compose.yml一层就行
dockerfile: Dockerfile
container_name: myspringboot02
ports:
- "9998:9999"
networks:
- hello
depends_on:
- tomcat01 #因为tomcat01是依赖于其他的,所以这里直接依赖于一个tomcat01就能在最后启动了
tomcat01: #服务名称
container_name: tomcat01 #相当于run 的 --name
image: tomcat:8.0-jre8 #使用哪个镜像 相当于run image
ports: #用来完成host与容器端口映射关系 相当于run -p
- "8088:8080"
volumes: #完成宿主机与容器中目录数据卷共享 相当于run -v
# - /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps01:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥 相当于 run --network
- hello
depends_on: #代表这个容器必须依赖哪些容器启动之后才能启动
- tomcat02 #这里写的是服务名,不是容器名
- redis #这里写的是服务名,不是容器名
- mysql #这里写的是服务名,不是容器名
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost" ]
interval: 1m30s
timeout: 10s
retries: 3
tomcat02: #服务名称
container_name: tomcat02
image: tomcat:8.0-jre8 #使用哪个镜像
ports: #用来完成host与容器端口映射关系
- "8089:8080"
volumes: #完成宿主机与容器中目录数据卷共享
# - /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps02:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥
- hello
sysctls: #用来修改容器中系统内部参数 并不是必须 有些服务启动受容器内操作系统参数限制可能会无法启动必须通过修改容器中参数才能启动
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits: #用来修改容器中系统内部进程数限制 日后使用时可根据当前容器运行服务要求进行修改
nproc: 65535
nofile:
soft: 20000
hard: 40000
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
# environment:
# - MYSQL_ROOT_PASSWORD=root
env_file: #用来将environment环境中配置放入指定配置文件
- ./mysql.env
networks:
- hello
redis:
container_name: redis
image: redis:5.0.10
ports:
- "6379:6379"
volumes:
- redisdata:/data
command: "redis-server --appendonly yes" # run 镜像之后覆盖容器内默认命令
networks:
- hello
portainer:
image: portainer/portainer
container_name: portainer
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data portainer/portainer
networks:
- hello
ports:
- "8000:8000"
- "9000:9000"
volumes: #声明上面服务所使用的自动创建的卷名
tomcatwebapps01: #声明指定的卷名 compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名,指定为true的话,这样必须先docker volume create 卷名
false #true确定使用指定卷名
tomcatwebapps02: #声明指定的卷名 compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名,指定为true的话,这样必须先docker volume create 卷名
false #true确定使用指定卷名
mysqldata:
mysqlconf:
redisdata:
portainer_data:
networks: #定义服务用到桥
hello: #定义上面的服务用到的网桥名称 默认创建的就是 bridge
external: #使用自定义网桥名,指定为true的话,这样必须先docker network create 网桥名
false #使用外部指定网桥 #true确定使用指定网桥名 注意:网桥必须存在,就是和volume自定义卷用法一样