在上一篇docker笔记中,已经成功构建了一个简单的LNMP环境以及启动维护,但我们发现,这样的构建方式是比较麻烦的,那如果还有数据库mysql、redis、mongodb等本地化服务,怎么加入进行并指定相应路径,这就是本篇需要探讨的docker-compose。
docker-compose的安装可以用原始安装方式或者是pip安装,不论哪种安装,都是几句命令,和下图类似,而由于我之前装过mysql,所以对于docker-compose中需要的mysqld相关的依赖都有,安装速度更快了很多。
在安装完docker-compose后,我们想通过docker-compose ps看是否安装成功,然后发现提示有错误:
pip AttributeError: ‘module’ object has no attribute 'SSL_ST_INIT’
出现这种原因是因为服务器的pyopenssl版本太低了,缺少很多的东西,而我这里用的阿里云的Ubuntu 16.04,因为阿里云一般都会预装python2.7,我也没有装3以上的版本了,所以需要输入如下命令去卸载并安装pyopenssl:
rm -rf /usr/lib/python2.7/dist-packages/OpenSSL
rm -rf /usr/lib/python2.7/dist-packages/pyOpenSSL-0.15.1.egg-info
pip install pyopenssl
即此,我们便可以用docker-compose看到相关的所有命令。
然后关于第二种安装方式要比第一种安装方式慢很多,即我们去镜像源站拉取的方式来完成docker-compose的使用,命令如下:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
速度较慢,但都可以得到下面输入docker-compose提示全部基础命令参数的可视化。
在之前几篇文章中,我都很少有提docker到底是一种什么样的技术,它和虚拟机到底有什么样的不同?其实从compose或者任何一个简单的镜像维护便能找到答案。
docker主打的是版本更新迅速,本地化部署方便,我们可以使用一台虚拟机或者云服务器预装好所有的环境,但如果中途里面有某个环节出现更新或者重大问题我们便不得不回炉重造,而docker便少了这个隐患。可能有人会说,我虚拟机开机就能使用,而docker还需要各种不同的容器启动,比如DNMP(Docker+nginx+MySQL+PHP),那么我最少也要docker run三个容器,然而docker-compose可以解决我们本地化部署的问题。
Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。
使用 Compose 基本会有如下三步流程:
查看docker-compose的用法:
$ docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the name specified
in the client certificate (for example if your docker host
is an IP address)
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pulls service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
另外上一篇我是已经做好了mysql镜像,nginx和PHP的话我直接拉
拿上一篇我们已经做好的docker镜像为例,我们可以写一个docker-
我们还是以上一篇中的docker + nginx + php + mysql为例,我们将上述三个容器全部打包到阿里云,然后撰写docker-compose.yml文件:
然后我们可以到阿里云的镜像中查看是否创建成功:
然后将他们所有的配置文件写在一起做成yml文件,docker-compose.yml为:
version: '3'
services:
nginx:
# 依赖php服务,意味着在启动nginx之前先启动php
depends_on:
- php
# nginx镜像的路径
image: registry.cn-shenzhen.aliyuncs.com/submarineas/test_1:1.0-nginx
# 容器的/home/docker/nginx目录挂载主机中的/home/docker/nginx目录,
# 这样使nginx容器把网站文件和目录存放到主机目录中,持久化和方便管理
volumes:
- /home/docker/nginx:/home/docker/nginx
# nginx意外退出时自动重启
restart: always
# 映射80和443端口
ports:
- "80:80"
- "443:443"
# 容器名称
container_name: nginx
php:
depends_on:
- mysql
image: registry.cn-shenzhen.aliyuncs.com/submarineas/test_1:1.0-php
restart: always
volumes:
- /home/docker/nginx/www:/home/docker/nginx/www
- /home/docker/php:/home/docker/php
container_name: php
mysql:
image: registry.cn-shenzhen.aliyuncs.com/submarineas/test_1:1.0-mysql
volumes:
- /home/docker/mysql:/home/docker/mysql
restart: always
# 设置MYSQL_ROOT_PASSWORD环境变量,这里是设置mysql的root密码。这里为root。
environment:
MYSQL_ROOT_PASSWORD: root
container_name: mysql