计算机系统应用教程网站

网站首页 > 技术文章 正文

容器化 docker-compose 容器化技术的基本原理

btikc 2024-10-14 08:46:42 技术文章 4 ℃ 0 评论

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不通)。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表