Docker Compose

Docker Compose

安装 Docker Compose

Compose 支持 Linux、macOS、Windows 10 三大平台。在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

  1. curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose

验证安装是否成功

  1. docker-compose version
  2.  
  3. # 输出如下
  4. docker-compose version 1.24.0, build 0aa59064
  5. docker-py version: 3.7.2
  6. CPython version: 3.6.8
  7. OpenSSL version: OpenSSL 1.1.0j 20 Nov 2018

 

术语

首先介绍几个术语。

  • 服务 (Service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目 (Project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。

场景

最常见的项目是 Web 网站,该项目应该包含 Web 应用和缓存。下面我们用 Python 来建立一个能够记录页面访问次数的 Web 网站。

Python 应用

新建文件夹,在该目录中编写 app.py 文件

  1. from flask import Flask
  2. from redis import Redis
  3.  
  4. app = Flask(__name__)
  5. redis = Redis(host='redis', port=6379)
  6.  
  7. @app.route('/')
  8. def hello():
  9. count = redis.incr('hits')
  10. return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
  11.  
  12. if __name__ == "__main__":
  13. app.run(host="0.0.0.0", debug=True)

Dockerfile

编写 Dockerfile 文件,内容为

  1. FROM python:3.6-alpine
  2. ADD . /code
  3. WORKDIR /code
  4. RUN pip install redis flask
  5. CMD ["python", "app.py"]

Docker Compose 模板

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。

  1. version: '3'
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7.  
  8. redis:
  9. image: "redis:alpine"

运行 Compose 项目

  1. docker-compose up -d

此时访问本地 5000 端口,每次刷新页面,计数就会加 1。

扩展阅读

YAML 配置文件语言

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。它的基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用 TAB 键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

# 表示注释,从这个字符一直到行尾,都会被解析器忽略。YAML 支持的数据结构有三种:

  • 对象: 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组: 一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars): 单个的、不可再分的值

YAML 对象

对象的一组键值对,使用冒号结构表示

  1. animal: pets

YAML 数组

一组连词线开头的行,构成一个数组

  1. - Cat
  2. - Dog
  3. - Goldfish

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格

  1. - Array
  2. - Cat
  3. - Dog
  4. - Goldfish

YAML 复合结构

对象和数组可以结合使用,形成复合结构

  1. languages:
  2. - Ruby
  3. - Perl
  4. - Python
  5. websites:
  6. YAML: yaml.org
  7. Ruby: ruby-lang.org
  8. Python: python.org
  9. Perl: use.perl.org

YAML 纯量

纯量是最基本的、不可再分的值。以下数据类型都属于 JavaScript 的纯量

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

修改 IP 和 DNS

课程演示会采用多虚拟机模拟分布式场景,为防止 IP 冲突,无法联网等问题,需要预先设置好主机名、IP、DNS 配置

修改主机名

  • 修改 cloud.cfg 防止重启后主机名还原
  1. vi /etc/cloud/cloud.cfg
  2.  
  3. # 该配置默认为 false,修改为 true 即可
  4. preserve_hostname: true
  • 修改主机名
  1. # 修改主机名
  2. hostnamectl set-hostname deployment
  3.  
  4. # 配置 hosts
  5. cat >> /etc/hosts << EOF
  6. 192.168.141.130 deployment
  7. EOF

修改 IP

编辑 vi /etc/netplan/50-cloud-init.yaml 配置文件,修改内容如下

  1. network:
  2. ethernets:
  3. ens33:
  4. addresses: [192.168.141.130/24]
  5. gateway4: 192.168.141.2
  6. nameservers:
  7. addresses: [192.168.141.2]
  8. version: 2

使用 netplan apply 命令让配置生效

修改 DNS

  1. # 取消 DNS 行注释,并增加 DNS 配置如:114.114.114.114,修改后重启下计算机
  2. vi /etc/systemd/resolved.conf

Docker Compose 部署应用程序 

部署 Tomcat

  1. version: '3.1'
  2. services:
  3. tomcat:
  4. restart: always
  5. image: tomcat
  6. container_name: tomcat
  7. ports:
  8. - 8080:8080
  9. volumes:
  10. - ./webapps:/usr/local/tomcat/webapps
  11. environment:
  12. TZ: Asia/Shanghai

部署 MySQL

  1. version: '3.1'
  2. services:
  3. db:
  4. # 目前 latest 版本为 MySQL8.x
  5. image: mysql
  6. restart: always
  7. environment:
  8. MYSQL_ROOT_PASSWORD: 123456
  9. command:
  10. --default-authentication-plugin=mysql_native_password
  11. --character-set-server=utf8mb4
  12. --collation-server=utf8mb4_general_ci
  13. --explicit_defaults_for_timestamp=true
  14. --lower_case_table_names=1
  15. ports:
  16. - 3306:3306
  17. volumes:
  18. - ./data:/var/lib/mysql
  19.  
  20. # MySQL 的 Web 客户端
  21. adminer:
  22. image: adminer
  23. restart: always
  24. ports:
  25. - 8080:8080

部署应用程序

什么是 GitLab

GitLab 是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。它拥有与 Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序 (Wall) 进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

部署 GitLab

我们使用 Docker 来安装和运行 GitLab 中文版,docker-compose.yml 配置如下:

  1. version: '3'
  2. services:
  3. web:
  4. image: 'twang2218/gitlab-ce-zh'
  5. restart: always
  6. hostname: '192.168.75.145'
  7. environment:
  8. TZ: 'Asia/Shanghai'
  9. GITLAB_OMNIBUS_CONFIG: |
  10. external_url 'http://192.168.75.145'
  11. gitlab_rails['gitlab_shell_ssh_port'] = 2222
  12. unicorn['port'] = 8888
  13. nginx['listen_port'] = 80
  14. ports:
  15. - '80:80'
  16. - '443:443'
  17. - '2222:22'
  18. volumes:
  19. - ./config:/etc/gitlab
  20. - ./data:/var/opt/gitlab
  21. - ./logs:/var/log/gitlab

部署 Nexus

我们使用 Docker 来安装和运行 Nexus,docker-compose.yml 配置如下:

  1. version: '3.1'
  2. services:
  3. nexus:
  4. restart: always
  5. image: sonatype/nexus3
  6. container_name: nexus
  7. ports:
  8. - 80:8081
  9. volumes:
  10. - data:/nexus-data
  11.  
  12. volumes:
  13. data:

验证安装是否成功

  • 地址: http://ip:port/
  • 用户名: admin
  • 密码: admin123

注意: 新版本密码在 cat /var/lib/docker/volumes/nexus_data/_data/admin.password

Docker Compose_第1张图片

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

在项目中使用 Nexus

配置认证信息

在 Maven settings.xml 中添加 Nexus 认证信息 (servers 节点下)

  1. nexus-releases
  2. admin
  3. admin123
  4.  
  5. nexus-snapshots
  6. admin
  7. admin123

Snapshots 与 Releases 的区别

  • nexus-releases: 用于发布 Release 版本
  • nexus-snapshots: 用于发布 Snapshot 版本(快照版)

Release 版本与 Snapshot 定义

  1. Release: 1.0.0/1.0.0-RELEASE
  2. Snapshot: 1.0.0-SNAPSHOT
  • 在项目 pom.xml 中设置的版本号添加 SNAPSHOT 标识的都会发布为 SNAPSHOT 版本,没有 SNAPSHOT 标识的都会发布为 RELEASE 版本。
  • SNAPSHOT 版本会自动加一个时间作为标识,如:1.0.0-SNAPSHOT 发布后为变成 1.0.0-SNAPSHOT-20180522.123456-1.jar

配置自动化部署

在 pom.xml 中添加如下代码

  1. nexus-releases
  2. Nexus Release Repository
  3. http://127.0.0.1:8081/repository/maven-releases/
  4. nexus-snapshots
  5. Nexus Snapshot Repository
  6. http://127.0.0.1:8081/repository/maven-snapshots/

注意事项

  • ID 名称必须要与 settings.xml 中 Servers 配置的 ID 名称保持一致
  • 项目版本号中有 SNAPSHOT 标识的,会发布到 Nexus Snapshots Repository, 否则发布到 Nexus Release Repository,并根据 ID 去匹配授权账号

部署到仓库

  1. mvn deploy

配置代理仓库

  1. nexus
  2. Nexus Repository
  3. http://127.0.0.1:8081/repository/maven-public/
  4. true
  5. true
  6. nexus
  7. Nexus Plugin Repository
  8. http://127.0.0.1:8081/repository/maven-public/
  9. true
  10. true

扩展阅读

手动上传第三方依赖

Nexus 3.1.x 开始支持页面上传第三方依赖功能,以下为手动上传命令

  1. # 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
  2. mvn deploy:deploy-file
  3. -DgroupId=com.aliyun.oss
  4. -DartifactId=aliyun-sdk-oss
  5. -Dversion=2.2.3
  6. -Dpackaging=jar
  7. -Dfile=D:\aliyun-sdk-oss-2.2.3.jar
  8. -Durl=http://127.0.0.1:8081/repository/maven-3rd/
  9. -DrepositoryId=nexus-releases

注意事项

  • 建议在上传第三方 JAR 包时,创建单独的第三方 JAR 包管理仓库,便于管理有维护。(maven-3rd)
  • -DrepositoryId=nexus-releases 对应的是 settings.xml 中 Servers 配置的 ID 名称。(授权)

安装 Harbor

官方 GitHub 上下载最新离线安装版(我已经下载并放置在群分享的 Linux 目录下)并上传至服务器

解压安装包

  1. tar -zxvf harbor-offline-installer-v1.8.0.tgz
  2.  
  3. # 输出如下
  4. harbor/harbor.v1.8.0.tar.gz
  5. harbor/prepare
  6. harbor/LICENSE
  7. harbor/install.sh
  8. harbor/harbor.yml

修改配置文件

  1. vi harbor.yml
  2.  
  3. # 修改为域名或你服务器 IP
  4. hostname: 192.168.141.150

执行安装脚本

  1. ./install.sh
  2.  
  3. # 输出如下
  4. [Step 0]: checking installation environment ...
  5.  
  6. Note: docker version: 18.09.6
  7.  
  8. Note: docker-compose version: 1.24.0
  9.  
  10. [Step 1]: loading Harbor images ...
  11. 23d9f72a5270: Loading layer [==================================================>] 33.25MB/33.25MB
  12. 1d4a1da12c02: Loading layer [==================================================>] 50.51MB/50.51MB
  13. 8eb1a006f3b0: Loading layer [==================================================>] 3.584kB/3.584kB
  14. 41b6f75847f4: Loading layer [==================================================>] 3.072kB/3.072kB
  15. ec9bd6e4d4e8: Loading layer [==================================================>] 2.56kB/2.56kB
  16. 6d852bb664c2: Loading layer [==================================================>] 3.072kB/3.072kB
  17. 0e4ed2b5a5b8: Loading layer [==================================================>] 3.584kB/3.584kB
  18. 8dfb2b644f30: Loading layer [==================================================>] 12.29kB/12.29kB
  19. Loaded image: goharbor/harbor-log:v1.8.0
  20. d8c53538042b: Loading layer [==================================================>] 63.34MB/63.34MB
  21. 1b5fb7ee22e0: Loading layer [==================================================>] 47.96MB/47.96MB
  22. a8bdca5e9d71: Loading layer [==================================================>] 6.656kB/6.656kB
  23. f7cec940b52c: Loading layer [==================================================>] 2.048kB/2.048kB
  24. 301a4a2af7db: Loading layer [==================================================>] 7.68kB/7.68kB
  25. e588e1e3a775: Loading layer [==================================================>] 2.56kB/2.56kB
  26. 539f28a5d0ea: Loading layer [==================================================>] 2.56kB/2.56kB
  27. 8b4a72241226: Loading layer [==================================================>] 2.56kB/2.56kB
  28. Loaded image: goharbor/harbor-db:v1.8.0
  29. c88db349fb2f: Loading layer [==================================================>] 8.972MB/8.972MB
  30. 1f2d4d72bba2: Loading layer [==================================================>] 35.77MB/35.77MB
  31. dddbcf598df5: Loading layer [==================================================>] 2.048kB/2.048kB
  32. 0ced476c2d9c: Loading layer [==================================================>] 3.072kB/3.072kB
  33. af24eb0bf40b: Loading layer [==================================================>] 35.77MB/35.77MB
  34. Loaded image: goharbor/chartmuseum-photon:v0.8.1-v1.8.0
  35. b185d348bd7d: Loading layer [==================================================>] 2.56kB/2.56kB
  36. f032ded7f92e: Loading layer [==================================================>] 1.536kB/1.536kB
  37. c6c822edbc47: Loading layer [==================================================>] 66.9MB/66.9MB
  38. 73ef3c4363bf: Loading layer [==================================================>] 39.75MB/39.75MB
  39. 0c490e002448: Loading layer [==================================================>] 144.4kB/144.4kB
  40. 31afe2abafb4: Loading layer [==================================================>] 3.004MB/3.004MB
  41. Loaded image: goharbor/prepare:v1.8.0
  42. 257ebcc1c9c4: Loading layer [==================================================>] 8.967MB/8.967MB
  43. 7579d3c94fca: Loading layer [==================================================>] 38.68MB/38.68MB
  44. 323611f7dd17: Loading layer [==================================================>] 38.68MB/38.68MB
  45. Loaded image: goharbor/harbor-jobservice:v1.8.0
  46. 587a5757a7f6: Loading layer [==================================================>] 3.548MB/3.548MB
  47. Loaded image: goharbor/nginx-photon:v1.8.0
  48. a61ab2060e6e: Loading layer [==================================================>] 8.967MB/8.967MB
  49. 25359ae00f57: Loading layer [==================================================>] 5.143MB/5.143MB
  50. 610a1668f8bf: Loading layer [==================================================>] 15.13MB/15.13MB
  51. db2252abd9e0: Loading layer [==================================================>] 26.47MB/26.47MB
  52. 4f406312560b: Loading layer [==================================================>] 22.02kB/22.02kB
  53. 1cee0947e5a7: Loading layer [==================================================>] 3.072kB/3.072kB
  54. 48db2b9b0752: Loading layer [==================================================>] 46.74MB/46.74MB
  55. Loaded image: goharbor/notary-server-photon:v0.6.1-v1.8.0
  56. aaf447150765: Loading layer [==================================================>] 113MB/113MB
  57. 6835441e1a1d: Loading layer [==================================================>] 10.94MB/10.94MB
  58. 9f4739e3a532: Loading layer [==================================================>] 2.048kB/2.048kB
  59. 928f489135f0: Loading layer [==================================================>] 48.13kB/48.13kB
  60. 1495a1a09ada: Loading layer [==================================================>] 3.072kB/3.072kB
  61. 1a5f5b141717: Loading layer [==================================================>] 10.99MB/10.99MB
  62. Loaded image: goharbor/clair-photon:v2.0.8-v1.8.0
  63. 66006ea937c6: Loading layer [==================================================>] 337.8MB/337.8MB
  64. d272ba122880: Loading layer [==================================================>] 106.5kB/106.5kB
  65. Loaded image: goharbor/harbor-migrator:v1.8.0
  66. 05bc5efb1724: Loading layer [==================================================>] 8.967MB/8.967MB
  67. af3a6f89469a: Loading layer [==================================================>] 46.85MB/46.85MB
  68. 452d238b3e48: Loading layer [==================================================>] 5.632kB/5.632kB
  69. 36e1cb2d6ffa: Loading layer [==================================================>] 27.14kB/27.14kB
  70. 5385ffb8451e: Loading layer [==================================================>] 46.85MB/46.85MB
  71. Loaded image: goharbor/harbor-core:v1.8.0
  72. 268091c30a67: Loading layer [==================================================>] 71.66MB/71.66MB
  73. 4433bcd802e7: Loading layer [==================================================>] 3.072kB/3.072kB
  74. 420b26399278: Loading layer [==================================================>] 59.9kB/59.9kB
  75. 8864c4b9ac3d: Loading layer [==================================================>] 61.95kB/61.95kB
  76. Loaded image: goharbor/redis-photon:v1.8.0
  77. 63645c97bf5d: Loading layer [==================================================>] 8.968MB/8.968MB
  78. ccb295818ad9: Loading layer [==================================================>] 3.072kB/3.072kB
  79. 1ec2d1eefa8f: Loading layer [==================================================>] 2.56kB/2.56kB
  80. b88acf0f9f5f: Loading layer [==================================================>] 20.1MB/20.1MB
  81. 0e7375de12e6: Loading layer [==================================================>] 20.1MB/20.1MB
  82. Loaded image: goharbor/registry-photon:v2.7.1-patch-2819-v1.8.0
  83. 444b0c8bfeee: Loading layer [==================================================>] 3.548MB/3.548MB
  84. ed0415346760: Loading layer [==================================================>] 6.568MB/6.568MB
  85. 572bd51089e0: Loading layer [==================================================>] 160.8kB/160.8kB
  86. 1410c2919a92: Loading layer [==================================================>] 215kB/215kB
  87. 8ecdca210598: Loading layer [==================================================>] 3.584kB/3.584kB
  88. Loaded image: goharbor/harbor-portal:v1.8.0
  89. 7fb66591fb58: Loading layer [==================================================>] 8.968MB/8.968MB
  90. 42ec4a6394bf: Loading layer [==================================================>] 3.072kB/3.072kB
  91. be6c2180cb57: Loading layer [==================================================>] 20.1MB/20.1MB
  92. d956d9e974c5: Loading layer [==================================================>] 3.072kB/3.072kB
  93. e2e0b4f17ad8: Loading layer [==================================================>] 7.465MB/7.465MB
  94. 7e29d670afe9: Loading layer [==================================================>] 27.56MB/27.56MB
  95. Loaded image: goharbor/harbor-registryctl:v1.8.0
  96. 453732ea69d4: Loading layer [==================================================>] 13.72MB/13.72MB
  97. c985f3824f33: Loading layer [==================================================>] 26.47MB/26.47MB
  98. 76eaa2763221: Loading layer [==================================================>] 22.02kB/22.02kB
  99. 0ef55a752948: Loading layer [==================================================>] 3.072kB/3.072kB
  100. c5749b90723d: Loading layer [==================================================>] 45.33MB/45.33MB
  101. Loaded image: goharbor/notary-signer-photon:v0.6.1-v1.8.0
  102.  
  103. [Step 2]: preparing environment ...
  104. prepare base dir is set to /usr/local/docker/harbor/harbor
  105. Generated configuration file: /config/log/logrotate.conf
  106. Generated configuration file: /config/nginx/nginx.conf
  107. Generated configuration file: /config/core/env
  108. Generated configuration file: /config/core/app.conf
  109. Generated configuration file: /config/registry/config.yml
  110. Generated configuration file: /config/registryctl/env
  111. Generated configuration file: /config/db/env
  112. Generated configuration file: /config/jobservice/env
  113. Generated configuration file: /config/jobservice/config.yml
  114. Generated and saved secret to file: /secret/keys/secretkey
  115. Generated certificate, key file: /secret/core/private_key.pem, cert file: /secret/registry/root.crt
  116. Generated configuration file: /compose_location/docker-compose.yml
  117. Clean up the input dir
  118.  
  119. [Step 3]: starting Harbor ...
  120. Creating network "harbor_harbor" with the default driver
  121. Creating harbor-log ... done
  122. Creating harbor-db ... done
  123. Creating registryctl ... done
  124. Creating redis ... done
  125. Creating registry ... done
  126. Creating harbor-core ... done
  127. Creating harbor-jobservice ... done
  128. Creating harbor-portal ... done
  129. Creating nginx ... done
  130.  
  131. ✔ ----Harbor has been installed and started successfully.----
  132.  
  133. Now you should be able to visit the admin portal at http://192.168.141.150.
  134. For more details, please visit https://github.com/goharbor/harbor .

验证安装是否成功

通过浏览器访问 http://192.168.141.150 ,看到登录页面

Docker Compose_第2张图片

输入账号 admin,密码 Harbor12345,登录成功后

Docker Compose_第3张图片

Harbor 启动和停止

Harbor 的日常运维管理是通过 docker-compose 来完成的,Harbor 本身有多个服务进程,都放在 docker 容器之中运行,我们可以通过 docker ps 命令查看。

  1. docker ps | grep goharbor
  2.  
  3. # 输出如下
  4. 07b401504357 goharbor/nginx-photon:v1.8.0 "nginx -g 'daemon of…" 23 minutes ago Up 23 minutes (healthy) 0.0.0.0:80->80/tcp nginx
  5. 050f39a147bc goharbor/harbor-portal:v1.8.0 "nginx -g 'daemon of…" 23 minutes ago Up 23 minutes (healthy) 80/tcp harbor-portal
  6. 305077bc0a3e goharbor/harbor-jobservice:v1.8.0 "/harbor/start.sh" 23 minutes ago Up 23 minutes harbor-jobservice
  7. 4eb33b09b268 goharbor/harbor-core:v1.8.0 "/harbor/start.sh" 23 minutes ago Up 23 minutes (healthy) harbor-core
  8. e9efb7a6abf9 goharbor/registry-photon:v2.7.1-patch-2819-v1.8.0 "/entrypoint.sh /etc…" 24 minutes ago Up 23 minutes (healthy) 5000/tcp registry
  9. f9bc75d47752 goharbor/harbor-registryctl:v1.8.0 "/harbor/start.sh" 24 minutes ago Up 23 minutes (healthy) registryctl
  10. 76d33d1755f6 goharbor/redis-photon:v1.8.0 "docker-entrypoint.s…" 24 minutes ago Up 23 minutes 6379/tcp redis
  11. 3870b3b93f46 goharbor/harbor-db:v1.8.0 "/entrypoint.sh post…" 24 minutes ago Up 23 minutes (healthy) 5432/tcp harbor-db
  12. 6e848e4d8bc2 goharbor/harbor-log:v1.8.0 "/bin/sh -c /usr/loc…" 24 minutes ago Up 24 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log
  13. # 启动
  14. docker-compose start
  15.  
  16. # 停止
  17. docker-comose stop
  18.  
  19. # 重启
  20. docker-compose restart

说明:

  • nginx: nginx 负责流量转发和安全验证,对外提供的流量都是从 nginx 中转,所以开放 https 的 443 端口,它将流量分发到后端的 ui 和正在 docker 镜像存储的 docker registry。
  • harbor-jobservice: harbor-jobservice 是 harbor 的 job 管理模块,job 在 harbor 里面主要是为了镜像仓库之前同步使用的;
  • harbor-ui: harbor-ui 是 web 管理页面,主要是前端的页面和后端 CURD 的接口;
  • registry: registry 就是 docker 原生的仓库,负责保存镜像。
  • harbor-adminserver: harbor-adminserver 是 harbor 系统管理接口,可以修改系统配置以及获取系统信息。
  • harbor-db: harbor-db 是 harbor 的数据库,这里保存了系统的 job 以及项目、人员权限管理。由于本 harbor 的认证也是通过数据,在生产环节大多对接到企业的 ldap 中;
  • harbor-log: harbor-log 是 harbor 的日志服务,统一管理 harbor 的日志。通过 inspect 可以看出容器统一将日志输出的 syslog。

这几个容器通过 Docker link 的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露 proxy (即 Nginx)的服务端口。

配置客户端

在 /etc/docker/daemon.json 中增加如下内容(如果文件不存在请新建该文件)

  1. {
  2. "registry-mirrors": [
  3. "https://registry.docker-cn.com"
  4. ],
  5. "insecure-registries": [
  6. "192.168.141.150"
  7. ]
  8. }

注意: 该文件必须符合 JSON 规范,否则 Docker 将不能启动。

重启服务

  1. systemctl daemon-reload
  2. systemctl restart docker

检查客户端配置是否生效

使用 docker info 命令手动检查,如果从配置中看到如下内容,说明配置成功

  1. Insecure Registries:
  2. 192.168.141.150
  3. 127.0.0.0/8

Harbor 上传镜像

新建项目

我们以推送 Nginx 为例,首先需要在 Harbor 上创建一个 公开/私有 的项目

Docker Compose_第4张图片

Docker Compose_第5张图片

推送镜像

Docker Compose_第6张图片

 
  1. # 在项目中标记镜像
  2. docker tag nginx 192.168.141.150/myshop/nginx:latest
  3.  
  4. # 登录 Harbor
  5. docker login 192.168.141.150 -u admin -p Harbor12345
  6.  
  7. # 推送镜像到项目
  8. docker push 192.168.141.150/myshop/nginx:latest

查看镜像

Docker Compose_第7张图片

Docker Compose_第8张图片

Harbor 下载镜像

在其它机器下载镜像只需要配置好客户端即可

  1. docker pull 192.168.141.150/myshop/nginx:latest

概述

默认情况下,Compose 会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为 Hostname 被其他容器访问

默认情况下,应用程序的网络名称基于 Compose 的工程名称,而项目名称基于 docker-compose.yml 所在目录的名称。如需修改工程名称,可使用 --project-name 标识或 COMPOSE_PORJECT_NAME 环境变量。

假如一个应用程序在名为 myapp 的目录中,并且 docker-compose.yml 如下所示:

 
  1. version: '2'
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "8000:8000"
  7. db:
  8. image: postgres

当我们运行 docker-compose up 时,将会执行以下几步:

  • 创建一个名为 myapp_default 的网络
  • 使用 web 服务的配置创建容器,它以 web 这个名称加入网络 myapp_default
  • 使用 db 服务的配置创建容器,它以 db 这个名称加入网络 myapp_default

容器间可使用服务名称(web 或 db)作为 Hostname 相互访问。例如,web 这个服务可使用 postgres://db:5432 访问 db 容器。

当服务的配置发生更改时,可使用 docker-compose up 命令更新配置。此时,Compose 会删除旧容器并创建新容器。新容器会以不同的 IP 地址加入网络,名称保持不变。任何指向旧容器的连接都会被关闭,容器会重新找到新容器并连接上去。

使用 links

默认情况下,服务之间可使用服务名称相互访问。links 允许我们定义一个别名,从而使用该别名访问其他服务。

 
  1. version: '2'
  2. services:
  3. web:
  4. build: .
  5. links:
  6. - "db:database"
  7. db:
  8. image: postgres

自定义网络

一些场景下,默认的网络配置满足不了我们的需求,此时我们可使用 networks 命令自定义网络。networks 命令允许我们创建更加复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,我们还可使用 networks 将服务连接到不是由 Compose 管理的、外部创建的网络。

 
  1. version: '2'
  2.  
  3. services:
  4. proxy:
  5. build: ./proxy
  6. networks:
  7. - front
  8. app:
  9. build: ./app
  10. networks:
  11. - front
  12. - back
  13. db:
  14. image: postgres
  15. networks:
  16. - back
  17.  
  18. networks:
  19. front:
  20. # Use a custom driver
  21. driver: custom-driver-1
  22. back:
  23. # Use a custom driver which takes special options
  24. driver: custom-driver-2
  25. driver_opts:
  26. foo: "1"
  27. bar: "2"

其中,proxy 服务与 db 服务隔离,两者分别使用自己的网络;app 服务可与两者通信。使用 networks 命令,即可方便实现服务间的网络隔离与连接。

配置默认网络

 
  1. version: '2'
  2.  
  3. services:
  4. web:
  5. build: .
  6. ports:
  7. - "8000:8000"
  8. db:
  9. image: postgres
  10.  
  11. networks:
  12. default:
  13. # Use a custom driver
  14. driver: custom-driver-1

这样,就可为该应用指定自定义的网络驱动

已存在的网络

我们可以预先创建一个名为 myapp 的网络,让 Compose 加入这个新创建的网络,使所有 Compose 可以通信,此时使用 external 选项。

 
  1. # 创建网络
  2. docker network create
  3.  
  4. # 查看已存在的网络
  5. docker network list
 
  1. networks:
  2. default:
  3. external:
  4. name: myapp

一次构建,到处运行

 

 

你可能感兴趣的:(技术文章)