赞
踩
当服务器上安装的docker镜像比较多的时候,如果每次输入命令自行启动会比较费时费力,为了简化我们重复的操作,Docker Compose出现了,它是用Python编写的一款自动化管理多个Docker的应用程序,可以帮助我们轻松、高效地管理容器。
docker官网对Docker Compose的描述(原文地址:https://docs.docker.com/compose/)
Docker Compose是一个用于定义和运行多容器docker应用程序的工具。通过撰写,您可以使用YAML文件配置应用程序的服务。然后,使用一个命令创建并启动配置中的所有服务。
(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
我们可以通过编写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安装好,否则无法启动。
使用下面的命令启动刚才的配置好的容器服务
cd /usr/local/docker/tomcat //进入编写的docker-compose.yml的目录
docker-compose docker-compose.yml //启动yml脚本中配置的服务
//如果想要让服务在后台运行,可以在命令后面跟上 -d参数
docker-compose docker-compose.yml -d
有启动当然也有停止,使用如下的命令
docker-compose down
在/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
在/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
这里选择使用的镜像是国内大神开源的汉化版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
用户一般用来开户和处理其他用户密码忘记的情况等重要情况,而不用于开发,所以最好再创建一个新用户,然后用新用户去进行开发操作。
在/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>
####registry:docker私服
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
在网上找了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
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"]
参考博客:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。