使用docker-compose高效部署常见应用
一、安装Docker Compose
1、概述
当服务器上安装的docker镜像比较多的时候,如果每次输入命令自行启动会比较费时费力,为了简化我们重复的操作,Docker Compose出现了,它是用Python编写的一款自动化管理多个Docker的应用程序,可以帮助我们轻松、高效地管理容器。
docker官网对Docker Compose的描述(原文地址:https://docs.docker.com/compose/)
Docker Compose是一个用于定义和运行多容器docker应用程序的工具。通过撰写,您可以使用YAML文件配置应用程序的服务。然后,使用一个命令创建并启动配置中的所有服务。
2、Docker Compose的下载和安装
(1)可以去官方下载地址:Releases · docker/compose (github.com) 下载linux版,然后通过远程连接工具传输到linux系统的/usr/local/bin目录下,官方github上发布的版本名字比较长,直接改成docker-compse即可。
linux下面还可以使用下面的命令进行下载,会自动下载到/usr/local/bin目录下
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
下载完之后需要为docker-compose添加可执行权限
chmod +x /usr/local/bin/docker-compose
二、编写Docker Compose可以识别的YAML脚本
我们可以通过编写YAML脚本,配置容器启动时的各个参数,然后使用Docker Compose来解析并按照我们的要求一次性启动多个容器
例如:通过编写一个YAML脚本来运行tomcat
vim docker-compose.yml //编写脚本
//脚本内容如下:
version: "3.8" #指定版本
services: #可以同时配置多个服务,一个docker容器就是一个服务
tomcat: #指定服务类型为tomcat
restart: always #服务暂停以后总会重启
image: tomcat #服务基于的镜像
container_name: tomcat #服务(容器)名称
ports:
- 80:8080 #将容器的80端口映射到宿主机的8080端口
注:其中“#”是注释符;YAML脚本中严格缩进,大小写敏感,缩进只能使用空格,不能使用tab键。
配置文件可以保留,以后在其他服务器上部署的时候可以复制粘贴,当我们直接将带有缩进的配置文件粘贴到vim编辑器之后,原本的缩进会乱,如下图所示。我们虽然粘贴好了,但还需要调整缩进,很麻烦,特别是配置文件中有很多行的话,那改起来简直要人命了。
这时有个小技巧,可以使用vim的原样粘贴
先输入冒号进入命令模式,再输入下面的指令,回车
:set paste
最后输入i切换到插入模式,粘贴,如下图所示。
缩进没有问题,显示正常,是不是很棒呢!
保存并退出,配置完成。接下来就可以使用Docker Compose启动了。
三、Docker Compose的用法
注意:使用docker-compose前必须把docker安装好,否则无法启动。
使用下面的命令启动刚才的配置好的容器服务
cd /usr/local/docker/tomcat //进入编写的docker-compose.yml的目录
docker-compose docker-compose.yml //启动yml脚本中配置的服务
//如果想要让服务在后台运行,可以在命令后面跟上 -d参数
docker-compose docker-compose.yml -d
有启动当然也有停止,使用如下的命令
docker-compose down
四、使用Docker Compose部署常用的软件
1、部署Tomcat
在/usr/local/docker/tomcat
目录下创建一个docker-compose.yml
,内容如下:
####tomcat
version: "3.8" #指定版本
services: #可以同时配置多个服务,一个docker容器就是一个服务
tomcat: #指定服务类型为tomcat
restart: always #服务暂停以后总会重启
image: tomcat #服务基于的镜像
container_name: tomcat #服务(容器)名称
ports:
- 80:8080 #将容器的80端口映射到宿主机的8080端口
volumes: #数据卷
#为了将应用的产生的数据持久化,
#需要将docker容器中的虚拟目录映射到宿主机的目录
- ./webapps/ROOT:/usr/local/tomcat/webapps/ROOT
environment:
TZ: Asia/Shanghai #时区
使用Docker Compose启动:
docker-compose up -d
2、部署MySQL
在/usr/local/docker/mysql
目录下创建一个docker-compose.yml
,内容如下:
####mysql
version: "3.8"
services:
db:
#目前最新的版本是MySQL8.x
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
#MySQL的Web客户端
adminer:
image: adminer
restart: always
ports:
- 8081:8080
注:Adminer是一个MySQL的Web客户端,登录后在变量一栏中可以查看各种MySQL的配置参数,可以并且每个参数都链接到了MySQL官网的详细说明文档的对应位置。
使用Docker Compose启动:
docker-compose up -d
3、部署GitLab服务器
这里选择使用的镜像是国内大神开源的汉化版GitLab,开源项目地址:https://github.com/twang2218/gitlab-ce-zh,在这个地址上可以浏览最新的GitLab
的docker-compose.yml
。
在/usr/local/gitlab
目录下创建一个docker-compose.yml
,参照开源项目最新版说明进行修改,内容如下:
####gitlab:git私服
version: '3.8'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh'
restart: always
hostname: '192.168.1.100'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.1.100'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 80
ports:
- '80:80'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
GitLab
启动时比较慢,访问不成功先等待,或者使用下面的命令查看启动时输出的日志
docker ps -a //查看GitLab启动后的容器ID
docker logs -f <GitLab启动后的容器ID> //根据启动时输出的日志,观察启动进度
//或者使用
docker-compose logs -f
启动后在浏览器输入访问地址,根据实际配置来,我这里设置的是192.168.1.100
,端口是80
。成功的话会提示你设置初始密码。然后用root
账号和设置的初始密码登录。root
用户一般用来开户和处理其他用户密码忘记的情况等重要情况,而不用于开发,所以最好再创建一个新用户,然后用新用户去进行开发操作。
4、部署maven私服Nexus服务器
在/usr/local/docker/nexus
目录下创建一个docker-compose.yml
,内容如下:
####nexus:maven私服
version: '3.8'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus
ports:
- 8081:8081
volumes:
- nexus-data:/nexus-data
volumes:
nexus-data:
把数据卷配置成空,它会默认把数据卷挂到宿主机的相应位置。
在浏览器中访问nexus
首页,需要进行登录,目前的Nexus3.28
的用户名是admin但是默认密码不再是以前的amdin123
了,那么就需要在启动的容器中去寻找密码,输入以下命令:
docker ps -a //查看容器id
docker exec -it <容器id> bash 进入容器
cat /opt/sonatype/sonatype-work/nexus3/admin.password
将密码复制出来,密码比较长,要复制全了;使用复制的密码就可以登录成功。
(1)在maven
项目中配置私服
在pom.xml
加入如下配置:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://192.168.1.100:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://192.168.1.100:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://192.168.1.100:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Plugin Repository</name>
<url>http://192.168.1.100:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
(2)如果在使用过程中想让maven能够把本地项目的jar包上传到nexus
,需要找到在maven
的conf
目录下的setting.xml
,然后在标签中加入如下配置:
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
5、部署Docker私服
####registry:docker私服
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
6、部署FastDFS文件服务器
在网上找了1个docker-compose.yml
模板,参考这个大哥的GitHub
配置文件,仓库地址:https://github.com/dongweibh/fastdfs-docker-script,建议把它的docker-compose.yml
和nginx.conf
和storage.conf
都下载下来,或者新建同名文件拷贝内容,将这三个配置文件都放在一个目录下。建议除了改下端口之外,其他都保持默认配置。
# 进入到docker-compose.yml文件所在的目录,启动
docker-compose up -d
# 进入fastdfs容器,验证是否正常启动
docker exec -it storage /bin/bash
# 进入 storage 容器中使用命令上传一个图片, 可使用容器自带的测试图片, 也可 docker cp 将本机图片复制进来
cd /fdfs_conf
fdfs_upload_file storage.conf anti-steal.jpg #上传一个图片吧, 返回路径如 /group1/M00/00/00/xxxx
# 访问 localhost:8088/group1/M00/00/00/xxxx 吧
docker-compose.yml
配置文件:
version: '2'
services:
tracker:
image: season/fastdfs:1.2
container_name: tracker
restart: always
volumes:
- "./tracker_data:/fastdfs/tracker/data"
ports:
- "22122:22122"
command: "tracker"
storage:
image: season/fastdfs:1.2
container_name: storage
links:
- tracker
restart: always
volumes:
- "./storage.conf:/fdfs_conf/storage.conf"
- "./storage_base_path:/fastdfs/storage/data"
- "./store_path0:/fastdfs/store_path"
ports:
- "23000:23000"
environment:
TRACKER_SERVER: "tracker:22122"
command: "storage"
nginx:
image: season/fastdfs:1.2
container_name: fdfs-nginx
restart: always
volumes:
- "./nginx.conf:/etc/nginx/conf/nginx.conf"
- "./store_path0:/fastdfs/store_path"
links:
- tracker
ports:
- "8088:8088"
environment:
TRACKER_SERVER: "tracker:22122"
command: "nginx"