0


【云原生】Docker Compose从入门到实践

前言

大家好,本文是讲解了如何安装使用 Docker Compose,Compose 模板文件的常用指令,以及Docker Compose实战。希望对大家有所帮助~

目录

一、概述

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,负责实现对 Docker 容器集群的快速编排。可以在一个

YAML

文件中定义所有配置,然后使用一个命令启动所有容器。

在日常工作中,经常会碰到需要使用多个容器,且需要多个容器相互配合来完成某项任务的情况。例如实现一个WEB服务,可能还需要数据库服务容器、缓存服务容器等。

Compose

恰好满足了这样的需求。

Docker Compose 不是将所有服务都放在一个大容器中,而是允许将它们拆分为可单独管理的容器。这对于构建和部署都更好,并且不需要手动启动每个单独的容器。

二、安装与卸载

2.1、手动下载安装

2.1.1、下载

Linux 上安装十分简单,从 Docker Compose

GitHub

官方仓库直接下载编译好的二进制文件即可。

目前最新版本为

v2.9.0

官方地址:

https://github.com/docker/compose/releases

GitHub
下载

2.1.2、上传

下载好后,使用 Xftp 工具,将其上传至

/usr/local/bin

目录下。
上传

2.1.3、增加权限

我们上传二进制文件后,要添加

可执行

权限,才可以在Linux中正常使用。命令如下:

#进入到文件目录cd /usr/local/bin
#改名mv docker-compose-linux-x86_64 docker-compose#增加可执行权限chmod +x docker-compose

执行

ll

命令后,我们可以看到 docker-compose 二进制文件有了可执行权限

root@ubuntu:/usr/local/bin# ll
total 25208
drwxr-xr-x  2 root root     4096 Aug 1520:56 ./
drwxr-xr-x 13 root root     4096 Jul 2723:16 ../
-rwxr-xr-x  1 root root 25804800 Aug 1520:50 docker-compose*

查看 docker-compose 版本

root@ubuntu:/usr/local/bin# docker-compose -v
Docker Compose version v2.9.0

2.2、系统命令安装

下载 docker-compose。网速很慢的话,建议采用第一种方式。

sudocurl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

增加权限

#进入到文件目录cd /usr/local/bin
#增加可执行权限chmod +x docker-compose

查看 docker-compose 版本

root@ubuntu:/usr/local/bin# docker-compose -v
Docker Compose version v2.9.0

2.3、卸载

二进制包方式安装的,删除二进制文件即可

rm -fr /usr/local/bin/docker-compose

三、使用

我们使用 Docker Compose 来构建一个自己的 Nginx。

  • 创建文件夹:mkdir -p /usr/local/docker/nginx
  • 创建 index.htmlecho'Hello Docker Compose!'> index.html
  • 创建 Dockerfilevi Dockerfile内容如下:FROM nginx:latestMAINTAINER Micromaple <[email protected]>COPY index.html /usr/share/nginx/html/index.htmlEXPOSE 80
  • 创建 docker-compose.ymlversion:'3.1'services:nginx:build: . ports:-"80:80"
  • 运行 Docker Compose 项目docker-compose up
  • 访问此时访问 http://ip 可以看到页面如下访问

四、模板文件

模板文件是使用

Compose

的核心,涉及到的指令关键字也比较多。默认的模板文件名称为

docker-compose.yml

,格式为

YAML

格式。

version:"3"services:nginx:image: nginx
    ports:-"80:80"volumes:-"./html:/usr/share/nginx/html"

每个服务都必须通过

image

指令指定镜像或

build

指令(需要 Dockerfile)等来自动构建生成镜像。

使用

build

指令,在

Dockerfile

中设置的选项(例如:

CMD

EXPOSE

VOLUME

ENV

等) 将会自动被获取,无需在

docker-compose.yml

中再次设置。

4.1、常用指令

1)、build

指定

Dockerfile

所在文件夹的路径(可以是绝对路径,或者相对

docker-compose.yml

文件的路径)。

Compose

将会利用它自动构建这个镜像,然后使用这个镜像。

version:'3.1'services:nginx:build: .

也可以使用

context

指定 Dockerfile 所在文件夹的路径。使用

dockerfile

指令指定 Dockerfile 文件名。使用

arg

指令指定构建镜像时的变量。如下:

version:'3.1'services:nginx:build:context: ./dir
      dockerfile: Dockerfile-nginx
      args:buildno:1

2)、command

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

version:"3.1"services:nginx:image: nginx
    ports:-"80:80"command: echo "hello world"

3)、container_name

指定容器名称。默认将会使用

项目名称_服务名称_序号

这样的格式。

version:"3.1"services:nginx:image: nginx
    container_name: nginx_web
    ports:-"80:80"command: echo "hello world"

4)、depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动

redis
db

在启动

web
version:'3.1'services:web:build: .
    depends_on:- db
      - redis
  redis:image: redis
  db:image: postgres

注意:

web

服务不会等待

redis
db

完全启动之后才启动。

5)、env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过

docker-compose -f FILE

方式来指定 Compose 模板文件,则

env_file

中变量的路径会基于模板文件路径。

如果有变量名称与

environment

指令冲突,则按照惯例,以后者为准。

env_file: .env

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

环境变量文件中每一行必须符合格式,支持

#

开头的注释行。

# common.env: Set development environment
PROG_ENV=development

6)、environment

设置环境变量。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。

environment:RACK_ENV: development
  SESSION_SECRET:environment:- RACK_ENV=development
  - SESSION_SECRET

如果变量名称或者值中用到

true|false,yes|no

等表达

布尔

含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括如下:

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

7)、expose

暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数

expose:-"3000"-"8000"

8)、image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,

Compose

将会尝试拉取这个镜像。

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

9)、networks

配置容器链接的网络

version:"3.1"services:some-service:networks:- some-network
     - other-network
networks:some-network:other-network:

10)、ports

暴露端口信息。

使用

宿主端口:容器端口
(HOST:CONTAINER)

格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

ports:-"3000"-"8000:8000"-"49100:22"-"127.0.0.1:8001:8001"

注意:当使用

HOST:CONTAINER

格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为

YAML

会自动解析

xx:yy

这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

11)、secrets

存储敏感数据,例如

mysql

服务密码。

version:"3.1"services:mysql:image: mysql
  environment:MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
  secrets:- db_root_password
    - my_other_secret

secrets:my_secret:file: ./my_secret.txt
  my_other_secret:external:true

12)、volumes

数据卷所挂载路径设置。可以设置宿主机路径,

宿主机路径:容器内路径

HOST:CONTAINER

) 或加上访问模式(

HOST:CONTAINER:ro

)。

宿主机路径可以为相对路径,相对路径基于 Compose 模板文件路径。

volumes:- /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

13)、privileged

允许容器中运行一些特权命令。

privileged:true

14)、restart

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为

always

或者

unless-stopped

restart: always

4.2、变量读取

Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的

.env

文件中的变量。

使用 Compose 文件从运行的环境中读取变量

${nginx_version}

的值,并写入执行的指令中。

version:"3.1"services:web:image:"nginx:${nginx_version}"

执行

nginx_version=1.20 docker-compose up

则会启动一个

nginx:1.20

镜像的容器

$ dockerps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c1f23dd35d51        nginx:1.20          "/docker-entrypoint.…"10 seconds ago      Up 10 seconds       80/tcp              nginx2-web-1

若当前目录存在

.env

文件,执行

docker-compose

命令时将从该文件中读取变量。

在Compose 模板文件路径新建

.env

文件,并写入以下内容

nginx_version=1.22
env

文件支持

#

号注释

执行

docker-compose up

则会启动一个

nginx:1.22

镜像的容器。

$ dockerps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
86fe34faf119        nginx:1.22          "/docker-entrypoint.…"4 seconds ago       Up 4 seconds        80/tcp              nginx2-web-1

五、常用命令

前台运行

docker-compose up

后台运行

docker-compose up -d

启动容器

docker-compose start

停止容器

docker-compose stop

停止并移除容器

docker-compose down

六、实战

以安装运行 MySQL5.7 为例。

创建 Docker Compose 模板文件

#创建文件夹mkdir /usr/local/docker/mysql
cd /usr/local/docker/mysql
#创建模板文件vi docker-compose.yml

内容如下:

version:'3.1'services:# mysqlmysql:image: mysql:5.7.38
    container_name: mysql
    restart: always
    ports:- 3306:3306volumes:- ./data:/var/lib/mysql
    environment:TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD:123456command:--character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M

运行容器

docker-compose up -d

查看容器运行状态

$ docker-composeps
NAME                COMMAND                  SERVICE             STATUS              PORTS
mysql               "docker-entrypoint.s…"   mysql               running             0.0.0.0:3306->3306/tcp, 33060/tcp

使用 MySQL 数据库连接工具连接。如果连接失败请检查防火墙。
连接MySQL

读到这里,想必你已经对 Docker Compose 的使用有了更加深入的理解,快跟着一起动手吧。别忘了三连支持博主呀~
我是微枫Micromaple,期待你的关注~💪💪💪

标签: docker 云原生 linux

本文转载自: https://blog.csdn.net/qq_41779565/article/details/126373801
版权归原作者 微枫Micromaple 所有, 如有侵权,请联系我们删除。

“【云原生】Docker Compose从入门到实践”的评论:

还没有评论