docker进阶:docker-compose
docker
三剑客之一,是一个用来把docker
自动化的东西,属于一个应用层服务,使用yml
文件可以定义哪个容器组运行哪应用,支持动态改变应用,并在需要时扩展,可以对一组容器通过一条命令启动,停止,重启等服务,可以理解为是一个脚本工具,使用配置文件管理容器组,下面简单介绍一下使用方法。
docker-compose 安装
安装
[root@docker-1 ~]# curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@docker-1 ~]# chmod +x /usr/local/bin/docker-compose
[root@docker-1 ~]# docker-compose --version
docker-compose.yml 文件命令说明
使用yml
文件,ansible
的playbook
用的也是这个,类似XML
数据描述语言,简单说一下YAML
文件格式的注意事项
- 不支持制表符
tab
键缩进,需要使用空格 - 通常开头缩进两个空格
- 字符后缩进一个空格,如冒号,逗号,横杠
- 用井号注释
- 如果包含特殊字符用单引号引起来
- 布尔值(true.false.yes.no.on.off),必须用引号引起来,分析器会解释字符串
标准的配置文件应该包含version
、services
、network
三大部分,关键就是services
和networks
两个部分,下面介绍一下services
的书写规则,一个最简单的例子,其实docker-compose
很多命令和docker
的命令效果一样,现在构建一个nginx
,将容器的端口映射一下,开撸。
最简单的栗子
使用yml
文件启用一个nginx
服务,阔以对外服务的那种。
[root@docker-1 ~]# mkdir /docker-compose -p
[root@docker-1 ~]# cd /docker-compose/
[root@docker-1 /docker-compose]# vim nginx.yml
version: '2'
services:
nginx:
image: nginx
ports:
- "80:80"
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Creating nginx_nginx_1_2f9e6d9126ff ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name Command State Ports
------------------------------------------------------------------------------
nginx_nginx_1_65be600b7a4f nginx -g daemon off; Up 0.0.0.0:80->80/tcp
[root@docker-1 /docker-compose]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.15.6
Date: Thu, 22 Nov 2018 08:44:41 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Nov 2018 13:32:09 GMT
Connection: keep-alive
ETag: "5be197d9-264"
Accept-Ranges: bytes
emmmmm,大概就是这样,说一下上面yml
文件所用到参数。
yml
参数
参数 | 含义 |
---|---|
version | 定义版本 |
services | 定义服务名称 |
image | 使用哪个镜像,如果不存在会pull |
posts | 要映射的端口 |
命令参数
参数 | 含义 |
---|---|
-f | 指定配置文件,默认使用当前目录的docker-compose.yml |
up | 启动服务 |
-d | 后台运行 |
ps | 查看长在运行的服务 |
接下来把他删了吧,留着没啥子用
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml stop
Stopping nginx_nginx_1_65be600b7a4f ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml rm
Going to remove nginx_nginx_1_65be600b7a4f
Are you sure? [yN] y
Removing nginx_nginx_1_65be600b7a4f ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name Command State Ports
------------------------------
最简单的例子就是这样,下面是services
部分常用参数。
services部分
一些比较常用的参数,不是全部的撒
build
这个类似上面的image
参数,也是指定一个镜像,不同的是他可以基于Dockerfile
去构建,Compose
会利用Dockerfile
去构建这个镜像,然后使用这个镜像去启动服务容器。
栗子
我博客现在也是跑在容器上的,之前在做的时候也写过Dockerfile
,所以就拿之前写的nginx
试一下,Dockerfile
内容如下
[root@docker-1 /docker-compose]# cat Dockerfile
FROM centos:latest
ENV LANG en_US.utf8
ADD nginx.tar.gz /usr/local/
RUN useradd www-data -u 33 -s /sbin/nologin
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo Asia/Shanghai > /etc/timezone \
ENV PATH /usr/local/nginx/sbin:$PATH
CMD ["nginx", "-g", "daemon off;"]
nginx.yml内容
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
build: .
image: centos7-nginx
ports:
- "80:80"
- "443:443"
build
这里的话可以写相对路径,绝对路径,我是放在当前目录的,所用的.
,下面构建试试
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
输入如下。
访问的话应该是直接301
到rj-bai.com
[root@docker-1 /docker-compose]# curl -i -s 127.0.0.1 | head
HTTP/1.1 301 Moved Permanently
Server: rj-bai
Date: Thu, 22 Nov 2018 10:09:24 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive
Location: https://rj-bai.com
没问题,就是我现在用的nginx
,上面build
和image
同时出现,结果就是使用Dockerfile
构建镜像,使用image
指定的参数会成为镜像名称,现在有的镜像应该是三个,分别是nginx¢os¢os7-nginx
,看一下。
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-nginx latest a630ad02d409 14 minutes ago 208MB
nginx latest 62f816a209e6 2 weeks ago 109MB
centos latest 75835a67d134 6 weeks ago 200MB
command
替换容器默认命令,和写在Dockerfile
里的CMD
功能一致,没啥子卵用,一般都会在Dockerfile
中定义,查看默认命令。
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name Command State Ports
----------------------------------------------------------------------------------------------------
nginx_nginx_1_b60a4e38c609 nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
container_name
指定容器名称,阔以随便写,但不能重复
container_name: nginx
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name Command State Ports
-------------------------------------------------------------------------------
nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
hostname
用户指定容器主机名
hostname: nginx
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml exec nginx /bin/bash -c "hostname"
nginx
depends_on
定义容器的先后启动顺序,栗子,加一个PHP
服务,先启动php服务
再启动nginx
服务,效果就是先创建php
,在创建nginx
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
build: .
image: centos7-nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
depends_on:
- php
php:
image: php:7.2-fpm
hostname: php
container_name: php
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Creating php ... done
Creating nginx ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name Command State Ports
----------------------------------------------------------------------------------------
nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
php docker-php-entrypoint php-fpm Up 9000/tcp
DNS
用于指定容器DNS
服务器地址,也没啥子卵用,栗子。
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
build: .
image: centos7-nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
dns:
- 202.106.0.20
- 223.5.5.5
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Recreating nginx ... done
[root@docker-1 /docker-compose]# docker inspect 005ba758c836 | grep -i "dns" -C 3
"Dns": [
"202.106.0.20",
"223.5.5.5"
tmpfs
挂载临时目录到容器内,与run --tmpfs
效果一致,栗子。
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
build: .
image: centos7-nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
dns:
- 223.5.5.5
- 202.106.0.20
tmpfs:
- /data
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Recreating nginx ... done
[root@docker-1 /docker-compose]# docker inspect e1e1c61a6e61 | grep -i "tmpfs" -A 1
"Tmpfs": {
"/data": ""
entrypoint
也就是Dockerfile
中的entrypoint
,和CDM
的区别,看这里,栗子。
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
build: .
image: centos7-nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
dns:
- 223.5.5.5
- 202.106.0.20
tmpfs:
- /data
entrypoint:
- /bin/bash
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name Command State Ports
----------------------------------
nginx /bin/bash Exit 0
environment
环境变量,也就是docker -e
的效果,最简单的一个栗子,启动一个mysql
,设置root
密码为Sowhat?
,映射端口,能正常使用的那种。
[root@docker-1 /docker-compose]# cat mysql.yml
version: '3'
services:
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
Creating mysql ... done
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml ps
Name Command State Ports
-------------------------------------------------------------------------------
mysql docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
用别的服务器连一下试试撒
[root@nginx ~]# mysql -uroot -pSowhat? -h192.168.1.93 -e "show databases ;"
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
大概就这样。
expose
添加要暴露端口,栗子。
[root@docker-1 /docker-compose]# cat mysql.yml
version: '3'
services:
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
expose:
- "3307"
- "3308"
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
Creating mysql ... done
[root@docker-1 /docker-compose]# docker inspect 4c7f8416e054 | grep -i "Port" -C 6
"Ports": {
"3306/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "3306"
}
],
"33060/tcp": null,
"3307/tcp": null,
"3308/tcp": null
},
external_links
用于连接使用docker run
启动的容器,栗子,先用docker run
去启动一个容器,就redis吧
[root@docker-1 /docker-compose]# docker run -d -p 6379:6379 --hostname redis --name redis redis
[root@docker-1 /docker-compose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3b1602bb896 redis "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:6379->6379/tcp redis
redis
容器是我用docker run
启动的,我现在想用docker-compose
启动一个MySQL
,需要和redis
进行连接,操作如下。
[root@docker-1 /docker-compose]# cat mysql.yml
version: '3'
services:
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
expose:
- "3307"
- "3308"
external_links:
- redis
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
[root@docker-1 /docker-compose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8a833534bb6 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3307-3308/tcp, 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
d3b1602bb896 redis "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:6379->6379/tcp redis
[root@docker-1 /docker-compose]# docker inspect c8a833534bb6 | grep -i "links" -A 3
"Links": [
"redis:redis"
],
"Aliases": [
建立连接的前提是容器都在同一个网络内才可以
extra_hosts
向容器的/etc/hosts
添加记录,类似--add-host
,现在把redis
添加到mysql
容器的hosts
文件中
[root@docker-1 /docker-compose]# cat mysql.yml
version: '3'
services:
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
expose:
- "3307"
- "3308"
external_links:
- redis
extra_hosts:
- "redis:192.168.1.93"
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml exec mysql /bin/bash -c "cat /etc/hosts"
192.168.1.93 redis
links
容器之间互联,和docker run --link
效果一致,栗子。
[root@docker-1 /docker-compose]# cat mysql.yml
version: '3'
services:
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
links:
- redis
redis:
image: redis
hostname: redis
container_name: redis
ports:
- "6379:6379"
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml exec mysql ping -c 1 redis
PING redis (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: icmp_seq=0 ttl=64 time=0.098 ms
posts
这个就是端口映射,上面写过了,栗子。
ports:
- "3306:3306"
前面的3306
是宿主机的端口,后面的3306
是容器的端口,映射用的就是iptables
的nat
。
volumes
挂在一个文件或目录到容器中,和docker -v
一样,栗子。
[root@docker-1 /docker-compose]# mkdir /data/www -p
[root@docker-1 /docker-compose]# echo rj-bai > /data/www/index.html
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
image: nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- /data/www:/var/www/html
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Recreating nginx ... done
[root@docker-1 /docker-compose]# curl 127.0.0.1
rj-bai
默认权限为rw
,需要只读使用ro
volumes_from
从其他容器挂载数据卷,和--volumes-from
一致,可以是容器的名称,也可以是服务的名称,很简单,栗子。
volumes_from:
- nginx
网络部分
docker
默认情况下采取的网络模式就是bridge
,指定网络模式主要作用就是为了隔离,提升安全性,查看当前存在的网络有哪些,可以用以下命令查看。
[root@docker-1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
343d2d507baf bridge bridge local
1a61bbca48e9 docker-compose_default bridge local
2906cfa53bd0 docker_default bridge local
d60de66fa405 host host local
d3fcdc0b06ff nginx_default bridge local
ea4a1a6961f0 none null local
查看每个网络的详情用下面的命令去看。
[root@docker-1 ~]# docker network inspect {网络名称}
之前看到过一篇介绍docker
网络非常好文章,地址,可以去了解一下,这里的话大概介绍一下如何使用yml
去定义容器组的网络,栗子,使用新网络。
使用现有网络
现在吧之前启动的容器全部删掉,包括添加的网络,随便写个服务启动。
[root@docker-1 /docker-compose]# cat lnmp.yml
version: '3'
services:
lnmp:
image: nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
php:
image: php:7.2-fpm
hostname: php
container_name: php
[root@docker-1 /docker-compose]# docker-compose -f lnmp.yml up -d
Creating network "docker-compose_default" with the default driver
Creating mysql ... done
Creating nginx ... done
Creating php ... done
[root@docker-1 /docker-compose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
343d2d507baf bridge bridge local
7a9007f760ca docker-compose_default bridge local
d60de66fa405 host host local
ea4a1a6961f0 none null local
我刚刚启动了三个容器,分别是nginx&mysql&php
,启动命令后输出第一行提示创建了一个名为docker-compose_default
的网络,上面能看到是一个bridge
模式的网络,看一下详情,输入过长,捡重点
[root@docker-1 /docker-compose]# docker network inspect docker-compose_default
"Config": [
{
"Subnet": "172.26.0.0/16",
"Gateway": "172.26.0.1"
}
]
这是默认创建的,下面去指定一下网络,新建一个网络叫lnmp
给这个容器组使用,看一下当前容器的地址是什么
[root@docker-1 /docker-compose]# docker inspect nginx | grep -i "ipaddress"
"IPAddress": "172.26.0.2",
现在是172
网段的,现在手动创建一个,一会切换到这里
[root@docker-1 ~]# docker network create --driver bridge --subnet 12.13.14.0/24 --gateway 12.13.14.254 lnmp
4dcb829c1a60fe38f10aa6f527341bacaf0017871b7fc12f0ef7db2915ea9e1f
4dcb829c1a60 lnmp bridge local
[root@docker-1 ~]# docker network inspect lnmp
"Config": [
{
"Subnet": "12.13.14.0/24",
"Gateway": "12.13.14.254"
}
]
现在网络创建好了,然后去改yml
文件
[root@docker-1 /docker-compose]# cat lnmp.yml
version: '3'
services:
lnmp:
image: nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
networks:
- lnmp
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
networks:
- lnmp
php:
image: php:7.2-fpm
hostname: php
container_name: php
networks:
- lnmp
networks:
lnmp:
external:
name: lnmp
[root@docker-1 /docker-compose]# docker-compose -f lnmp.yml up -d
Recreating php ... done
Recreating nginx ... done
Recreating mysql ... done
[root@docker-1 /docker-compose]# docker inspect nginx | grep -i "ipaddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "12.13.14.1",
现在已经切换lnmp
网络了,如果以后新建容器组不指定网络使用lnmp
,就无法和lnmp
服务容器组通讯,这就是一个最简单的隔离,也可以使用yml
直接新建网络,不用手动去创建的,改一下就好。
使用新建网络
[root@docker-1 /docker-compose]# cat lnmp.yml
version: '3'
services:
lnmp:
image: nginx
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
networks:
- lnmp
mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
networks:
- lnmp
php:
image: php:7.2-fpm
hostname: php
container_name: php
networks:
- lnmp
networks:
lnmp:
driver: bridge
[root@docker-1 /docker-compose]# docker-compose -f lnmp.yml up -d
Creating network "docker-compose_lnmp" with driver "bridge"
Recreating nginx ... done
Recreating php ... done
Recreating mysql ... done
使用driver
参数指定网络类型,一般就是host&bridge&overlay
等,我这里用的bridge
,看一下有没有切换过来。
[root@docker-1 /docker-compose]# docker network inspect docker-compose_lnmp
"Subnet": "172.29.0.0/16",
"Gateway": "172.29.0.1"
[root@docker-1 /docker-compose]# docker inspect nginx | grep -i "ipaddress"
"IPAddress": "172.29.0.3",
切换过来了,对于网络命名这一块,大概说一下,一般情况下你不指定网络类型会这样。
[root@docker-1 ~]# pwd
/root
[root@docker-1 ~]# cat redis.yml
version: '3'
services:
redis:
image: redis
hostname: redis
container_name: redis
ports:
- "6379:6379"
[root@docker-1 ~]# docker-compose -f redis.yml up -d
Creating network "root_default" with the default driver
Creating redis ... done
我在root
家目录,启动了一个redis
,他给我添加了一个名为root_default
的网络,我移动到/tmp
再试试
[root@docker-1 /tmp]# cat redis.yml
version: '3'
services:
redis1:
image: redis
hostname: redis
container_name: redis1
ports:
- "6380:6379"
[root@docker-1 /tmp]# docker-compose -f redis.yml up -d
Creating network "tmp_default" with the default driver
Creating redis1 ... done
又给我添加了一个名为tmp_default
的网络,也就是一个目录一个默认网络,而且网段也不一样,不同目录的容器组都自动隔离了,像刚刚我创建的redis&redis1
就无法互通,除非其中一个指定网络切换就可以了,网络这里的话大概就是这样。
使用scale
这个东西的功能就相当于是复制容器,我先启动一个容器服务,接下来就可以根据这个容器服务去再启动多少个一模一样的东西出来,具体操作如下。
[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
nginx:
image: nginx
hostname: nginx
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Creating docker-compose_nginx_1_148c468cbfe8 ... done
现在一个nginx
服务创建完了,然后再复制出2份。
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml scale nginx=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting docker-compose_nginx_1_35469025cb9f ... done
Creating docker-compose_nginx_2_b371af537b86 ... done
Creating docker-compose_nginx_3_58937cb04357 ... done
[root@docker-1 /docker-compose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd4888c8f389 nginx "nginx -g 'daemon of…" 15 seconds ago Up 13 seconds 80/tcp docker-compose_nginx_3_844aeb94c806
8ebb2a990a6e nginx "nginx -g 'daemon of…" 15 seconds ago Up 13 seconds 80/tcp docker-compose_nginx_2_9930e1634431
cfabcfb3726d nginx "nginx -g 'daemon of…" 39 seconds ago Up 38 seconds 80/tcp docker-compose_nginx_1_35469025cb9f
现在一共是三个了,有两个问题,第一个这样做不能指定容器名称,第二个就是不能映射容器端口了,这个很简单,结束。
实践
构建LNMP
现在结合上面所提到的东西,使用docker-compose
去构建一个lnmp
平台,这个比较简单,哈哈,还是直接拿我博客为例吧,现在也是跑在容器上的,但是之前做的时候是一个一个去启动的,这次用docker-compose
去写一个lnmp
的服务,说搞就搞,开撸。
添加网络
添加一个名为lnmp
的网络,一会直接用这个。
[root@rj-bai ~]# docker network create --driver bridge --subnet 12.13.14.0/24 --gateway 12.13.14.254 lnmp
[root@rj-bai ~]# docker network inspect lnmp
"Config": [
{
"Subnet": "12.13.14.0/24",
"Gateway": "12.13.14.254"
}
]
编写lnmp.yml
这个其实上面写的差不多了,改改就行了,镜像这块直接用我的私有仓库了,我用的阿里云容器镜像服务,我一些常用的镜像已经传上去了,我所使用镜像的构建方式看这里
[root@rj-bai ~]# mkdir /data/lnmp -p
[root@rj-bai ~]# cd /data/lnmp/
[root@rj-bai /data/lnmp]# cat lnmp.yml
version: '3'
services:
nginx:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:blogs-nginx-1.15.6
hostname: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
depends_on:
- phpfpm
links:
- phpfpm
volumes:
- /www/nginx:/var/www/html
restart: always
networks:
- lnmp
mysql:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:blogs-mysql5.7
hostname: mysql
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: Sowhat?
volumes:
- /data/mysql:/var/lib/mysql
restart: always
networks:
- lnmp
phpfpm:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:blogs-php7.2
hostname: phpfpm
container_name: phpfpm
depends_on:
- mysql
links:
- mysql
volumes:
- /www/nginx:/var/www/html
links:
- mysql
restart: always
networks:
- lnmp
networks:
lnmp:
external:
name: lnmp
内容就这样,启动
启动容器组
[root@rj-bai /data/lnmp]# docker-compose -f lnmp.yml up -d --build
执行后就开始自动构建了,构建完成后容器也就启动了,最终结果如下。
只要是写好yml
文件,用docker-compose -d
命令就能像执行脚本一样去安装部署容器,总之要做的一切都写到yml
文件里了,比起手动docker run
方便了太多。
构建zabbix
之前还写过一个容器跑zabbix
的,也就是这个,之前都是一个个手动启的,现在用docker-compose
去启动试试,也是在私有仓库直接pull
的镜像,随便写了一下,大概这样。
编译zabbix.yml
[root@docker-1 /docker-compose]# cat zabbix.yml
version: '3'
services:
mysql:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:mysql-5.7-aliyun
environment:
MYSQL_USER: zabbix
MYSQL_DATABASE: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: Sowhat?
volumes:
- /data/mysql/zabbix:/var/lib/mysql
ports:
- 3306:3306
restart: always
networks:
- zabbix
zabbix-java-gateway:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:zabbix-java-gateway-aliyun
ports:
- 10052:10052
restart: always
networks:
- zabbix
zabbix-server:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:zabbix-server-aliyun
environment:
DB_SERVER_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: Sowhat?
links:
- mysql
ports:
- 10051:10051
depends_on:
- mysql
restart: always
networks:
- zabbix
zabbix-web:
image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:zabbix-web-aliyun
environment:
PHP_TZ: Asia/Shanghai
DB_SERVER_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: Sowhat?
links:
- mysql
ports:
- 80:80
depends_on:
- zabbix-server
- mysql
restart: always
networks:
- zabbix
networks:
zabbix:
driver: bridge
内容就这样,启动
[root@docker-1 /docker-compose]# docker-compose -f zabbix.yml up -d --build
[root@docker-1 /docker-compose]# docker-compose -f zabbix.yml ps
web页面
随便加了个监控主机,有数据
大概就这样,溜了。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。