【云原生】Docker Compose从入门到实践
本文是讲解了如何安装使用 Docker Compose,Compose 模板文件的常用指令,以及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
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 15 20:56 ./
drwxr-xr-x 13 root root 4096 Jul 27 23:16 ../
-rwxr-xr-x 1 root root 25804800 Aug 15 20:50 docker-compose*
查看 docker-compose 版本
root@ubuntu:/usr/local/bin# docker-compose -v
Docker Compose version v2.9.0
2.2、系统命令安装
下载 docker-compose。网速很慢的话,建议采用第一种方式。
sudo curl -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.html
echo 'Hello Docker Compose!' > index.html
-
创建 Dockerfile
vi Dockerfile
内容如下:
FROM nginx:latest MAINTAINER Micromaple <ycqmail@vip.qq.com> COPY index.html /usr/share/nginx/html/index.html EXPOSE 80
-
创建 docker-compose.yml
version: '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
镜像的容器
$ docker ps
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
镜像的容器。
$ docker ps
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:
# mysql
mysql:
image: mysql:5.7.38
container_name: mysql
restart: always
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--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-compose ps
NAME COMMAND SERVICE STATUS PORTS
mysql "docker-entrypoint.s…" mysql running 0.0.0.0:3306->3306/tcp, 33060/tcp
使用 MySQL 数据库连接工具连接。如果连接失败请检查防火墙。
读到这里,想必你已经对 Docker Compose 的使用有了更加深入的理解,快跟着一起动手吧。别忘了三连支持博主呀~
我是微枫Micromaple,期待你的关注~💪💪💪
更多推荐
所有评论(0)