使用docker-compose高效部署常见应用
使用docker-compose高效部署常见应用一、安装Docker Compose1、概述2、Docker Compose的下载和安装二、编写Docker Compose可以识别的YAML脚本三、Docker Compose的用法四、使用Docker Compose部署常用的软件1、部署Tomcat2、部署MySQL3、部署GitLab服务器4、部署maven私服Nexus服务器5、部署Dock
使用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/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编辑器之后,原本的缩进会乱,如下图所示。我们虽然粘贴好了,但还需要调整缩进,很麻烦,特别是配置文件中有很多行的话,那改起来简直要人命了。
这时有个小技巧,可以使用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/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
,需要找到在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"
如果部署在阿里云等云服务器上,编写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
更多推荐
所有评论(0)