一、安装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/v2.18.0/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/docker/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"

如果部署在阿里云等云服务器上,编写springboot程序,然后上传图片的时候报了如下错误:

2022-02-23 21:40:38.229 ERROR 25340 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/172.23.0.3:23000] with root cause

原因是:本地环境中通过连接宿主机的22122端口能够访问docker内部的22122端口,并拿到可用来存储的storage地址,这个地址就是172.23.0.3,问题是,当我们的请求是从外部到达宿主机再到docker内部的时候,172.23.0.3地址对于docker和宿主机是可见的,但172.23.0.3这个存储地址返回到外部调用点时,外部调用点springboot程序是不能识别的,因此外部调用接口得到地址“172.23.0.3:23000”后想要上传图片,会报出无法进行连接的错误。对于这个问题更具体的说明参考原文链接:https://blog.csdn.net/Jack_Roy/article/details/103564835

解法方法:

# 进入tracker的docker container
docker exec -it tracker /bin/bash;
# 由于后续操作需要使用网络下载iptables,而docker镜像中是默认没有的
# 我的docker镜像底层是基于Debian的,用的软件包管理工具是apt-get,需要先换源,这里直接换阿里云的速度最快。
vim /etc/apt/sources.d
deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib
deb http://mirrors.aliyun.com/debian-security stretch/updates main
deb-src http://mirrors.aliyun.com/debian-security stretch/updates main
deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib

# 安装iptables
apt-get install iptables -y;
# 添加iptables NAT表规则
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 22122 -d 172.23.0.3 -j SNAT --to 宿主机IP;
# 查看NAT表规则
iptables -L -t nat;
# 退出当前容器
exit

# 在宿主机上停掉storage容器
docker stop storage
# 再启动storage容器
docker container start storage

做完这些步骤发现并没有什么卵用,哈哈,醉了,百度了一番还是不行,那就曲线救国吧,去fastdfs的作者的GitHub仓库看看,地址:https://github.com/happyfish100/fastdfs

还真找到了方法,只能说作者牛逼,先把项目克隆到本地,然后把docker/dockerfile_network/上传到linux服务器上,在dockerfile_network目录下有现成的Dockerfile文件,为了后续构建过程能稳定进行不报错,先打开Dockerfile文件,将16-18行的https改成git,这么做的原因是构建的过程中会去作者的GitHub仓库去下载代码到本地进行编译,而国内访问GitHub经常受限,如果不改为git,极容易下载失败。
在这里插入图片描述

接下来直接构建即可,命令如下:

# 构建镜像,自己取个名字
docker build -t candyfastdfs .
# 构建过程需要几分钟,耐心等待
# 构建好以后查看一下镜像列表
docker images

下一步启动镜像

docker run -d -e FASTDFS_IPADDR=宿主机ip -p 8888:8888 -p 22122:22122 -p 23000:23000 -p 8011:80 --name 容器启动后的名称 candyfastdfs

7、部署redis

redis.conf

bind 0.0.0.0
protected-mode no
port 6379
timeout 0
save 900 1 # 900s内至少一次写操作则执行bgsave进行RDB持久化
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
appendonly yes
appendfsync everysec
requirepass 123456

docker-compose.yml

version: '3'

services:
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - 6379:6379
    volumes:
      - ./redis.conf:/etc/redis/redis.conf:rw
      - ./data:/data:rw
    command: ["redis-server","/etc/redis/redis.conf"]

8、部署Jenkins

参考博客:
https://blog.csdn.net/weixin_43820024/article/details/129128449
https://www.jianshu.com/p/b92eb10cacf2
docker-compose.yml文件内容如下:

version: "3"
services:
  candy-jenkins:
    build: ./
    container_name: candy-jenkins
    user: root
    restart: always
    privileged: true
    ports:
      - 18080:8080
      - 50000:50000
    environment:
      - TZ=Asia/Shanghai
      # 解决远程调用触发构建接口403的问题
      - JAVA_OPTS=-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
    volumes:
      - ./data/:/var/jenkins_home/
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/docker/daemon.json:/etc/docker/daemon.json
      - /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
      - /root/:/root/
      - ./data/maven_repo/:/opt/maven-3.9.0/repository/
      #- /usr/local/maven:
      #为了跟mysql服务在同一个网络下,需要先在安装docker的物理机上执行docker network create jenkins-mysql,mysql服务中也是相同的配置
    networks:
      - jenkins-mysql
networks:
  jenkins-mysql:
    external: true

去apache官网下载Maven
然候对maven的settings.xml中修改如下配置,并将该文件上传到Dockerfile文件同一目录下

<!-- 修改本地Maven仓库地址 -->
<localRepository>/opt/maven-3.9.0/repository</localRepository>
<!-- 添加阿里云镜像仓库 -->
<mirror>
  <id>alimaven</id>
  <mirrorOf>central</mirrorOf>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
  <mirror>
  <id>repo1</id>
  <mirrorOf>central</mirrorOf>
  <name>repo1 maven</name>
  <url>https://repo1.maven.org/maven2</url>
</mirror>
<mirror>
  <id>maven-default-http-blocker</id>
  <mirrorOf>external:http:*</mirrorOf>
  <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
  <url>http://0.0.0.0/</url>
  <blocked>true</blocked>
</mirror>

Dockerfile文件内容如下:

FROM jenkins/jenkins:2.414
USER root
WORKDIR /opt
ADD apache-maven-3.9.0-bin.tar.gz /opt
RUN mv apache-maven-3.9.0 maven-3.9.0
ENV MAVEN_HOME /opt/maven-3.9.0
ENV PATH=$PATH:$MAVEN_HOME/bin
COPY settings.xml maven-3.9.0/conf/settings.xml
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐