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

设置管理员初始密码

  • 端口 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是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。

测试如下:

posted @ 2021-01-15 11:08  柳小白  阅读(332)  评论(0编辑  收藏  举报