Docker Compose实战
Docker Compose 安装 Tomcat
version: '3.1'
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat:8.5.32
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai
Docker Compose 安装 MySQL
mysql5.0
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7.22
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
mysql8.0
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
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:
- ./conf:/etc/mysql/conf.d
- ./logs:/var/log/mysql
- ./data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
adminer是一个简洁的网页数据库管理界面,对MySQL功能的更好支持,更高的性能和更高的安全性。访问地址:http://ip:port
Docker Compose 安装 GitLab
概述
GitLab 是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。它拥有与 Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序 (Wall) 进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
安装
这里以安装汉化的 GitLab 社区版 Docker Image为例,镜像地址: https://hub.docker.com/r/twang2218/gitlab-ce-zh,docker-compose.yml
配置如下:
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:11.1.4'
restart: always
container_name: gitlab
hostname: '192.168.147.138'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.147.138:8080'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '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
设置管理员初始密码
- 启动容器访问地址:http://ip:8080
- 端口 8080 是因为我在配置中设置的外部访问地址为 8080,默认是 80
- 初始化安装完成后效果如下:
- 设置管理员初始密码,这里的密码最好是 字母 + 数字 组合,并且 大于等于 8 位
- 配置完成后登录,管理员账号是 root
注意: 如果服务器配置较低,启动运行可能需要较长时间,请耐心等待
登陆成功之后界面如下:
基本设置
可见性与访问控制
第一次使用时需要做一些初始化设置,点击管理区域-->设置
帐户和限制
关闭头像功能,由于 Gravatar 头像为网络头像,在网络情况不理想时可能导致访问时卡顿
注册限制
由于是内部代码托管服务器,可以直接关闭注册功能,由管理员统一创建用户即可
GitLab 的账户管理
使用时请不要直接通过 root 用户操作,需要先创建用户,然后通过创建的用户操作,如果你是管理员还需要为其他开发人员分配账户
新建用户
点击管理区域-->新建用户
设置账户信息
同时将自己设置为管理员
修改用户密码
由于我们创建时并没有配置邮箱,所以还需要重新编辑用户信息并手动设置密码
点击编辑跳转账户页面设置初始密码
设置后密码后退出使用账号密码登录gitlab,第一次登录会设置新密码。
创建项目
新建项目提供了空白项目、从模板创建以及导入项目三种方式,这里以空白项目为例
输入项目名称及描述信息,设置可见等级为私有,并且是否通过README 的方式来初始化项目
创建好项目如下
拉取推送代码
SSH方式
在账号中 新建 SSH 公钥 之前将无法通过 SSH 拉取或推送代码。SSH 密钥用于在您的电脑和 GitLab 建立安全连接。
在 Git 安装目录下,使用 ssh-keygen 工具生成SSH KEY
ssh-keygen -t rsa -C "your.email@example.com" -b 4096
D:\developSoftware\Git>ssh-keygen -t rsa -C "592188043@qq.com" -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\AS/.ssh/id_rsa):
Created directory 'C:\Users\AS/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\AS/.ssh/id_rsa.
Your public key has been saved in C:\Users\AS/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qUybGbZ32xVEZm2oziDFZwESd1Sy0+4yPIfA/zBt/kc 592188043@qq.com
The key's randomart image is:
+---[RSA 4096]----+
| oooo=o=o |
| oo.oB. o|
| . oo.o. |
| .o. .+ |
| + S.o+ o |
| + B +o+ .E|
| B . . X *. |
| . . o % .|
| . . o.o|
+----[SHA256]-----+
生成的秘钥位置在C:\Users\AS/.ssh/id_rsa,将秘钥复制到服务端
拉取推送代码有很多工具可自行研究,这是主要目的是为了测试推送,就直接使用git命令测试
拉取代码
推送代码
创建一个.gitignore文件commit到本地git push到服务器
HTTP方式
在账户上创建个人令牌,以通过http的方式来拉取和推送代码,与SSH方式不同的是不需要设置秘钥,而是通过github的账号密码拉取和推送代码
Docker Compose 安装 Nexus
概述
Nexus 是一个强大的仓库管理器,极大地简化了内部仓库的维护和外部仓库的访问。
2016 年 4 月 6 日 Nexus 3.0 版本发布,相较 2.x 版本有了很大的改变:
- 对低层代码进行了大规模重构,提升性能,增加可扩展性以及改善用户体验。
- 升级界面,极大的简化了用户界面的操作和管理。
- 提供新的安装包,让部署更加简单。
- 增加对 Docker, NeGet, npm, Bower 的支持。
- 提供新的管理接口,以及增强对自动任务的管理。
安装
我们使用 Docker 来安装和运行 Nexus,docker-compose.yml
配置如下:
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3:3.29.2
container_name: nexus
ports:
- 8081:8081
volumes:
- /usr/local/docker/nexus/data:/nexus-data
注: 启动时如果出现权限问题可以使用:chmod 777 /usr/local/docker/nexus/data 赋予数据卷目录可读可写的权限
登录web控制台 ,地址:http://ip:port/ 界面如下:
初始账号密码,第一次登录的时候会提示admin用户的密码在/nexus-data/admin.password
由于/nexus-data挂载到宿主机的/usr/local/docker/nexus/data目录下,所以admin的密码在/usr/local/docker/nexus/data/admin.password里
登录之后会重置密码,nexus目录下的admin.password会被删除。
Maven 仓库介绍
代理仓库(Proxy Repository)
意为第三方仓库,如:
- maven-central
- nuget.org-proxy
版本策略(Version Policy):
- Release: 正式版本
- Snapshot: 快照版本
- Mixed: 混合模式
布局策略(Layout Policy):
- Strict:严格
- Permissive:宽松
宿主仓库(Hosted Repository)
存储本地上传的组件和资源的,如:
- maven-releases
- maven-snapshots
- nuget-hosted
部署策略(Deployment Policy):
- Allow Redeploy:允许重新部署
- Disable Redeploy:禁止重新部署
- Read-Only:只读
仓库组(Repository Group)
通常包含了多个代理仓库和宿主仓库,在项目中只要引入仓库组就可以下载到代理仓库和宿主仓库中的包,如:
- maven-public
- nuget-group
在项目中使用 Maven 私服
1、配置认证信息
在 Maven的 settings.xml
中添加 Nexus 认证信息(servers
节点下):
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>12345678</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>12345678</password>
</server>
Snapshots 与 Releases 的区别
- nexus-releases: 用于发布 Release 版本
- nexus-snapshots: 用于发布 Snapshot 版本(快照版)
Release 版本与 Snapshot 定义如下:
Release: 1.0.0/1.0.0-RELEASE
Snapshot: 1.0.0-SNAPSHOT
- 在项目
pom.xml
中设置的版本号添加SNAPSHOT
标识的都会发布为SNAPSHOT
版本,没有SNAPSHOT
标识的都会发布为RELEASE
版本。 SNAPSHOT
版本会自动加一个时间作为标识,如:1.0.0-SNAPSHOT
发布后为变成1.0.0-SNAPSHOT-20180522.123456-1.jar
2、配置自动化部署
在 pom.xml
中添加如下代码:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://127.0.0.1:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://127.0.0.1:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意事项:
- ID 名称必须要与
settings.xml
中 Servers 配置的 ID 名称保持一致。 - 项目版本号中有
SNAPSHOT
标识的,会发布到 Nexus Snapshots Repository, 否则发布到 Nexus Release Repository,并根据 ID 去匹配授权账号。
3、部署到仓库
mvn deploy
4、配置代理仓库
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://127.0.0.1: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://127.0.0.1:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
5、上传第三方 JAR 包
Nexus 3.0 不支持页面上传,可使用 maven 命令:
# 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
mvn deploy:deploy-file
-DgroupId=com.aliyun.oss
-DartifactId=aliyun-sdk-oss
-Dversion=2.2.3
-Dpackaging=jar
-Dfile=D:\aliyun-sdk-oss-2.2.3.jar
-Durl=http://127.0.0.1:8081/repository/maven-3rd/
-DrepositoryId=nexus-releases
注意事项:
- 建议在上传第三方 JAR 包时,创建单独的第三方 JAR 包管理仓库,便于管理有维护。(maven-3rd)
-DrepositoryId=nexus-releases
对应的是settings.xml
中 Servers 配置的 ID 名称。(授权)
Docker Compose 安装 Registry 私服
概述
官方的 Docker Hub 是一个用于管理公共镜像的地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么你就需要 Docker Registry,它可以用来存储和管理自己的镜像。
安装
docker私有仓库章节配置和使用容器运行私有仓库,这里使用 docker-compose
来安装,配置如下:
version: '3.1'
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
启动成功后需要测试服务端是否能够正常提供服务,有两种方式:
1、访问
浏览器端http://ip:5000/v2/ 或者终端访问 curl http://ip:5000/v2/
2、查看所有镜像
http://192.168.147.134:5000/v2/_catalog
3、查看指定镜像
http://192.168.147.134:5000/v2/mysql/tags/list
配置 Docker Registry 客户端
1、修改配置文件daemon.json(如果不存在请新建该文件)
vim /etc/docker/daemon.json
在daemon.json文件中添加"insecure-registries":["ip:5000"],如下:
{
"registry-mirrors": ["https://xx.mirror.aliyuncs.com"],
"insecure-registries":["IP:5000"]
}
注意:该文件必须符合 json 规范,否则 Docker 将不能启动。
刷新配置:
sudo systemctl daemon-reload
sudo systemctl restart docker
部署 Docker Registry WebUI
私服安装成功后就可以使用 docker 命令行工具对 registry 做各种操作了。然而不太方便的地方是不能直观的查看 registry 中的资源情况,这里介绍两个 Docker Registry WebUI 工具管理镜像。
docker-registry-frontend
docker-compose.yml
配置如下:
version: '3.1'
services:
frontend:
image: konradkleine/docker-registry-frontend:v2
restart: always
container_name: registry-frontend
ports:
- 8888:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.75.133
- ENV_DOCKER_REGISTRY_PORT=5000
注意:请将配置文件中的主机和端口换成自己仓库的地址
ENV_DOCKER_REGISTRY_HOST: 指定私有仓库的主机地址
ENV_DOCKER_REGISTRY_PORT: 指定私有仓库的端口号
运行成功后在浏览器访问:http://192.168.75.133:8888,但是在主页中找不到任何存储库,报错如下
官方Issues:https://github.com/kwk/docker-registry-frontend/issues/181
真正的原因是寄存器容器不能通过网络通过docker-registry-frontend容器连接,即使这两个容器在同一台机器上,可以采用link或者创建bridge网络,
这里我使用link的方式:
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
frontend:
image: konradkleine/docker-registry-frontend:v2
restart: always
container_name: registry-frontend
links:
- registry:registry
ports:
- 8888:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=registry
- ENV_DOCKER_REGISTRY_PORT=5000
--link:参数中第一个registry是registry的容器名,第二个registry是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。
测试如下: