一、安装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编辑器之后,原本的缩进会乱,如下图所示。我们虽然粘贴好了,但还需要调整缩进,很麻烦,特别是配置文件中有很多行的话,那改起来简直要人命了。

yaml文件在控制台粘贴以后缩进混乱

这时有个小技巧,可以使用vim的原样粘贴

先输入冒号进入命令模式,再输入下面的指令,回车

:set paste

最后输入i切换到插入模式,粘贴,如下图所示。

set paste 模式以后复制yaml文件缩进正常

缩进没有问题,显示正常,是不是很棒呢!

保存并退出,配置完成。接下来就可以使用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,在这个地址上可以浏览最新的GitLabdocker-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,需要找到在mavenconf目录下的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.ymlnginx.confstorage.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"