Docker-compose的使用

什么是Docker Compose:

    • Docker Compose是Docker官网编排(Orchestration)项目之一,负责快速的部署分布式应用

镜像加速(使用阿里云的加速):

  • 登录注册一个阿里云,然后在控制台里面搜索一个镜像加速,然后点击打开这个页面最下面有一个镜像加速器里面有一个网址,复制下来

10.png

  • 进入/etc/docker目录下通过配置daemon.json来使用加速器然后使用命令:
1
2
3
4
5
6
7
8
9
root@ubuntu:/etc/docker# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://zyw2lmzb.mirror.aliyuncs.com"]
}
EOF

#重启Docker
systemctl daemon-reload
systemctl restart docker

重启完成后使用docker info即可查看你的仓库地址

概述:

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务

其官网文档说明地址:https://docs.docker.com/compose/

其官网开源代码地址:https://github.com/docker/compose/releases

其官网下载地址:https://github.com/docker/compose/releases

简单来说就是简化我们docker的操作

安装Docker-compose

compose支持Linux,macOS,Windows10,三大平台。这里在linux(Ubuntu18.04)环境下安装,使用下面的命令安装即可

第一句命令表示下载,第二句的作用是让你的root用户拥有这个文件的执行操作权限

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

然后检查一下是否安装成功:

1
docker-compose version

出现如下信息表示安装成功了

05.png

使用docker-compose

我们在usr/local目录下新建一个文件夹取名为docker然后进去再创建一个tomcat的文件夹,然后进入tomcat在这个文件夹下面编写一个docker-compose的配置文件

1
vi docker-compose.yml

里面的内容:

1
2
3
4
5
6
7
8
version: '3.1'              
services: #服务
tomcat: #tomcat
restart: always #开机自启动
image: tomcat #镜像名字
container_name: tomcat #容器名字
ports:
- 8080:8080 #暴露的端口

运行这个文件的命令:

1
docker-compse up

前提条件是你安装了docker,如果启动后访问的tomcat是404,访问不到tomcat的主页面接着往下看。

  • 我们可以多开一个标签然后使用命令:

  • 可以先查看运行中的docker 容器ID docker ps

  • 进入tomcat容器

1
docker exec -it 运行的tomcat容器ID /bin/bash
  • 进入webapps目录下你会发现里面是空的,没有文件(tomcat的默认欢迎页面应该放在webapps/ROOT/index.jsp或者index.html)

    解决的办法

  • webapps.dist里文件复制到webapps

  • webapps.dist重命名为webapps

复制文件到webapps:

1
cp -r webapps.dist/* ./webapps

webapps.dist重命名为webapps:

1
2
3
4
#删除webapps
rm -f webapps
#重命名
mv webapps.dist webapps

测试:访问 IP地址加上端口号8080

06.png

如果想和删除这个容器:

1
docker-compose down

一个复制粘贴小技巧:

如果在平时复制一段代码的时候,复制进去之后你会发现格式全乱了,这个时候我们可以

输入:set paste (表示原样粘贴)回车 再按 i 然后再复制进来的内容就是原样的

部署Tomcat让其持久化

在之前创建的docker-compose.yml这个文件里面添加两句话

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.1'
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
volumes: #数据卷
- ./webapps:/usr/local/tomcat/webapps
environment:
TZ: Asia/Shanghai #时区
  • 运行这个文件
1
docker-compose up -d
  • 查看有没有运行的容器
1
docker ps
  • 使用ll命令然后你会发现在tomcat文件里多了一个webapps的文件夹(这不是自己创建的)

  • 使用命令:

1
docker exec -it tomcat /bin/bash
  1. cd到webapps目录下你会发现是空白的,这时候的状态就是同步的

  2. 重新开一个标签然后进入到这个文件夹内创建一个test文件,你会发现里面也会有test,如果你删除了这个test,那外面的容器也没有了test

  3. 这个时候我们去浏览器访问IP:8080会发现是404的状态,因为啥东西都没有

  4. 我们在外部的容器mkdir一个文件夹叫做ROOT然后进入这个文件夹vi 一个index.jsp 内容为Hello Docker-compose

这个时候再去访问就是这个样子

07.png

即使你把这个容器给down掉但是数据卷依然保留了下来,这样就完成了持久化

部署Mysql

还是在usr/localdocker目录下新建一个文件夹取名为mysql

  • cd到这个文件夹里面,
  • 创建一个docker-compose.yml的配置文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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:
- ./data:/var/lib/mysql

# MySQL 的 Web 客户端
adminer:
image: adminer
restart: always
ports:
- 8081:8080
  • 使用命令:
1
docker-compose up -d
  • 查看运行中的容器
1
docker ps

你会看到有两个容器在运行着,一个是Mysql,还有一个是Web页面的客户端

本地测试连接:

08.png

浏览器访问:IP地址:8081 这个就是web管理页面填写用户名和密码 数据库可以不填写登陆可以看到主页

09.png

Docker compose部署GitLab

GitLab官方网址:https://about.gitlab.com/

概述:

GitLab是利用Ruby on Rails一个版本管理系统,其功能和Github类似,可以浏览源代码,除了Github以外还有一个码云,他们都有着类似的功能。如果你想自己搭建一个代码的仓库这个时候就出现了GitLab

GitLab本身也是一个代码的仓库,但是他有一个社区版,可以在本地搭建,公司内部使用。

使用Docker-compose部署GitLab

新开一台虚拟机:通过docker来安装GitLab中文版,cdusr/local目录下创建一个docker文件夹,进入docker文件夹,创建一个gitlab文件夹,然后进入gitlab文件夹下编写docker-compose配置文件

前提是安装了docker 以及docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh'
restart: always
# 可以是域名
hostname: '192.168.199.148'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.199.148:8080'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '443:443'
- '2222:22'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
  • 使用命令运行这个文件
1
docker-compose up -d

注意:第一次运行时间可能会比较久,请耐心等待有可能会访问到502的页面错误信息,这是正常的。最多十多分钟左右

11.png

  • 我们可以观察日志信息:
1
docker logs -f 运行容器的id
  • 最后可以访问地址:http://ip:8080
  • 端口8080是因为配置中设置的外部访问的地址是8080,默认为80

初始化完成后的页面效果如下:

刚初始化完成后是没有红色框内的东西,只有一个修改密码和确认密码,然后点击修改密码即可进入首页

(我这里是已经登录过得了,所以页面不太一样),登录后可以点击一个带图标管理区域,创建一个新的用户(平时操作的时候最好是用一个普通的管理员,而不是超级管理员)

12.png

到此,GitLab的部署完成

把代码部署到GitLab

可以先使用HTTPS模式的方式来克隆代码到本地,但是显然这样子是不安全的,那这个时候我们需要:免密登陆,实现的方式也很简单,如果用过GitHub基本都会,前提是:你必须安装了GIT到你的电脑上面;然后找到你的Git安装的目录找到\usr\bin这个目录下面打开命令行使用命令:

1
ssh-keygen -t rsa -C "这里填写你的GitLab的那个邮件就行"

会输出以下信息:在你user目录下.ssh目录下生成了一个密钥

找到这个目录我们可以看到有两个文件。我们把id_rsa.pub里面的内容复制,然后在GitLab中点击头像–>设置–>找到SSH密匙–>把复制过来的内容放到这里,然后起一个标题,最后点击Add Key

这个时候我们在本地就可以使用SSH的模式来克隆项目代码了,如果你使用的是TortoiseGit工具克隆代码。出现问题请参考:https://blog.csdn.net/u011511086/article/details/80606859

GitHubGitee的免密方式和上面的方式类似区别在于ssh的位置。

Docker commpose 部署Nexus

一,编辑docker-compose

  • 切换为root用户在 /usr/local/docker这个目录下面创建一个nexus的文件夹,然后进入这个文件夹,我们创建下面的内容:
  • 前提是你已经下载了好nexus3.16.2的这个镜像版本
1
2
3
4
5
6
7
8
9
10
11
12
version: '3.1'
services:
nexus3:
restart: always
image: sonatype/nexus3:3.16.2
container_name: nexus3
ports:
- 8083:8081
volumes:
- nexus-data:/nexus-data
volumes:
nexus-data:
  1. 然后使用命令:
1
docker-compose up -d
  1. 使用命令查看日志:
1
docker-compose logs -f

二,访问页面

  • 访问地址: ip + 8083 点击Signt in第一次登陆的时候,的登陆账户:admin,默认的密码:admin123,这是nexus3.3.16.2的默认密码;新版本可能有所不同,你可以根据它的提示找到,默认的密码,然后登陆进去之后,会要求你设置新的密码,下一步就行了。

1.png

  1. 里面有很多个仓库,平常我们使用最多的是中央仓库

三,在项目中使用Maven私服

  • 以单体应用多模块的项目为例,项目中有一个专门做依赖管理的项目里面依赖了各种的版本依赖,都是去Maven的中央仓库下载的,还有一个commons,作为通用工具模块,web项目依赖了这个模块,连接搭建的nexus私服
配置代理仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://(这里是你得ip地址):8083/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://(这里是你得ip地址):8083/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
  1. 去到本地的Maven仓库,把spring的依赖全部都删除掉。
  2. 在IDEA命令中使用命令
1
mvn clean package
  1. 会看到是在你的nexus私服中下载这些依赖
  2. 去到nexus的中央仓库就可以看到这些spring的依赖,因为本地没有这些依赖所以私服会去中央仓库下载这些依赖

三.1 解决模块之间的引用

spring,以及junit等等 这些都是第三方的,我们自己有模块之间的引用,这些不是第三方的,所以如果你试着去打包会报错提示你找不到这些jar包

  1. 我们需要上传到nexus,要上传的话我们需要认证授权,找到我们本地Maven的conf下面的settings.xml文件在servers标签下面添加一段话:这里的admin 是nexus的默认的账户和密码
配置认证信息
1
2
3
4
5
6
7
8
9
10
11
 <server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>

<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
  1. 在项目中的pom.xml文件添加:
配置自动化部署
1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://(这里是你得ip地址):8083/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://(这里是你得ip地址):8083/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
  1. cd到commons模块下使用命令:
1
mvn deploy

上传全部命令:

1
mvn deploy -Dmaven.test.skip

三.2 手动下载第三方的依赖

  • 很多时候有些jar依赖是下载不下来的,用pom的方式是下载不下来的

在nexus上传jar包点击Upload,点击发行版仓库:maven-releases

  1. 预览maven-releases发行版仓库中即可查看添加的第三方依赖

遇到下载不了的时候可以通过这种方式解决下载依赖问题。

Docker-compose 部署Harbor

什么是Harbor

  • docker是一个用于存储和分发Docker镜像的企业级 Registry 服务器,可以用于管理和储存 Docker 镜像。Harbor 支持在多个仓库直接进行复制镜像,提供用户管理和访问控制和活动审计。
  • 官网地址: https://github.com/goharbor/harbor

Harbor由 以下服务组成(每一个服务都由一个容器运行)

  • harbor-log

  • registry

  • redis

  • harbor-db

  • registryctl

  • harbor-core

  • harbor-jobservice

  • harbor-portal

  • nginx

部署Harbor

官网下载1.8.0 offline的版本,然后上传到linux,到usr/local/docker目录下

1.上传完成后解压命令:完成后会生成一个harbor的文件夹。

1
tar -zxvf harbor-offline-installer-v1.8.0.tgz

2.进入这个harbor的文件夹,然后我们修改一下 harbor.yml的主机,找到hostname 后面修改你的ip地址,这个文件中还包含了你的Harbor登录的密码, 可以往下翻一翻

1
2
3
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: 192.168.199.xxx

3.执行安装脚本

使用命令:

注意:前提是你得注意的是你的80端口没有被占用,如果被占用的话,会报错修改一下端口即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
root@ubuntu:/usr/local/docker/harbor# ./install.sh 

// 输出如下
[Step 0]: checking installation environment ...

Note: docker version: 19.03.7

Note: docker-compose version: 1.24.0

[Step 1]: loading Harbor images ...
Loaded image: goharbor/harbor-log:v1.8.0
Loaded image: goharbor/harbor-db:v1.8.0
Loaded image: goharbor/chartmuseum-photon:v0.8.1-v1.8.0
Loaded image: goharbor/prepare:v1.8.0
Loaded image: goharbor/harbor-jobservice:v1.8.0
Loaded image: goharbor/nginx-photon:v1.8.0
Loaded image: goharbor/notary-server-photon:v0.6.1-v1.8.0
Loaded image: goharbor/clair-photon:v2.0.8-v1.8.0
Loaded image: goharbor/harbor-migrator:v1.8.0
Loaded image: goharbor/harbor-core:v1.8.0
Loaded image: goharbor/redis-photon:v1.8.0
Loaded image: goharbor/registry-photon:v2.7.1-patch-2819-v1.8.0
Loaded image: goharbor/harbor-portal:v1.8.0
Loaded image: goharbor/harbor-registryctl:v1.8.0
Loaded image: goharbor/notary-signer-photon:v0.6.1-v1.8.0


[Step 2]: preparing environment ...
prepare base dir is set to /usr/local/docker/harbor
Clearing the configuration file: /config/core/env
Clearing the configuration file: /config/core/app.conf
Clearing the configuration file: /config/registry/root.crt
Clearing the configuration file: /config/registry/config.yml
Clearing the configuration file: /config/registryctl/env
Clearing the configuration file: /config/registryctl/config.yml
Clearing the configuration file: /config/log/logrotate.conf
Clearing the configuration file: /config/nginx/nginx.conf
Clearing the configuration file: /config/jobservice/env
Clearing the configuration file: /config/jobservice/config.yml
Clearing the configuration file: /config/db/env
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
loaded secret from file: /secret/keys/secretkey
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir



[Step 3]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry ... done
Creating harbor-db ... done
Creating registryctl ... done
Creating redis ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal ... done
Creating nginx ... done

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.199.148.
For more details, please visit https://github.com/goharbor/harbor

使用docker ps可以看到很多运行的容器

访问Harbor

  • 默认的用户名:admin ,密码:Harbor12345

配置客户端

修改/etc/docker/daemon.json中添加一段话,(这个文件不存在,就新建这个文件)

后面填写你的仓库地址

1
2
3
4
5
6
{
"registry-mirrors":["https://zyw2lmzb.mirror.aliyuncs.com"],
"insecure-registries":[
"192.168.199.xxx"
]
}

修改完重启以下docker:

1
systemctl restart docker

然后回到Harbor目录再:

1
docker-compose start

然后新建一个项目:

  • 给项目起一个名字
  • 你也新建多个项目,也就是组件

1,添加我们自己镜像到myshop

2,执行这句命令之前,你也得先有nginx这个镜像,也就是说你要先把这个镜像下载好

1
2
3
4
docker tag 镜像的名字:版本 ip地址/myshop/镜像的名字:版本

//实列
docker tag nginx:latest 192.168.199.xxx/myshop/nginx:latest

1,执行完成后,docker images 你会看到有两个id 一样的nginx 只是他们的名字不一样

推送镜像:

1,直接推送是推送不了的,我们先要登陆认证:

1
docker login 192.168.199.xxx -u admin -p Harbor1234

2,推送命令:

1
docker push 192.168.199.xxx/myshop/nginx:latest

查看

myshop的项目下就会有一个nginx的最新版本的镜像

拉取这个镜像:

1,先删除掉:

1
docker rmi 镜像名字

2,复制PUll命令:在内网/会很快

1
2
3
4
5
6
docker pull 192.168.199.xxx/myshop/nginx:latest

//输出信息:
Digest: sha256:7ac7819e1523911399b798309025935a9968b277d86d50e5255465d6592c0266
Status: Image is up to date for 192.168.199.148/myshop/nginx:latest
192.168.199.148/myshop/nginx:latest

在网络设置的第一节:报错:Cannot mkdir: /usr/local/tomcat/webapps/ROOT is not a directory

解决方式:更换tomcat版本,不要用最新版的tomcat