百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

容器化 docker-compose(容器化改造)

wptr33 2025-01-27 00:37 42 浏览

docker-compose

Docker的四种网络模式

Docker服务在启动的时候会创建三种网络,bridge、host和none,还有一种共享容器的模式container

Bridge

桥接模式,主要用来对外通信的,docker容器默认的网络使用的就是bridge。

使用bridge模式配置容器自定的网络配置

# 配置容器的主机名 
docker run --name t1 --network bridge -h [自定义主机名] -it --rm busybox 
# 自定义DNS 
docker run --name t1 --network bridge --dns 114.114 -it --rm busybox 
# 给host文件添加一条 
docker run --name t1 --network bridge --add-host [hostname]:[ip] -it --rm busybox

创建自定义的桥

docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0

Host

host类型的网络就是主机网络的意思,绑定到这种网络上面的容器,内部使用的端口直接绑定在主机上对应的端口,而如果容器服务没有使用端口,则无影响。

None

不使用任何网络,宿主机无法通过网络访问容器,容器也无法访问宿主机

container

共享另外一个容器的network namespace,和host模式差不多,只是这里不是使用宿主机网络,而是使用的容器网络

Tip:自定义docker0桥的网络属性信息:/etc/docker/daemon.json文件。(这个文件位置还是挺重要的)

Docker Compose

Compose的作用是“定义和运行多个Docker容器的应用”。使用Compose,使用yaml配置文件中配置应用的服务,然后使用一个命令,即可创建并启动配置中引用的所有服务。

Compose中两个重要概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义。

安装

Compose支持三平台Windows、Mac、Linux,安装方式各有不同。我这里使用的是Linux系统,其他系统安装方法.可以参考官方文档和开源GitHub链接:

Docker Compose官方文档链接:https://docs.docker.com/compose

Docker Compose GitHub链接:https://github.com/docker/compose

Linux上有两种安装方法,Compose项目是用Python写的,可以使用Python-pip安装,也可以通过GitHub下载二进制文件进行安装。

  • 通过Python-pip安装安装Python-pipyum install -y epel-release yum install -y python-pip 安装docker-composepip install docker-compose验证是否安装docker-compose version卸载pip uninstall docker-compose
  • 通过GitHub链接下载安装(非ROOT用户需使用sudo)通过GitHub获取下载链接,版本地址:https://github.com/docker/compose/releasescurl -L “https://github.com/docker/compose/releases/download/1.23.2/docker-compose-(uname -s)-(uname-s)-(uname -m)” -o /usr/local/bin/docker-compose给二进制下载文件可执行的权限chmod +x /usr/local/bin/docker-compose可能没有启动程序,设置软连接ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose验证是否安装docker-compose version卸载rm /usr/local/bin/docker-compose

Docker Compose模板文件常用指令

image

指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。

image: java:8

build

1、指定Dockerfifile文件的路径。可以是一个路径,

build: ./dir

2、也可以是一个对象,用以指定Dockerfifile和参数,

build: context: ./dir dockerfifile: Dockerfifile-alternate args: buildno: 1

command

覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

也可以是一个list,类似于Dockerfifile总的CMD指令,

command: [bundle, exec, thin, -p, 3000]

links

链接到其他服务中的容器。可以指定服务名称和链接的别名使用SERVICE:ALIAS 的形式,或者只指定服务名称

web: links: - db - db:database - redis

external_links

表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似

external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql

ports

暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p ,

ports:

“3000”

“3000-3005”

“8000:8000”

“9090-9091:8080-8081”

“49100:22”

“127.0.0.1:8001:8001”

“127.0.0.1:5000-5010:5000-5010”

expose

暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机。

expose: - “3000” - “8000”

volumes

端挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。

volumes:

1、Just specify a path and let the Engine create a volume

/var/lib/mysql

2、Specify an absolute path mapping

/opt/data:/var/lib/mysql

3、Path on the host, relative to the Compose fifile

./cache:/tmp/cache

4、User-relative path

~/confifigs:/etc/confifigs/:ro

5、Named volume

datavolume:/var/lib/mysq

volumes_from

从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。volumes_from:

service_name

service_name:ro

container:container_name

container:container_name:rw

environment

设置环境变量。可以使用数组或者字典两种方式。只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值。

environment: RACK_ENV: development SHOW: ‘true’ SESSION_SECRET: environment: -RACK_ENV=development - SHOW=true - SESSION_SECRET

env_fifile

从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则env_fifile 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准。

env_fifile: .env env_fifile: - ./common.env - ./apps/web.env - /opt/secrets.env

extends

继承另一个服务,基于已有的服务进行扩展。

net

设置网络模式。示例:

net: “bridge” net: “host” net: “none” net: “container:[service name or container name/id]”

dns

配置dns服务器。可以是一个值,也可以是一个列表。

dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9

dns_search

配置DNS的搜索域,可以是一个值,也可以是一个列表。

dns_search: example.com dns_search: - dc1.example.com - dc2.example.com

其它

docker-compose.yml 还有很多其他命令,可以参考docker-compose.yml文件官方文档:

https://docs.docker.com/compose/compose-fifile/

实例

准备几个微服务使用docker-compose来练习使用

# 找个文件夹放要做的部署服务
> cd /usr/local
# 创建文件夹
> mkdir dokcercompose
# 创建几个文件夹分别方式不同的微服务
> mkdir a
> mkdir b
> mkdir c
# 分别将不同的微服务jar包上传至到a、b、c文件夹中并创建编写dockerfile文件(参考上一篇)
# 使用docker build命令创建镜像(我是使用image方式写入的docker-compose,如果用build在编写文件时需要注意文件夹层级)
# 创建docker-compose.yml文件
> vim docker-compose.yml
#----------------------
version: '2.2' 
services: 
  eureka: 
    image: a 
    ports: 
      - 8080:8080 
  user: 
    image: b 
    ports: 
          - 8081:8081 
  power: 
    image: c
    ports: 
      - 8082:8082
#----------------------     
# 执行docker-compose
> docker-compose up -d

几个服务之间关联需要配置docker的网络文件。就是前面提到的/etc/docker/daemon.json

这里主要是需要配置一个bip

{
  "registry-mirrors": ["https://o3addn2g.mirror.aliyuncs.com"],
  "bip":"10.105.1.1/24" 
}

这里需要注意配置的bip不要和宿主机在一个网段(我是用的虚拟机,最开始配置在一个网段的时候导致SSH无法远程且虚拟机和本地互相ping不通)。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...