docker-compose和docker兼容表
简介
docker所制作的容器多半需要大量的依赖,有些可能依赖于其他容器的启动,比方说一个springboot的项目,它需要rabbitMQ和esearch什么的,有些没装数据库的机器需要mysql等等,当我们使用命令行一个个启动这些容器,并且手动指定它们的网络设置等会显得很不方便,一个可以根据配置文件自动化这些配置过程的工具便显得极为重要,在单机上首推docker-compose,一个python所写的容器编排管理工具,在docker-hub中,我们也可以看到多个container有关于自己的docker-compose.yml文件的示例
docker-compose的巨大潜力被docker官方所看重,于是docker-compose便被收归国有,变成docker官方的一个仓库了
安装
linux中采用yum或者apt安装,或者使用pip安装docker-compose,当然,如果上述两种方式都不成功,请看我同专栏中的文章,内有从github二进制安装docker-compose的文章
为Linux安装软件包时后面标注的arm,aarch到底是什么玩意儿以二进制安装docker-compose为例_生生世世是所说的的博客-CSDN博客
以wordpress为例入门
version: '3.1' #这是docker-compose的语法版本,最新的通通填3.x或者3就好
services: # 定义服务对象,这里启动的就是各个容器及其对应的配置了
wordpress: # 启动container名为wordpress
image: wordpress # 使用名为wordpress的容器
restart: always # 在退出后docker会重启它
ports: # 对应端口映射
- 8080:80 # 将容器内部80端口的服务映射至主机8080端口
environment: #容器的环境变量,不适用指定-e时,会使用这个配置
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes: #在容器内访问/var/www/html目录时,实际上访问的是主机上的wordpress目录
- wordpress:/var/www/html
db: # 同上
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes: # 也就是在这里配置wordpress目录和db目录的所在位置
wordpress:
db:
关于容器端口互通的问题与解决方案
简单打个比方,比方说你需要后端的容器和数据库容器同时部署到一台服务器上,当然了,后端的服务需要数据库,于是你简单的开了个映射3306端口的容器,后端的服务则简单的映射8080:80端口,然而此时问题出现了,后端的容器的网络在默认情况下与主机的网络是隔离的,它并不能在自己的容器3306端口中找到相对应的数据库服务,让我们用docker-compose来解决这种尴尬的问题
举例:
让我们用gorm写一个极其简单的数据库连接后端,它的作用只有连接到数据库并把连接是否成功输出到同目录的issuccess.txt文件中,以下仅给出数据库连接类,省略main类
让我们更改这个连接地址为db服务名(我们将会之后在docker-compose.yml中定义它,它会在不指定网络的情况下,让容器通过服务名互通)
编译后制作镜像
解决方案一:expose选项
expose 字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。
在 docker-compose.yml 文件中使用 expose 选项来指定容器内部需要暴露的端口。例如,以下示例定义了一个 web 服务,它暴露了 8000 和 8080 端口:
version: '3'
services:
web:
image: myapp:latest
expose:
- "8000"
- "8080"
当您使用 expose
选项时,其他容器可以使用 Docker 的内部网络进行连接。例如,如果您有另一个服务 worker,它需要连接到 web 服务的 8000 端口,则可以在 worker 服务的 docker-compose.yml 文件中使用 links
选项:
version: '3'
services:
worker:
image: myworker:latest
links:
- web
depends_on
depends_on
字段指定了服务之间的依赖关系。例如,如果 web 服务依赖于 db 服务,则可以使用以下示例:
depends_on:
- db
解决方案二(推荐):指定容器服务和网络
我们在上文中指定了127.0.0.1:3306为db(docker-compose中指定的容器名,它会自动创建dns解析ip) :3306
可以看到两个容器成功的进行了连通