├── .github
├── FUNDING.yml
└── workflows
│ └── ci.yml
├── .gitignore
├── .idoc
└── .filesStat.json
├── README.md
├── docs
├── docker-compose.md
├── elasticsearch.md
├── gitlab
│ ├── 001.png
│ ├── 002.png
│ └── README.md
├── harbor.md
├── jenkins
│ ├── Dockerfile
│ ├── README.md
│ ├── imgs
│ │ ├── 0-1.png
│ │ ├── 0-2.png
│ │ ├── 0-3.png
│ │ ├── 1.png
│ │ ├── 10.png
│ │ ├── 2.png
│ │ ├── 3.png
│ │ ├── 4-1.png
│ │ ├── 4-2.png
│ │ ├── 4.png
│ │ ├── 5.png
│ │ ├── 6.png
│ │ ├── 7.png
│ │ ├── 8.png
│ │ └── 9.png
│ └── openjdk
│ │ ├── Dockerfile
│ │ └── README.md
├── logo.png
├── mattermost.md
├── mysql.md
├── navidrome.md
├── nginx.md
├── nps
│ ├── 001.png
│ ├── 002.png
│ ├── 003.png
│ ├── 004.png
│ ├── 005.png
│ ├── 006.png
│ ├── 007.png
│ ├── 008.png
│ ├── 009.png
│ ├── 010.png
│ ├── 011.png
│ ├── 012.png
│ └── README.md
├── penpot.md
├── portainer.md
├── postgres.md
├── rancher.md
├── redis.md
├── rocket.chat
│ ├── README.md
│ └── docker-compose.yml
├── seaweedfs
│ ├── .dockerignore
│ ├── Dockerfile
│ ├── README.md
│ ├── docker-compose.yml
│ ├── entrypoint.sh
│ └── filer.toml
└── sourcegraph
│ └── README.md
├── idoc.chapters.yml
├── idoc.yml
├── img
├── logo.png
└── logo.svg
├── package.json
└── renovate.json
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | ko_fi: jaywcjlove
2 | buy_me_a_coffee: jaywcjlove
3 | custom: ["https://www.paypal.me/kennyiseeyou", "https://jaywcjlove.github.io/#/sponsor"]
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 | on:
3 | push:
4 | branches:
5 | - master
6 |
7 | jobs:
8 | build:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: actions/checkout@v4
12 | - uses: actions/setup-node@v4
13 | with:
14 | node-version: 20
15 | registry-url: 'https://registry.npmjs.org'
16 |
17 | - run: npm install
18 | - run: npm run build
19 |
20 | - name: Generate Contributors Images
21 | uses: jaywcjlove/github-action-contributors@main
22 | with:
23 | filter-author: (renovate\[bot\]|renovate-bot|dependabot\[bot\])
24 | output: dist/CONTRIBUTORS.svg
25 | avatarSize: 42
26 |
27 | - name: Create Tag
28 | id: create_tag
29 | uses: jaywcjlove/create-tag-action@main
30 | with:
31 | package-path: ./package.json
32 |
33 | - name: get tag version
34 | id: tag_version
35 | uses: jaywcjlove/changelog-generator@main
36 |
37 | - name: Deploy Website
38 | uses: peaceiris/actions-gh-pages@v4
39 | with:
40 | user_name: 'github-actions[bot]'
41 | user_email: 'github-actions[bot]@users.noreply.github.com'
42 | commit_message: ${{steps.tag_version.outputs.tag}} ${{ github.event.head_commit.message }}
43 | github_token: ${{ secrets.GITHUB_TOKEN }}
44 | publish_dir: ./dist
45 |
46 | - name: Generate Changelog
47 | id: changelog
48 | uses: jaywcjlove/changelog-generator@main
49 | with:
50 | token: ${{ secrets.GITHUB_TOKEN }}
51 | filter-author: (jaywcjlove|小弟调调™|dependabot\[bot\]|Renovate Bot)
52 | filter: (^[\s]+?[R|r]elease)|(^[R|r]elease)
53 |
54 | - name: Create Release
55 | uses: ncipollo/release-action@v1
56 | if: steps.create_tag.outputs.successful
57 | with:
58 | allowUpdates: true
59 | token: ${{ secrets.GITHUB_TOKEN }}
60 | name: ${{ steps.create_tag.outputs.version }}
61 | tag: ${{ steps.create_tag.outputs.version }}
62 | body: |
63 | [](https://jaywcjlove.github.io/#/sponsor)
64 |
65 | Documentation ${{ steps.changelog.outputs.tag }}: https://raw.githack.com/jaywcjlove/docker-tutorial/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html
66 | Comparing Changes: ${{ steps.changelog.outputs.compareurl }}
67 |
68 | ${{ steps.changelog.outputs.changelog }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | node_modules
3 | test/out
4 |
5 | npm-debug.log*
6 | lerna-debug.log
7 | yarn-error.log
8 | package-lock.json
9 |
10 | .DS_Store
11 | .cache
12 | .vscode
13 | .idea
14 |
15 | *.bak
16 | *.tem
17 | *.temp
18 | #.swp
19 | *.*~
20 | ~*.*
21 |
22 | # IDEA
23 | *.iml
24 | *.ipr
25 | *.iws
26 | .idea/
--------------------------------------------------------------------------------
/.idoc/.filesStat.json:
--------------------------------------------------------------------------------
1 | {
2 | "docs/gitlab/README.md": {
3 | "atime": "2022-04-20T15:53:36.654Z",
4 | "mtime": "2022-04-20T15:53:36.249Z",
5 | "ctime": "2022-04-20T15:53:36.249Z",
6 | "birthtime": "2022-04-20T15:51:44.671Z"
7 | },
8 | "docs/nps/README.md": {
9 | "atime": "2022-04-20T15:50:44.286Z",
10 | "mtime": "2022-04-20T15:50:09.998Z",
11 | "ctime": "2022-04-20T15:50:09.998Z",
12 | "birthtime": "2022-03-30T12:48:22.823Z"
13 | },
14 | "docs/sourcegraph/README.md": {
15 | "atime": "2022-06-27T01:38:21.934Z",
16 | "mtime": "2022-06-27T01:38:35.374Z",
17 | "ctime": "2022-06-27T01:38:35.374Z",
18 | "birthtime": "2021-03-03T06:16:24.952Z"
19 | },
20 | "docs/seaweedfs/README.md": {
21 | "atime": "2022-06-27T01:39:28.923Z",
22 | "mtime": "2022-06-27T01:39:28.864Z",
23 | "ctime": "2022-06-27T01:39:28.864Z",
24 | "birthtime": "2021-03-03T06:16:24.952Z"
25 | },
26 | "docs/rocket.chat/README.md": {
27 | "atime": "2022-04-20T16:55:14.227Z",
28 | "mtime": "2022-04-20T16:54:33.932Z",
29 | "ctime": "2022-04-20T16:54:33.932Z",
30 | "birthtime": "2021-03-03T06:16:24.951Z"
31 | },
32 | "docs/docker-compose.md": {
33 | "atime": "2022-04-20T03:31:26.875Z",
34 | "mtime": "2022-04-20T03:31:26.510Z",
35 | "ctime": "2022-04-20T03:31:26.510Z",
36 | "birthtime": "2021-03-03T06:16:24.949Z"
37 | },
38 | "docs/elasticsearch.md": {
39 | "atime": "2021-10-22T09:28:48.696Z",
40 | "mtime": "2021-10-22T09:28:47.051Z",
41 | "ctime": "2021-10-22T09:28:47.051Z",
42 | "birthtime": "2021-03-03T06:16:24.950Z"
43 | },
44 | "docs/harbor.md": {
45 | "atime": "2021-10-22T09:28:58.759Z",
46 | "mtime": "2021-10-22T09:28:57.035Z",
47 | "ctime": "2021-10-22T09:28:57.035Z",
48 | "birthtime": "2021-03-03T06:16:24.950Z"
49 | },
50 | "docs/mattermost.md": {
51 | "atime": "2022-04-20T16:30:44.456Z",
52 | "mtime": "2022-04-20T16:30:42.947Z",
53 | "ctime": "2022-04-20T16:30:42.947Z",
54 | "birthtime": "2021-03-03T06:16:24.950Z"
55 | },
56 | "docs/mysql.md": {
57 | "atime": "2022-04-20T16:33:14.123Z",
58 | "mtime": "2022-04-20T16:33:09.286Z",
59 | "ctime": "2022-04-20T16:33:09.286Z",
60 | "birthtime": "2021-03-03T06:16:24.950Z"
61 | },
62 | "docs/portainer.md": {
63 | "atime": "2022-04-20T16:52:16.653Z",
64 | "mtime": "2022-04-20T16:52:15.272Z",
65 | "ctime": "2022-04-20T16:52:15.272Z",
66 | "birthtime": "2021-03-03T06:16:24.951Z"
67 | },
68 | "docs/postgres.md": {
69 | "atime": "2022-04-20T16:52:06.268Z",
70 | "mtime": "2022-04-20T16:52:04.912Z",
71 | "ctime": "2022-04-20T16:52:04.912Z",
72 | "birthtime": "2021-11-03T07:53:03.403Z"
73 | },
74 | "docs/rancher.md": {
75 | "atime": "2022-04-20T16:38:09.451Z",
76 | "mtime": "2022-04-20T16:38:08.006Z",
77 | "ctime": "2022-04-20T16:38:08.006Z",
78 | "birthtime": "2021-03-03T06:16:24.951Z"
79 | },
80 | "docs/nginx.md": {
81 | "atime": "2021-03-03T06:16:25.682Z",
82 | "mtime": "2021-03-03T06:16:24.951Z",
83 | "ctime": "2021-03-03T06:16:24.951Z",
84 | "birthtime": "2021-03-03T06:16:24.950Z"
85 | },
86 | "docs/redis.md": {
87 | "atime": "2022-04-20T16:39:24.420Z",
88 | "mtime": "2022-04-20T16:39:22.340Z",
89 | "ctime": "2022-04-20T16:39:22.340Z",
90 | "birthtime": "2021-03-03T06:16:24.951Z"
91 | },
92 | "README.md": {
93 | "atime": "2022-06-27T06:53:45.035Z",
94 | "mtime": "2022-06-27T06:53:44.994Z",
95 | "ctime": "2022-06-27T06:53:44.994Z",
96 | "birthtime": "2022-06-27T00:18:49.215Z"
97 | }
98 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Docker 入门教程
8 |
9 |
10 | [](https://jaywcjlove.github.io/#/sponsor)
11 |
12 | [Docker](https://www.docker.com/) 是一个开源的应用容器引擎,而一个容器其实是一个虚拟化的独立的环境,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
13 |
14 | > Docker 的局限性之一,它只能用在 64 位的操作系统上。
15 |
16 |
17 |
18 | 目录
19 | ===
20 |
21 |
22 |
23 | - [新版本安装](#新版本安装)
24 | - [旧版本安装](#旧版本安装)
25 | - [命令介绍](#命令介绍)
26 | - [服务管理](#服务管理)
27 | - [镜像管理](#镜像管理)
28 | - [通过容器创建镜像](#通过容器创建镜像)
29 | - [通过Dockerfile创建镜像](#通过dockerfile创建镜像)
30 | - [发布自己的镜像](#发布自己的镜像)
31 | - [镜像中安装软件](#镜像中安装软件)
32 | - [容器管理](#容器管理)
33 | - [容器服务管理](#容器服务管理)
34 | - [进入容器](#进入容器)
35 | - [文件拷贝](#文件拷贝)
36 | - [Docker私有仓库搭建](#docker私有仓库搭建)
37 | - [`registry`](#registry)
38 | - [`Harbor`](#harbor)
39 | - [使用 Docker 实战](#使用-docker-实战)
40 | - [Docker REST API](#docker-rest-api)
41 | - [`Nginx`](#nginx)
42 | - [`MySQL`](#mysql)
43 | - [`PostgreSQL`](#postgres)
44 | - [`Redis`](#redis)
45 | - [`Elasticsearch`](#elasticsearch)
46 | - [`Gitlab`](#gitlab)
47 | - [`Jenkins`](#jenkins)
48 | - [`Rocket.Chat`](#rocketchat)
49 | - [`Rancher`](#rancher)
50 | - [`Portainer`](#portainer)
51 | - [`Sourcegraph`](#sourcegraph)
52 | - [`Mattermost`](#Mattermost)
53 | - [`NPS`](#nps)
54 | - [`Penpot`](#penpot)
55 | - [`Navidrome`](#navidrome)
56 | - [`Humpback`](#humpback)
57 | - [`Seafile`](#seafile)
58 | - [更多](#更多)
59 | - [卸载旧的版本](#卸载旧的版本)
60 | - [错误处理](#错误处理)
61 | - [参考资料](#参考资料)
62 | - [官方英文资源](#官方英文资源)
63 | - [中文资源](#中文资源)
64 | - [其它资源](#其它资源)
65 |
66 |
67 |
68 |
69 | Docker 从 `1.13` 版本之后采用时间线的方式作为版本号,分为社区版 `CE` 和企业版 `EE`,社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。
70 |
71 | 社区版按照 `stable` 和 `edge` 两种方式发布,每个季度更新 `stable` 版本,如 `17.06`,`17.09`;每个月份更新 `edge` 版本,如`17.09`,`17.10`。
72 |
73 | 下面教程运行在 `Centos` 中
74 |
75 | ## 新版本安装
76 |
77 | Docker 官方的安装教程,[在这里](https://docs.docker.com/install/linux/docker-ce/centos/)。
78 |
79 | 安装一些必要的系统工具
80 |
81 | ```bash
82 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2
83 | ```
84 |
85 | 添加软件源信息
86 |
87 | ```bash
88 | # docker 官方源
89 | sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
90 | # 阿里云源
91 | sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
92 | ```
93 |
94 | 可选:启用 `edge` 和 `test` 存储库。 这些存储库包含在上面的 `docker.repo` 文件中,但默认情况下处于禁用状态。您可以将它们与稳定存储库一起启用。
95 |
96 | ```
97 | $ sudo yum-config-manager --enable docker-ce-edge
98 | $ sudo yum-config-manager --enable docker-ce-test
99 | ```
100 |
101 | 您可以通过使用 `--disable` 标志运行 `yum-config-manager` 命令来禁用边缘或测试存储库。 要重新启用它,请使用 `--enable` 标志。 以下命令禁用 `edge` 存储库:
102 |
103 | ```bash
104 | $ sudo yum-config-manager --disable docker-ce-edge
105 | $ sudo yum-config-manager --disable docker-ce-test
106 | ```
107 |
108 | 安装 Docker-ce
109 |
110 | ```bash
111 | # 安装前可以先更新 yum 缓存:
112 | sudo yum makecache fast
113 | # 安装 Docker-ce
114 | sudo yum install docker-ce
115 | ```
116 |
117 | 如果你想安装特定 `docker-ce` 版本,先列出 repo 中可用版本,然后选择安装
118 |
119 | ```bash
120 | $ yum list docker-ce --showduplicates | sort -r
121 | # docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
122 | # docker-ce.x86_64 18.06.1.ce-3.el7 @docker-ce-stable
123 | # docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
124 | # docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
125 | # docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
126 | # docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
127 | # 选择版本安装
128 | $ sudo yum install docker-ce-
129 |
130 | # 选择安装 docker-ce-18.06.1.ce
131 | $ sudo yum install docker-ce-18.06.1.ce
132 | ```
133 |
134 | 启动 Docker 后台服务
135 |
136 | ```bash
137 | $ sudo systemctl start docker
138 | ```
139 |
140 | 通过运行 `hello-world` 镜像,验证是否正确安装了 `docker`。
141 |
142 | ```bash
143 | $ docker run hello-world
144 | ```
145 |
146 | ## 旧版本安装
147 |
148 | ```bash
149 | yum install docker # CentOS 中安装
150 | apt-get install docker-ce # Ubuntu 中安装
151 | pacman -S docker # Arch 中安装
152 | emerge --ask docker # Gentoo 中安装
153 |
154 | #=====================
155 | docker version # 通过查看版本,检查安装是否成功
156 | # Client:
157 | # Version: 1.12.6
158 | # API version: 1.24
159 | # Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
160 | # Go version: go1.8.3
161 | # Git commit: c4618fb/1.12.6
162 | # Built: Thu Sep 21 22:33:52 2017
163 | # OS/Arch: linux/amd64
164 | #
165 | # Server:
166 | # Version: 1.12.6
167 | # API version: 1.24
168 | # Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
169 | # Go version: go1.8.3
170 | # Git commit: c4618fb/1.12.6
171 | # Built: Thu Sep 21 22:33:52 2017
172 | # OS/Arch: linux/amd64
173 | ```
174 |
175 | ## 命令介绍
176 |
177 | ```bash
178 | $ docker --help
179 |
180 | 管理命令:
181 | container 管理容器
182 | image 管理镜像
183 | network 管理网络
184 | 命令:
185 | attach 介入到一个正在运行的容器
186 | build 根据 Dockerfile 构建一个镜像
187 | commit 根据容器的更改创建一个新的镜像
188 | cp 在本地文件系统与容器中复制 文件/文件夹
189 | create 创建一个新容器
190 | exec 在容器中执行一条命令
191 | images 列出镜像
192 | kill 杀死一个或多个正在运行的容器
193 | logs 取得容器的日志
194 | pause 暂停一个或多个容器的所有进程
195 | ps 列出所有容器
196 | pull 拉取一个镜像或仓库到 registry
197 | push 推送一个镜像或仓库到 registry
198 | rename 重命名一个容器
199 | restart 重新启动一个或多个容器
200 | rm 删除一个或多个容器
201 | rmi 删除一个或多个镜像
202 | run 在一个新的容器中执行一条命令
203 | search 在 Docker Hub 中搜索镜像
204 | start 启动一个或多个已经停止运行的容器
205 | stats 显示一个容器的实时资源占用
206 | stop 停止一个或多个正在运行的容器
207 | tag 为镜像创建一个新的标签
208 | top 显示一个容器内的所有进程
209 | unpause 恢复一个或多个容器内所有被暂停的进程
210 | ```
211 |
212 | ## 服务管理
213 |
214 | ```bash
215 | service docker start # 启动 docker 服务,守护进程
216 | service docker stop # 停止 docker 服务
217 | service docker status # 查看 docker 服务状态
218 | chkconfig docker on # 设置为开机启动
219 | ```
220 |
221 | ## 镜像管理
222 |
223 | 镜像可以看做我们平时装系统的镜像,里面就是一个运行环境。
224 |
225 | ```bash
226 | docker pull centos:latest # 从docker.io中下载centos镜像到本地
227 | docker images # 查看已下载的镜像
228 | docker rmi [image_id] # 删除镜像,指定镜像id
229 |
230 | # 删除所有镜像
231 | # none 默认为 docker.io
232 | docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
233 |
234 | # 连接进行进入命令行模式,exit命令退出。
235 | docker run -t -i nginx:latest /bin/bash
236 | ```
237 |
238 | ### 下载镜像本地安装镜像
239 |
240 | 由于国区已经无法访问,可以将镜像打包,直接安装镜像压缩文件
241 |
242 | ```sh
243 | $ docker pull gitlab/gitlab-ce:17.2.0-ce.0 # 下载镜像
244 | $ docker pull --platform linux/amd64 gitlab/gitlab-ce:17.2.0-ce.0
245 | $ docker pull --platform linux/amd64 portainer/portainer-ce:2.20.3-alpine
246 | $ docker pull --platform linux/amd64 portainer/agent:2.20.3-alpine
247 | # 保存 Docker 镜像到本地文件
248 | $ docker save -o [output-file.tar] [image-name]
249 | $ docker save -o gitlab-ce.0-17.2.0.tar gitlab/gitlab-ce:17.2.0-ce.0
250 | $ docker save -o portainer-agent-2.20.3-alpine.tar portainer/agent:2.20.3-alpine
251 | $ docker save -o portainer-ce-2.20.3-alpine.tar portainer/portainer-ce:2.20.3-alpine
252 | ```
253 |
254 | 将镜像文件发送到服务器
255 |
256 | ```sh
257 | $ scp [output-file.tar] [user]@[server-ip]:[path]
258 | $ scp gitlab-ce-17.0.1.tar root@110.55.8.163:/home/docker-images
259 | ```
260 |
261 | 服务器上加载 Docker 镜像
262 |
263 | ```sh
264 | $ docker load -i /home/docker-images/gitlab-ce-17.0.1.tar # 加载 Docker 镜像
265 | $ docker images # 验证镜像是否加载成功
266 | ```
267 |
268 | ### 通过容器创建镜像
269 |
270 | 我们可以通过以下两种方式对镜像进行更改。
271 |
272 | 1. 从已经创建的容器中更新镜像,并且提交这个镜像
273 | 2. 使用 Dockerfile 指令来创建一个新的镜像
274 |
275 | 下面通过已存在的容器创建一个新的镜像。
276 |
277 | ```bash
278 | docker commit -m="First Docker" -a="wcjiang" a6b0a6cfdacf wcjiang/nginx:v1.2.1
279 | ```
280 |
281 | 上面命令参数说明:
282 |
283 | - `-m` 提交的描述信息
284 | - `-a` 指定镜像作者
285 | - `a6b0a6cfdacf` 记住这个是容器id,不是镜像id
286 | - `wcjiang/nginx:v1.2.1` 创建的目标镜像名
287 |
288 | ### 通过Dockerfile创建镜像
289 |
290 | 假设创建一个 node.js 镜像,首先在 node.js 项目根目录创建文件。
291 |
292 | ```bash
293 | touch Dockerfile .dockerignore
294 | ```
295 |
296 | `.dockerignore` 文件内容,下面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。
297 |
298 | ```bash
299 | .git
300 | node_modules
301 | npm-debug.log
302 | ```
303 |
304 | Dockerfile 文件内容
305 |
306 | ```Dockerfile
307 | FROM node:8.4
308 | COPY . /app
309 | WORKDIR /app
310 | RUN npm install --registry=https://registry.npm.taobao.org
311 | EXPOSE 3000
312 | ```
313 |
314 | - `FROM node:8.4`:该 `image` 文件继承官方的 `node image`,冒号表示标签,这里标签是`8.4`,即`8.4`版本的 `node`。
315 | - `COPY . /app`:将当前目录下的所有文件(除了 `.dockerignore` 排除的路径),都拷贝进入 `image` 文件的 `/app` 目录。
316 | - `WORKDIR /app`:指定接下来的工作路径为`/app`。
317 | - `RUN npm install`:在/app目录下,运行 `npm install` 命令安装依赖。注意,安装后所有的依赖,都将打包进入 `image` 文件。
318 | - `EXPOSE 3000`:将容器 `3000` 端口暴露出来, 允许外部连接这个端口。
319 |
320 | 有了 `Dockerfile` 文件以后,就可以使用 `docker image build` 命令创建 `image` 文件了。
321 |
322 | ```bash
323 | $ docker image build -t koa-demo .
324 | # 或者
325 | $ docker image build -t koa-demo:0.0.1 .
326 | ```
327 |
328 | 上面命令,`-t` 参数用来指定 `image` 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是 `latest`。注意后面有个 `.`,表示 Dockerfile 文件所在的路径为当前路径
329 |
330 |
331 | ```bash
332 | docker run --name koa-demo-name --rm -d -p 9066:3000 koa-demo:latest
333 | # 或者
334 | docker run --name koa-demo-name --rm -d -p 9066:3000 koa-demo:0.0.1
335 | ```
336 |
337 | 上面命令,将刚创建的 `koa-demo` 景象跑起来,命令的 `--rm` 参数,在容器终止运行后自动删除容器文件。
338 |
339 |
340 | ### 发布自己的镜像
341 |
342 | 1. 在[Docker](https://www.docker.com/) 注册账户,发布的镜像都在[这个页面里](https://cloud.docker.com/repository/list)展示
343 | 2. 将上面做的镜像`nginx`,起个新的名字`nginx-test`
344 |
345 | ```bash
346 | docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest
347 | ```
348 |
349 | 3. 登录docker
350 |
351 | ```
352 | docker login
353 | ```
354 |
355 | 4. 上传`nginx-test`镜像
356 |
357 | ```bash
358 | docker push wcjiang/nginx-test:lastest
359 | # The push refers to a repository [docker.io/wcjiang/nginx-test]
360 | # 2f5c6a3c22e3: Mounted from wcjiang/nginx
361 | # cf516324493c: Mounted from wcjiang/nginx
362 | # lastest: digest: sha256:73ae804b2c60327d1269aa387cf782f664bc91da3180d10dbd49027d7adaa789 size: 736
363 | ```
364 |
365 | ### 镜像中安装软件
366 |
367 | 通常情况下,使用docker官方镜像,如 mysql镜像,默认情况下镜像中啥软件也没有,通过下面命令安装你所需要的软件:
368 |
369 | ```bash
370 | # 第一次需要运行这个命令,确保源的索引是最新的
371 | # 同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引
372 | apt-get update
373 | # 做过上面更新同步之后,可以运行下面的命令了
374 | apt-get install vim
375 | ```
376 |
377 | 如果你安装了CentOS或者Ubuntu系统可以进入系统安装相关软件
378 |
379 | ```bash
380 | # 进入到centos7镜像系统
381 | docker run -i -t centos:7 /bin/bash
382 | yum update
383 | yum install vim
384 | ```
385 |
386 | ## 容器管理
387 |
388 | 容器就像一个类的实例
389 |
390 | ```bash
391 | # 列出本机正在运行的容器
392 | docker container ls
393 | # 列出本机所有容器,包括终止运行的容器
394 | docker container ls --all
395 | docker start [containerID/Names] # 启动容器
396 | docker stop [containerID/Names] # 停止容器
397 | docker rm [containerID/Names] # 删除容器
398 | docker logs [containerID/Names] # 查看日志
399 | docker exec -it [containerID/Names] /bin/bash # 进入容器
400 |
401 | # 从正在运行的 Docker 容器里面,将文件拷贝到本机,注意后面有个【点】拷贝到当前目录
402 | docker container cp [containID]:[/path/to/file] .
403 |
404 | docker run centos echo "hello world" # 在docker容器中运行hello world!
405 | docker run centos yum install -y wget # 在docker容器中,安装wget软件
406 | docker ps # 列出包括未运行的容器
407 | docker ps -a # 查看所有容器(包括正在运行和已停止的)
408 | docker logs my-nginx # 查看 my-nginx 容器日志
409 |
410 | docker run -i -t centos /bin/bash # 启动一个容器
411 | docker inspect centos # 检查运行中的镜像
412 | docker commit 8bd centos # 保存对容器的修改
413 | docker commit -m "n changed" my-nginx my-nginx-image # 使用已经存在的容器创建一个镜像
414 | docker inspect -f {{.State.Pid}} 44fc0f0582d9 # 获取id为 44fc0f0582d9 的PID进程编号
415 | # 下载指定版本容器镜像
416 | docker pull gitlab/gitlab-ce:11.2.3-ce.0
417 | ```
418 |
419 | ### 容器服务管理
420 |
421 | ```bash
422 | docker run -itd --name my-nginx2 nginx # 通过nginx镜像,【创建】容器名为 my-nginx2 的容器
423 | docker start my-nginx --restart=always # 【启动策略】一个已经存在的容器启动添加策略
424 | # no - 容器不重启
425 | # on-failure - 容器推出状态非0时重启
426 | # always - 始终重启
427 | docker start my-nginx # 【启动】一个已经存在的容器
428 | docker restart my-nginx # 【重启】容器
429 | docker stop my-nginx # 【停止运行】一个容器
430 | docker kill my-nginx # 【杀死】一个运行中的容器
431 | docker rename my-nginx new-nginx # 【重命名】容器
432 | docker rm new-nginx # 【删除】容器
433 | ```
434 |
435 | ### 进入容器
436 |
437 | 1. 创建一个守护状态的 Docker 容器
438 |
439 | ```bash
440 | docker run -itd my-nginx /bin/bash
441 | ```
442 |
443 | 2. 使用`docker ps`查看到该容器信息
444 |
445 | ```bash
446 | docker ps
447 | # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
448 | # 6bd0496da64f nginx "/bin/bash" 20 seconds ago Up 18 seconds 80/tcp high_shirley
449 | ```
450 |
451 | 3. 使用`docker exec`命令进入一个已经在运行的容器
452 |
453 | ```bash
454 | docker exec -it 6bd0496da64f /bin/bash
455 | ```
456 |
457 | 通常有下面几种方式进入Docker的容器,推荐使用 `exec`,使用 `attach` 一直进入失败。
458 |
459 | - 使用`docker attach`
460 | - 使用`SSH` [为什么不需要在 Docker 容器中运行 sshd](http://www.oschina.net/translate/why-you-dont-need-to-run-sshd-in-docker?cmp)
461 | - 使用`nsenter`进入Docker容器,[nsenter官方仓库](https://github.com/jpetazzo/nsenter)
462 | - 使用`docker exec`,在`1.3.*`之后提供了一个新的命令`exec`用于进入容器
463 |
464 | ## 文件拷贝
465 |
466 | 从主机复制到容器 `sudo docker cp host_path containerID:container_path`
467 | 从容器复制到主机 `sudo docker cp containerID:container_path host_path`
468 |
469 | ## Docker私有仓库搭建
470 |
471 | 通过官方提供的私有仓库镜像`registry`来搭建私有仓库。通过 [humpback](https://humpback.github.io) 快速搭建轻量级的Docker容器云管理平台。关于仓库配置说明请参见[configuration.md](https://github.com/docker/distribution/blob/master/docs/configuration.md)
472 |
473 | > ⚠️ 注意:也可以通过部署管理工具 `Harbor` 来部署 `registry`
474 |
475 | 除了 [Harbor](https://github.com/goharbor/harbor) 还有 [humpback](https://github.com/humpback/humpback) 和 [rancher](https://github.com/rancher/rancher)
476 |
477 | ### `registry`
478 |
479 | ```bash
480 | docker pull registry:2.6.2
481 | ```
482 |
483 | 创建容器并运行,创建成功之后,可访问 `http://192.168.99.100:7000/v2/`,来检查仓库是否正常运行,当返回 `{}` 时,表示部署成功。
484 |
485 | ```bash
486 | docker run -d \
487 | -p 5000:5000 \
488 | --restart=always \
489 | --name registry \
490 | registry:2
491 |
492 | # 自定义存储位置
493 | docker run -d \
494 | -p 5000:5000 \
495 | --restart=always \
496 | --name registry \
497 | -v $HOME/_docker/registry:/var/lib/registry \
498 | registry:2
499 |
500 | docker run -d -p 5000:5000 --restart=always --name registry \
501 | -v `pwd`/config.yml:/etc/docker/registry/config.yml \
502 | registry:2
503 | ```
504 |
505 | 推送镜像到私有仓库
506 |
507 | ```bash
508 | # 从官方仓库拉取一个镜像
509 | docker pull nginx:1.13
510 | # 为镜像 `nginx:1.13` 创建一个新标签 `192.168.31.69:7000/test-nginx:1.13`
511 | docker tag nginx:latest 192.168.31.69:5000/test-nginx:1.13
512 | # 推送到私有仓库中
513 | docker push 192.168.31.69:5000/test-nginx:1.13
514 | # The push refers to a repository [192.168.99.100:7000/test-nginx]
515 | # Get https://192.168.99.100:7000/v1/_ping: http: server gave HTTP response to HTTPS client
516 | ```
517 |
518 | 在推送到的时候报错误,默认是使用 `https` 提交,这个搭建的默认使用的是 `http`,解决方法两个:
519 |
520 | 1. 创建一个 `https` 映射
521 | 2. 将仓库地址加入到不安全的仓库列表中
522 |
523 | 我们使用第二种方法,加入到不安全的仓库列表中,修改docker配置文件 `vi /etc/docker/daemon.json` 添加 `insecure-registries` 配置信息,如果 [daemon.json](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file) 文件不存在可以创建,关键配置项,将仓库将入到不安全的仓库列表中。
524 |
525 | ```js
526 | {
527 | "insecure-registries":[
528 | "192.168.31.69:5000"
529 | ]
530 | }
531 | ```
532 |
533 | > 如果是 macOS 可以通过 docker 客户端,`Preferences` => `Advanced` => `添加配置` => `Apply & Restart`,重启docker就可以了。
534 |
535 | 重启服务 `service docker restart`,默认情况下 push 是会报如下错误的:
536 |
537 | ```bash
538 | docker push 192.168.99.100:7000/test-nginx:1.13
539 | # The push refers to a repository [192.168.99.100:7000/test-nginx]
540 | # a1a53f8d99b5: Retrying in 1 second
541 | # ...
542 | # received unexpected HTTP status: 500 Internal Server Error
543 | ```
544 |
545 | 上面错误是 `SELinux` 强制访问控制安全系统,阻止导致的错误,通过下面方法禁用 SELinux 之后就可以 push 了。
546 |
547 | ```bash
548 | setenforce 0
549 | getenforce
550 | # Permissive
551 | ```
552 |
553 | ```bash
554 | # 停止本地 registry
555 | docker container stop registry
556 | # 要删除容器,请使用 docker container rm
557 | docker container stop registry && docker container rm -v registry
558 | # 自定义存储位置
559 | ```
560 |
561 | ### `Harbor`
562 |
563 | [部署 registry 管理工具 Harbor](docs/harbor.md)
564 |
565 | ## Docker REST API
566 |
567 | `Docker` 不仅可以通过本地命令行 `docker` 命令进行调用,还可以通过开启远程控制 `API`,使用 `HTTP` 调用接口来进行访问,远程控制 `Docker Daemon` 来做很多操作。`Docker` 的远程 `API` 服务默认监听的是 TCP `2375` 端口,为了保证安全,Docker 安装后默认不会启用远程 `API` 服务,因为这个服务默认不做权限认证。
568 |
569 | ### CentOS
570 |
571 | CentOS 的开启方法比较简单,先修改配置:
572 |
573 | ```shell
574 | vim /usr/lib/systemd/system/docker.service
575 |
576 | # 修改 `ExecStart` 配置项,默认如下:
577 | ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
578 |
579 | # 增加一个 `-H tcp://0.0.0.0:2375` 选项
580 | ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
581 | ```
582 |
583 | 如果是内网生产环境,也可以将 `0.0.0.0` 改为内网 IP。同样的,`2375` 端口也可以修改。但是这样可能还有一个问题,无法在命令行使用 `docker` 命令了,还需要添加 `sock` 选项:`-H unix:///var/run/docker.sock`,最后为:
584 |
585 | ```shell
586 | ExecStart=/usr/bin/dockerd -H fd:// -H unix:///var/run/docker.sock -H tcp://10.105.3.115:2375 --containerd=/run/containerd/containerd.sock
587 | ```
588 |
589 | 修改完配置之后需要重启 Docker 服务:
590 |
591 | ```bash
592 | systemctl daemon-reload
593 | systemctl restart docker
594 | sudo service docker restart
595 | ```
596 |
597 | 重启完成后,可以使用 netstat 查看端口是否监听来确认是否成功:
598 |
599 | ```bash
600 | [root@VM-3-115-centos ~]# netstat -nutlp | grep 2375
601 | tcp 0 0 10.105.3.115:2375 0.0.0.0:* LISTEN 32316/dockerd
602 | ```
603 |
604 | ### MacOS
605 |
606 | 在 Mac 下无法直接修改配置文件来开启远程 API 服务,后来在 [`docker/for-mac`](https://github.com/docker/for-mac) 的 [`issue`](https://github.com/docker/for-mac/issues/770) 中得到了解决方案。
607 |
608 | 可以运行一个 [`bobrik/socat`](https://hub.docker.com/r/bobrik/socat) 容器,将 `unix socket` 上的 Docker API 转发到 MacOS 上指定的端口中:
609 |
610 | ```bash
611 | docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
612 | ```
613 |
614 | ### 测试
615 |
616 | 启用成功后,可以进行一些测试,例如直接使用浏览器访问 info 和 version 等页面获取信息。
617 |
618 | ```bash
619 | http://127.0.0.1:2375/info
620 | http://127.0.0.1:2375/version
621 | ```
622 |
623 | 下面可测试 docker 是否启动了
624 |
625 | ```bash
626 | curl -s --unix-socket /var/run/docker.sock http://dummy/containers/json
627 | ## 或者使用下面命令
628 | docker info
629 | ```
630 |
631 | ## 使用 Docker 实战
632 |
633 | > ⚠文件挂载注意:docker 禁止用主机上不存在的文件挂载到 container 中已经存在的文件
634 |
635 | ```bash
636 | -d, --detach=false # 指定容器运行于前台还是后台,默认为false
637 | -i, --interactive=false # 打开STDIN,用于控制台交互
638 | -t, --tty=false # 分配tty设备,该可以支持终端登录,默认为false
639 | -u, --user="" # 指定容器的用户
640 | -a, --attach=[] # 登录容器(必须是以docker run -d启动的容器)
641 | -w, --workdir="" # 指定容器的工作目录
642 | -c, --cpu-shares=0 # 设置容器CPU权重,在CPU共享场景使用
643 | -e, --env=[] # 指定环境变量,容器中可以使用该环境变量
644 | -m, --memory="" # 指定容器的内存上限
645 | -P, --publish-all=false # 指定容器暴露的端口
646 | -p, --publish=[] # 指定容器暴露的端口
647 | -h, --hostname="" # 指定容器的主机名
648 | -v, --volume=[] # 给容器挂载存储卷,挂载到容器的某个目录
649 | --volumes-from=[] # 给容器挂载其他容器上的卷,挂载到容器的某个目录
650 | --cap-add=[] # 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
651 | --cap-drop=[] # 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
652 | --cidfile="" # 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
653 | --cpuset="" # 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
654 | --device=[] # 添加主机设备给容器,相当于设备直通
655 | --dns=[] # 指定容器的dns服务器
656 | --dns-search=[] # 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
657 | --entrypoint="" # 覆盖image的入口点
658 | --env-file=[] # 指定环境变量文件,文件格式为每行一个环境变量
659 | --expose=[] # 指定容器暴露的端口,即修改镜像的暴露端口
660 | --link=[] # 指定容器间的关联,使用其他容器的IP、env等信息
661 | --lxc-conf=[] # 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
662 | --name="" # 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
663 | --net="bridge" # 容器网络设置:
664 | # bridge 使用docker daemon指定的网桥
665 | # host //容器使用主机的网络
666 | # container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
667 | # none 容器使用自己的网络(类似--net=bridge),但是不进行配置
668 | --privileged=false # 指定容器是否为特权容器,特权容器拥有所有的capabilities
669 | --restart="no" # 指定容器停止后的重启策略:
670 | # no:容器退出时不重启
671 | # on-failure:容器故障退出(返回值非零)时重启
672 | # always:容器退出时总是重启
673 | --rm=false # 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
674 | --sig-proxy=true # 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
675 | ```
676 |
677 | ### `Nginx`
678 |
679 | [在 docker 中部署 Nginx](docs/nginx.md)
680 |
681 | ### `MySQL`
682 |
683 | [在 docker 中部署 MySQL](docs/mysql.md)
684 |
685 | ### `PostgreSQL`
686 |
687 | [在 docker 中部署 PostgreSQL](docs/postgres.md)
688 |
689 | ### `Redis`
690 |
691 | [在 docker 中部署 Redis](docs/redis.md)
692 |
693 | ### `Elasticsearch`
694 |
695 | [在 docker 中部署 Elasticsearch](docs/elasticsearch.md)
696 |
697 | ### `Gitlab`
698 |
699 | [在 docker 中部署 Gitlab](docs/gitlab/README.md)
700 |
701 | ### `Rocket.Chat`
702 |
703 | [在 docker 中部署 Gitlab](docs/rocket.chat/README.md)
704 |
705 | ### `Rancher`
706 |
707 | [在 docker 中部署 Rancher](docs/rancher.md)
708 |
709 | ### `Portainer`
710 |
711 | [在 docker 中部署 Portainer](docs/portainer.md)
712 |
713 | ### `Sourcegraph`
714 |
715 | [在 docker 中部署 Sourcegraph](docs/sourcegraph/README.md)
716 |
717 | ### `Mattermost`
718 |
719 | [在 docker 中部署 Mattermost](docs/mattermost.md)
720 |
721 | ### `SeaweedFS`
722 |
723 | [在 docker 中部署 SeaweedFS](docs/seaweedfs/README.md)
724 |
725 | ### `NPS`
726 |
727 | [在 docker 中搭建内网穿透服务器,带WEB管理](docs/nps/README.md)
728 |
729 | ### `Penpot`
730 |
731 | [在 docker 中部署 Penpot](docs/penpot.md)
732 |
733 | ### `Navidrome`
734 |
735 | [在 docker 中部署 Navidrome](docs/navidrome.md)
736 |
737 | ### `Jenkins`
738 |
739 | [在 docker 中部署 Jenkins](docs/jenkins/README.md)
740 |
741 | ### `Humpback`
742 |
743 | 首先创建放持久化数据文件夹,`mkdir -p /opt/app/humpback-web`,里面存放持久化数据文件,会存储站点管理和分组信息,启动后请妥善保存。
744 |
745 | ```bash
746 | # 创建放持久化数据文件夹
747 | mkdir -p /opt/app/humpback-web
748 | # 下载humpback-web镜像到本地
749 | docker pull humpbacks/humpback-web:1.0.0
750 | # 启动 humpback-web 容器,将容器命名为 humpback-web
751 | docker run -d --net=host --restart=always \
752 | -e HUMPBACK_LISTEN_PORT=7001 \
753 | -v /opt/app/humpback-web/dbFiles:/humpback-web/dbFiles \
754 | --name humpback-web \
755 | humpbacks/humpback-web:1.0.0
756 | ```
757 |
758 | 访问站点,打开浏览器输入:http://192.168.99.100:7001 ,默认账户:`admin` 密码:`123456`
759 |
760 | ### `Seafile`
761 |
762 | ```shell
763 | docker run -d --name seafile \
764 | -e SEAFILE_SERVER_HOSTNAME=seafile.example.com \
765 | -v /opt/seafile-data:/shared \
766 | -p 80:80 \
767 | seafileltd/seafile:latest
768 | ```
769 |
770 | ```shell
771 | docker run -d --name seafile \
772 | -e SEAFILE_SERVER_HOSTNAME=pan.example.com \
773 | -e SEAFILE_ADMIN_EMAIL=wcj@example.com \
774 | -e SEAFILE_ADMIN_PASSWORD=wcj@example.com \
775 | -v $HOME/_docker/seafile-data:/shared \
776 | -p 80:80 \
777 | seafileltd/seafile:latest
778 | ```
779 |
780 | ### 更多
781 |
782 | [更多 docker 工具部署,在 docker 目录中](docs/)
783 |
784 | ## 卸载旧的版本
785 |
786 | 移除旧的版本
787 |
788 | ```bash
789 | $ sudo yum remove docker \
790 | docker-client \
791 | docker-client-latest \
792 | docker-common \
793 | docker-latest \
794 | docker-latest-logrotate \
795 | docker-logrotate \
796 | docker-selinux \
797 | docker-engine-selinux \
798 | docker-engine
799 | ```
800 |
801 | ## 错误处理
802 |
803 | Create more free space in thin pool or use dm.min_free_space option to change behavior
804 |
805 | > 特别慎用,东西都没有了,注意备份哦。https://github.com/moby/moby/issues/3182#issuecomment-256532928
806 |
807 | **镜像拉不下来**
808 |
809 | 修改 Docker `daemon.json` 配置 macOS: `/etc/docker/daemon.json`,Linux: `~/.docker/daemon.json`
810 |
811 | ```js
812 | {
813 | "registry-mirrors":[
814 | "https://docker.mirrors.ustc.edu.cn",
815 | "https://hub-mirror.c.163.com",
816 | "https://mirror.baidubce.com",
817 | "https://registry.docker-cn.com"
818 | ],
819 | "insecure-registries": [
820 | "192.168.188.111:2021"
821 | ]
822 | }
823 | ```
824 |
825 | ## 参考资料
826 |
827 | ### 官方英文资源
828 |
829 | - Docker官网:http://www.docker.com
830 | - Docker windows入门:https://docs.docker.com/windows/
831 | - Docker Linux 入门:https://docs.docker.com/linux/
832 | - Docker mac 入门:https://docs.docker.com/mac/
833 | - Docker 用户指引:https://docs.docker.com/engine/userguide/
834 | - Docker 官方博客:http://blog.docker.com/
835 | - Docker Hub: https://hub.docker.com/
836 | - Docker开源: https://www.docker.com/open-source
837 |
838 | ### 中文资源
839 |
840 | - Docker中文网站:http://www.docker.org.cn
841 | - Docker中文文档:http://www.dockerinfo.net/document
842 | - Docker安装手册:http://www.docker.org.cn/book/install.html
843 | - 一小时Docker教程 :https://blog.csphere.cn/archives/22
844 | - Docker中文指南:http://www.widuu.com/chinese_docker/index.html
845 |
846 | ### 其它资源
847 |
848 | - [Docker 参考清单!](https://jaywcjlove.github.io/reference/docs/docker.html)
849 | - [Docker 快速手册!](https://github.com/eon01/DockerCheatSheet)
850 | - [Docker 教程](http://www.runoob.com/docker/docker-tutorial.html)
851 | - [Docker 从入门到实践](https://www.gitbook.com/book/yeasy/docker_practice)
852 | - [MySQL Docker 单一机器上如何配置自动备份](http://blog.csdn.net/zhangchao19890805/article/details/52756865)
853 | - [使用Docker Compose管理多个容器](http://dockone.io/article/834)
854 | - https://segmentfault.com/t/docker
855 | - https://github.com/docker/docker
856 | - https://wiki.openstack.org/wiki/Docker
857 | - https://wiki.archlinux.org/index.php/Docker
858 |
859 | ## Contributors
860 |
861 | As always, thanks to our amazing contributors!
862 |
863 |
864 |
865 |
866 |
867 | Made with [action-contributors](https://github.com/jaywcjlove/github-action-contributors).
868 |
869 | ## License
870 |
871 | Licensed under the MIT License.
872 |
--------------------------------------------------------------------------------
/docs/docker-compose.md:
--------------------------------------------------------------------------------
1 | Docker Compose
2 | ===
3 |
4 | 
5 |
6 | `docker-compose` 是用来做 `docker` 的多容器控制,这个工具是用于 docker 自动化的东西,将多个 docker 容器的操作命令,简化成一条命令,自动完成配置中的容器启动。
7 |
8 | ## 安装
9 |
10 | [官方安装教程](https://docs.docker.com/compose/install/#install-compose)
11 |
12 | ```bash
13 | # 在 Linux CentOS 7 系统中安装
14 | # 如果 curl 不存在需要安装, `yum install curl`
15 | sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
16 | # 给 docker-compose 执行权限
17 | sudo chmod +x /usr/local/bin/docker-compose
18 | # 测试是否安装成功
19 | docker-compose --version
20 | # docker-compose version 1.22.0, build 1719ceb
21 | ```
22 |
23 | ## 服务运行
24 |
25 | ```bash
26 | # 停止当前服务
27 | docker-compose -p intelligent-community-dev -f docker-compose.dev.yml down
28 | # 使用 docker-compose 后台启动服务
29 | docker-compose -f docker-compose.dev.yml pull
30 | docker-compose -p intelligent-community-dev -f docker-compose.dev.yml up -d
31 |
32 | docker stack deploy --compose-file=docker-compose.yml my-name
33 | docker stack services my-name # 部署成功之后查看详情
34 | docker stack deploy # 部署新的堆栈或更新现有堆栈
35 | docker stack ls # 列出现有堆栈
36 | docker stack ps # 列出堆栈中的任务
37 | docker stack rm # 删除一个或多个堆栈
38 | docker stack services # 列出堆栈中的服务
39 | ```
40 |
41 | ## 卸载
42 |
43 | ```bash
44 | sudo rm /usr/local/bin/docker-compose
45 | pip uninstall docker-compose
46 | ```
--------------------------------------------------------------------------------
/docs/elasticsearch.md:
--------------------------------------------------------------------------------
1 | ElasticSearch 6.4.2
2 | ===
3 |
4 | ```bash
5 | # 最新版本
6 | docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.2
7 | # 运行容器
8 | docker run \
9 | --name es
10 | -p 9200:9200 -p 9300:9300 \
11 | -e "discovery.type=single-node" \
12 | docker.elastic.co/elasticsearch/elasticsearch:6.4.2
13 | ```
14 |
15 | ## ElasticSearch 5.3.3
16 |
17 | ElasticSearch 5.3.3 docker 运行
18 |
19 | ```bash
20 | # 下载老版本
21 | docker pull docker.elastic.co/elasticsearch/elasticsearch:5.3.3
22 | # 运行容器
23 | docker run \
24 | --name es \
25 | -p 9200:9200 \
26 | -e "http.host=0.0.0.0" \
27 | -e "transport.host=127.0.0.1" \
28 | -d docker.elastic.co/elasticsearch/elasticsearch:5.3.3
29 | ```
30 |
31 | **Linux**
32 |
33 | ⚠️注意:vm_max_map_count 内核设置需要设置为至少262144以供生产使用。
34 |
35 | 应在 `/etc/sysctl.conf` 中永久设置 `vm_map_max_count` 设置:
36 |
37 | ```bash
38 | $ grep vm.max_map_count /etc/sysctl.conf
39 | vm.max_map_count=262144
40 | ```
41 |
42 | ## 通过 docker-compose 安装使用
43 |
44 | 新建 [docker-compose.yml](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/docker.html) 文件
45 |
46 | ```yaml
47 | version: '2'
48 | services:
49 | elasticsearch1:
50 | image: docker.elastic.co/elasticsearch/elasticsearch:5.3.3
51 | container_name: elasticsearch1
52 | environment:
53 | - cluster.name=docker-cluster
54 | - bootstrap.memory_lock=true
55 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
56 | ulimits:
57 | memlock:
58 | soft: -1
59 | hard: -1
60 | nofile:
61 | soft: 65536
62 | hard: 65536
63 | mem_limit: 1g
64 | cap_add:
65 | - IPC_LOCK
66 | volumes:
67 | - esdata1:/usr/share/elasticsearch/data
68 | ports:
69 | - 9200:9200
70 | networks:
71 | - esnet
72 | elasticsearch2:
73 | image: docker.elastic.co/elasticsearch/elasticsearch:5.3.3
74 | environment:
75 | - cluster.name=docker-cluster
76 | - bootstrap.memory_lock=true
77 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
78 | - "discovery.zen.ping.unicast.hosts=elasticsearch1"
79 | ulimits:
80 | memlock:
81 | soft: -1
82 | hard: -1
83 | nofile:
84 | soft: 65536
85 | hard: 65536
86 | mem_limit: 1g
87 | cap_add:
88 | - IPC_LOCK
89 | volumes:
90 | - esdata2:/usr/share/elasticsearch/data
91 | networks:
92 | - esnet
93 |
94 | volumes:
95 | esdata1:
96 | driver: local
97 | esdata2:
98 | driver: local
99 |
100 | networks:
101 | esnet:
102 | driver: bridge
103 | ```
104 |
105 | 示例显示包含两个 `Elasticsearch` 节点的集群。 要打开群集,请使用 `docker-compose.yml` 并输入:
106 |
107 | ```bash
108 | docker-compose up -d
109 | docker-compose down # 停止集群
110 | docker-compose down -v # 销毁集群和数据卷
111 | docker logs elasticsearch1 # 查看日志
112 | ```
113 |
114 | `elasticsearch1` 监听 `localhost:9200`,而 `elasticsearch2` 通过 `Docker` 网络与 `elasticsearch1` 进行通信。
115 |
116 | 此示例还使用名为 `esdata1` 和 `esdata2` 的 [Docker named volumes](https://docs.docker.com/engine/tutorials/dockervolumes),如果尚未存在,将创建它们。
117 |
118 | ## 检查集群的状态
119 |
120 | ```bash
121 | curl -u elastic http://127.0.0.1:9200/_cat/health
122 | Enter host password for user 'elastic':
123 | 1472225929 15:38:49 docker-cluster green 2 2 4 2 0 0 0 0 - 100.0%
124 | ```
125 |
126 |
127 | ## 用户名密码
128 |
129 | 默认用户名密码 `elastic/changeme`
130 |
131 | ```bash
132 | curl -XPUT -u elastic 'http://localhost:9200/_xpack/security/user/kibana/_password' -d '{
133 | "password" : "yourpasswd"
134 | }'
135 | ```
136 |
137 | ## 挂载配置
138 |
139 | 创建自定义配置文件并将其挂载到映像的相应文件上。 例如,可以使用以下参数来完成使用 `docker run` 绑定安装custom_elasticsearch.yml:
140 |
141 | ```bash
142 | -v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
143 | ```
144 |
145 | 其它配置修改项
146 |
147 | ```bash
148 | # 避免出现跨域问题
149 | http.cors.enabled: true
150 | http.cors.allow-origin: "*"
151 | # 在chorem中 当elasticsearch安装x-pack后还可以访问
152 | http.cors.allow-headers: Authorization
153 | # 启用审核以跟踪与您的Elasticsearch群集进行的尝试和成功的交互
154 | xpack.security.audit.enabled: true
155 | ```
156 |
157 | ## 定义镜像
158 |
159 | ```dockerfile
160 | FROM docker.elastic.co/elasticsearch/elasticsearch:5.3.3
161 | ADD elasticsearch.yml /usr/share/elasticsearch/config/
162 | USER root
163 | RUN chown elasticsearch:elasticsearch config/elasticsearch.yml
164 | USER elasticsearch
165 | ```
166 |
167 | 然后,您可以使用以下内容构建和尝试运行镜像:
168 |
169 | ```bash
170 | docker build --tag=elasticsearch-custom .
171 | docker run -ti -v /usr/share/elasticsearch/data elasticsearch-custom
172 | # 覆盖默认的 CMD
173 | docker run <各种参数> bin/elasticsearch -Ecluster.name=mynewclustername
174 | ```
175 |
176 | ## 生产的一些经验
177 |
178 | - 镜像公开 `TCP` 端口 `9200` 和 `9300`。对于群集,建议使用 `--publish-all` 随机化已发布的端口,除非您为每个主机固定一个容器。
179 | - 使用 `ES_JAVA_OPTS` 环境变量来设置堆大小,例如使用 `16GB` 通过使用 `-e ES_JAVA_OPTS=-Xms16g -Xms16g"` 和 `dcker run` 来运行。 还建议为容器设置内存限制。
180 |
181 | ## 其它
182 |
183 | - [ElasticSearch 5.3 官方 Docker 安装教程](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/docker.html)
184 | - [ElasticSearch 官方 Docker 安装教程](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)
185 | - [Docker 镜像仓库](https://hub.docker.com/r/library/elasticsearch/)
--------------------------------------------------------------------------------
/docs/gitlab/001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/gitlab/001.png
--------------------------------------------------------------------------------
/docs/gitlab/002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/gitlab/002.png
--------------------------------------------------------------------------------
/docs/gitlab/README.md:
--------------------------------------------------------------------------------
1 | Docker 部署 Gitlab
2 | ===
3 |
4 | 在 Docker 中安装 Gitlab 教程,[官方文档](https://docs.gitlab.com/omnibus/docker/),如果你想使用原生安装,教程在这里:[CentOS7安装维护Gitlab](https://github.com/jaywcjlove/handbook/blob/9adc40d9e684928ee68d3301afbd78eee7fe3816/CentOS/CentOS7%E5%AE%89%E8%A3%85%E7%BB%B4%E6%8A%A4Gitlab.md)
5 |
6 | ## 下载镜像
7 |
8 | ```bash
9 | docker pull gitlab/gitlab-ce
10 | ```
11 |
12 | ## 运行容器
13 |
14 | ```bash
15 | sudo docker run \
16 | --hostname gitlab.example.com \
17 | --publish 8443:443 --publish 8081:80 -p 2222:22 \
18 | --name gitlab \
19 | --restart always \
20 | --volume $HOME/_docker/gitlab/config:/etc/gitlab \
21 | --volume $HOME/_docker/gitlab/logs:/var/log/gitlab \
22 | --volume $HOME/_docker/gitlab/data:/var/opt/gitlab \
23 | -v /etc/localtime:/etc/localtime \
24 | -d \
25 | gitlab/gitlab-ce:latest
26 | ```
27 |
28 | 由于端口冲突,重新映射了一个端口 `2222`,如果不想麻烦,可以事先将 ssh 端口号更改成别的端口号,[修改ssh端口号的方法](https://github.com/jaywcjlove/handbook/blob/9adc40d9e684928ee68d3301afbd78eee7fe3816/CentOS/%E4%BF%AE%E6%94%B9ssh%E7%AB%AF%E5%8F%A3%E5%8F%B7%E7%9A%84%E6%96%B9%E6%B3%95.md)
29 |
30 | ```bash
31 | # 要从之前的:
32 | git clone git@gitlab.example.com:myuser/awesome-project.git
33 | # 改为明确使用 `ssh://` 的 `URL` 方式。
34 | git clone ssh://git@gitlab.example.com:2222/myuser/awesome-project.git
35 | ```
36 |
37 | 为了克隆不必麻烦,保留 `gitlab` 的 `22` 端口映射,将主机的 `sshd` 的 `22` 端口映射到容器中去。将主机的 sshd 端口更改为 `2222`
38 |
39 | 编辑文件 `/etc/ssh/sshd_config`,将其中的 `#Port 22` 注释去掉,将数字 `22` 更改为 `2222`,执行下面的命令重启 `sshd` 服务
40 |
41 | ```bash
42 | systemctl restart sshd
43 | ```
44 |
45 | 防火墙的规则,添加开发 `2222` 端口
46 |
47 | ```bash
48 | iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
49 | iptables -A OUTPUT -p tcp --sport 2222 -j ACCEPT
50 | # 再查看下是否添加上去, 看到添加了
51 | iptables -L -n
52 | ```
53 |
54 | 如果此容器由于权限问题而无法启动,请尝试通过执行以下操作来修复它:
55 |
56 | ```bash
57 | docker exec -it gitlab update-permissions
58 | docker restart gitlab
59 | ```
60 |
61 | ## 容器手动备份
62 |
63 | ```bash
64 | # 第一种进行入容器执行命令的方法进行手工备份
65 | docker exec -it 容器名或容器id bash # 进入容器
66 | gitlab-rake gitlab:backup:create # 执行gitlab备份命令
67 |
68 | # 第二种直接使用外部命令执行,一次完成
69 | docker exec 容器名或容器id gitlab-rake gitlab:backup:create
70 | ```
71 |
72 | 若结果显示 `Errno::EACCES: Permission denied @ dir_s_mkdir - /var/opt/gitlab/backups/db`,则说明当前路径的 `权限不足` 以及 `拥有者` 错误,需要授予当前路径对应的权限并把拥有者改为 `git`。进入容器执行下面命令:
73 |
74 | ```bash
75 | chmod -R 755 /var/opt/gitlab/backups
76 | chown -R git:git /var/opt/gitlab/backups
77 | ```
78 |
79 | ### 自动备份
80 |
81 | 通过在宿主机上使用 crontab 使用备份命令实现自动备份
82 |
83 | 添加备份脚本 `vi ~/_docker/gitlab/gitlab.backup.sh`,将下面内容添加到脚本中,保存之后添加可执行权限 `chmod +x gitlab.backup.sh`
84 |
85 | ```shell
86 | #!/bin/bash
87 | case "$1" in
88 | start)
89 | docker exec gitlab-ce11.2.3 gitlab-rake gitlab:backup:create
90 | ;;
91 | esac
92 | ```
93 |
94 | 创建定时执行计划
95 |
96 | ```bash
97 | crontab -e # 进入编辑,添加下面内容
98 |
99 | # 每天2点备份 gitlab 数据
100 | 0 2 * * * $HOME/_docker/gitlab/gitlab.backup.sh start
101 | # * * * * * command
102 | # 分 时 日 月 周 命令
103 |
104 | # 其中,
105 | # 第1列表示分钟,1~59,每分钟用*表示
106 | # 第2列表示小时,1~23,(0表示0点)
107 | # 第3列表示日期,1~31
108 | # 第4列表示月份,1~12
109 | # 第5列表示星期,0~6(0表示星期天)
110 | # 第六列表示要运行的命令。
111 | ```
112 |
113 | 上面两行保存之后,重新载入配置
114 |
115 | ```bash
116 | service crond reload
117 | # or
118 | systemctl reload crond.service
119 | ```
120 |
121 | ### 备份保留七天
122 |
123 | 设置只保存最近7天的备份,编辑 `vi $HOME/_docker/gitlab/config/gitlab.rb` 配置文件,找到如下代码,删除注释 `#` 保存
124 |
125 | ```bash
126 | # /etc/gitlab/gitlab.rb 配置文件 修改下面这一行
127 | gitlab_rails['backup_keep_time'] = 604800
128 | ```
129 |
130 | 重新加载 `gitlab` 配置文件
131 |
132 | ```bash
133 | docker exec 容器名或容器ID gitlab-ctl reconfigure
134 | ```
135 |
136 | ## 备份恢复
137 |
138 | ```sh
139 | # 从xxxxx编号备份中恢复
140 | # 然后恢复数据,1406691018为备份文件的时间戳
141 | gitlab-rake gitlab:backup:restore BACKUP=1406691018
142 |
143 | # 新版本 1721392543_2024_07_19_17.0.1_gitlab_backup.tar
144 | gitlab-rake gitlab:backup:restore BACKUP=1721392543_2024_07_19_17.0.1
145 | ```
146 |
147 | ## 容器管理
148 |
149 | ```bash
150 | docker stop gitlab # 停止容器
151 | docker rm gitlab # 删除容器
152 | docker start gitlab # 启动容器
153 | # 编辑 gitlab 容器配置
154 | docker exec -it gitlab vim /etc/gitlab/gitlab.rb
155 | # 重启 gitlab 容器
156 | docker restart gitlab
157 | ```
158 |
159 | ## 通过 Docker Compose 安装
160 |
161 | 使用 Docker Compose,可以轻松配置,安装和升级基于 Docker 的 GitLab 安装,[官方教程在这里](https://docs.gitlab.com/omnibus/docker/README.html#install-gitlab-using-docker-compose)。
162 |
163 | **第一步:** Docker [官方教程安装](https://docs.docker.com/compose/install/) Docker Compose。
164 |
165 | **第二步:** 创建 `docker-compose.yml` 文件,将下面配置复制到文件中 (或者下载[官方示例](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/docker/docker-compose.yml)):
166 |
167 |
168 | ```yaml
169 | web:
170 | image: 'gitlab/gitlab-ce:latest'
171 | restart: always
172 | hostname: 'gitlab.example.com'
173 | environment:
174 | GITLAB_OMNIBUS_CONFIG: |
175 | external_url 'https://gitlab.example.com'
176 | gitlab_rails['time_zone'] = 'Asia/Shanghai'
177 | gitlab_rails['backup_keep_time'] = 259200 # 3 Day, 259200 seconds
178 | registry_external_url 'http://192.168.188.222:5008'
179 | ports:
180 | - '8081:80'
181 | - '8443:443'
182 | - '22:22'
183 | volumes:
184 | - ./gitlab-data/config:/etc/gitlab
185 | - ./gitlab-data/logs:/var/log/gitlab
186 | - ./gitlab-data/data:/var/opt/gitlab
187 | - /etc/localtime:/etc/localtime
188 | ```
189 |
190 | **第三步:** 确保与 `docker-compose.yml` 文件同一目录下运行 `docker-compose up -d` 启动 Gitlab
191 |
192 |
193 | ## 使用 Docker Swarm
194 |
195 | [官方教程](https://docs.gitlab.com/omnibus/docker/README.html#deploy-gitlab-in-a-docker-swarm) 创建 `docker-compose.yml` 文件
196 |
197 | ```yaml
198 | version: "3.6"
199 | services:
200 | gitlab:
201 | image: gitlab/gitlab-ce:latest
202 | container_name: gitlab
203 | ports:
204 | - "22:22"
205 | - "80:80"
206 | - "443:443"
207 | volumes:
208 | - /srv/gitlab/data:/var/opt/gitlab
209 | - /srv/gitlab/logs:/var/log/gitlab
210 | - /srv/gitlab/config:/etc/gitlab
211 | - /etc/localtime:/etc/localtime
212 | environment:
213 | GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
214 | configs:
215 | - source: gitlab
216 | target: /omnibus_config.rb
217 | secrets:
218 | - gitlab_root_password
219 | gitlab-runner:
220 | image: gitlab/gitlab-runner:alpine
221 | container_name: gitlab-runner
222 | deploy:
223 | mode: replicated
224 | replicas: 4
225 | configs:
226 | gitlab:
227 | file: ./gitlab.rb
228 | secrets:
229 | gitlab_root_password:
230 | file: ./root_password.txt
231 | ```
232 |
233 | 创建 `gitlab.rb` 文件
234 |
235 | ```rb
236 | external_url 'https://my.domain.com/'
237 | gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password')
238 | gitlab_rails['backup_keep_time'] = 604800
239 | gitlab_rails['time_zone'] = 'Asia/Shanghai' # 中国的东八区时间
240 | ```
241 |
242 | 由于新版 `docker-runner` 不支持 `https`,必须设置 `ssl`
243 |
244 | ```rb
245 | nginx['redirect_http_to_https'] = false
246 | nginx['ssl_certificate'] = "/var/opt/gitlab/ssl/fullchain.pem"
247 | nginx['ssl_certificate_key'] = "/var/opt/gitlab/ssl/privkey.pem"
248 | ```
249 |
250 | 创建 `root_password.txt` 文件
251 |
252 | ```
253 | MySuperSecretAndSecurePass0rd!
254 | ```
255 |
256 | 确保您与 `docker-compose.yml` 在同一目录中并运行:
257 |
258 | ```bash
259 | docker stack deploy --compose-file docker-compose.yml gitlab
260 | ```
261 |
262 | ## 注册 Runner
263 |
264 | 官方 [`注册 runner`](https://docs.gitlab.com/runner/install/docker.html) 文档
265 |
266 | ### 更新配置
267 |
268 | 如果您在 `config.toml` 中更改配置,则可能需要重新启动运行程序以应用更改。 确保重新启动整个容器,而不是使用 `gitlab-runner restart`:
269 |
270 | ```shell
271 | docker restart gitlab-runner
272 | ```
273 |
274 | ### 升级版本
275 |
276 | Pull the latest version (or a specific tag):
277 |
278 | ```shell
279 | docker pull gitlab/gitlab-runner:latest
280 | ```
281 |
282 | Stop and remove the existing container:
283 |
284 | ```shell
285 | docker stop gitlab-runner && docker rm gitlab-runner
286 | ```
287 |
288 | Start the container as you did originally:
289 |
290 | ```shell
291 | docker run -d --name gitlab-runner --restart always \
292 | -v /var/run/docker.sock:/var/run/docker.sock \
293 | -v /home/www/gitlab/gitlab-runner/config:/etc/gitlab-runner \
294 | gitlab/gitlab-runner:latest
295 | ```
296 |
297 | 服务 gitlab-runner 跑起来之后可以注册对应的仓库
298 |
299 | ```shell
300 | docker run --rm -it -v /home/www/gitlab/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
301 |
302 | # Runtime platform arch=amd64 os=linux pid=8 revision=943fc252 version=13.7.0
303 | # Running in system-mode.
304 |
305 | # Enter the GitLab instance URL (for example, https://gitlab.com/):
306 | # https://g.xxxxx.cn/
307 | # Enter the registration token:
308 | # ze9H4**********
309 | # Enter a description for the runner:
310 | # [7d0472a5e808]: web
311 | # Enter tags for the runner (comma-separated):
312 |
313 | # Registering runner... succeeded runner=ze9H44QH
314 | # Enter an executor: docker-ssh+machine, docker-ssh, parallels, virtualbox, docker+machine, kubernetes, custom, docker, shell, ssh:
315 | # shell
316 | # Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
317 | ```
318 |
319 | - [gitlab-ci templates](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml)
320 |
321 | ```toml
322 | concurrent = 1
323 | check_interval = 0
324 |
325 | [session_server]
326 | session_timeout = 1800
327 |
328 | [[runners]]
329 | name = "项目名称"
330 | url = "https://g.xxxxx.cn/"
331 | token = "xxx-y1vb"
332 | executor = "docker"
333 |
334 | [runners.custom_build_dir]
335 | [runners.cache]
336 | [runners.cache.s3]
337 | [runners.cache.gcs]
338 | [runners.cache.azure]
339 | [runners.docker]
340 | environment = ['GIT_SSL_NO_VERIFY=true']
341 | tls_verify = false
342 | image = "node:12"
343 | privileged = false
344 | pull_policy = "if-not-present"
345 | disable_entrypoint_overwrite = false
346 | oom_kill_disable = false
347 | disable_cache = false
348 | volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
349 | shm_size = 0
350 | ```
351 |
352 | 1. ⚠️ `token` 是生成的,必须通过 `gitlab-runner` 生成 `token`
353 | 2. `volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]` 配置添加很重要,解决下面错误:
354 |
355 | ```
356 | ERROR: error during connect: Get http://docker:2375/v1.40/info: dial tcp: lookup docker on 8.8.8.8:53: no such host
357 | ```
358 |
359 | 3. `pull_policy = "if-not-present"` 策略改为:镜像不存在时才拉取。
360 | 4. Gitlab runner: This job is stuck because the project doesn't have any runners online assigned to it.
361 |
362 | 工作被卡住了,因为你的 runner 有标签,但你的 job 没有。 按照以下 4 个步骤,让您的 runner 在没有标签的情况下运行:
363 |
364 | 
365 |
366 | 
367 |
368 | ## CI 中使用编译提交镜像
369 |
370 | 下面是 [官方仓库 Docker.gitlab-ci.yml](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Docker.gitlab-ci.yml) 模板
371 |
372 | ```yml
373 | docker-build-master:
374 | # Official docker image.
375 | image: docker:latest
376 | stage: build
377 | services:
378 | - docker:dind
379 | before_script:
380 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
381 | script:
382 | - docker build --pull -t "$CI_REGISTRY_IMAGE" .
383 | - docker push "$CI_REGISTRY_IMAGE"
384 | # 运行服务
385 | - if [ $(docker ps -aq --filter name=docker-service-name) ]; then docker rm -rf docker-service-name;fi
386 | - docker run -itd -p 5000:5000 --name docker-service-name "$CI_REGISTRY_IMAGE":latest
387 | only:
388 | - master
389 | ```
390 |
391 | - `CI_REGISTRY_USER` Github 用户名 Example: `wangchujiang`
392 | - `CI_REGISTRY_PASSWORD` 密码(personal_access_tokens),密码是需要通过 [Gitlab > User Settings > Access Tokens > Add a personal access token](http://g.showgold.cn/-/profile/personal_access_tokens)) 生成一个 `personal_access_tokens` 而不是真正的密码
393 | - `CI_REGISTRY` Registry 地址 Example: `192.168.188.222:8070`
394 | - `CI_REGISTRY_IMAGE` Example: `192.168.188.222:5008/docker/docker-static-service-template`
395 |
396 | ```yml
397 | docker-build:
398 | # Official docker image.
399 | image: docker:latest
400 | stage: build
401 | services:
402 | - docker:dind
403 | before_script:
404 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
405 | script:
406 | - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
407 | - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
408 | except:
409 | - master
410 | ```
411 |
412 | ## 错误处理
413 |
414 | ```bash
415 | gitlab ci ERROR: Uploading artifacts to coordinator... too large archive
416 | ```
417 |
418 | 使用管理员帐户登陆 `Gitlab` -> `Admin Area` -> `Settings` 修改 `Maximum artifacts size (MB)` 值,然后保存,然而并没有解决,我的问题是 nginx 代理造成的,最终通过修改 nginx 代理配置解决问题:
419 |
420 | ```nginx
421 | client_max_body_size 10m;
422 | ```
423 |
424 | ## 升级
425 |
426 | 目标版本 | 你的版本 | 支持升级 | 路径 | 注意
427 | ---- | ---- | ---- | ---- | ----
428 | `14.1.6` | `13.9.2` | `13.9.2` -> `13.12.12` -> `14.0.11` -> `14.1.6` | 需要两个中间版本:`13.12` 和 `14.0`,然后是 `14.1`。
429 | `13.12.10` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.8.8` -> `13.12.10` | 需要四个中间版本:`12.10`、`13.0`、`13.1` 和 `13.8.8`,然后是 `13.12.10`。
430 | `13.2.10` | `11.5.0` | `11.5.0` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.2.10` | 需要六个中间版本:`11.11`、`12.0`、`12.1`、`12.10`、`13.0` 和 `13.1`,然后是 `13.2.10`。
431 |
432 | 假设我是 `13.9.2` 升级到 `14.1.6`,通过官方提供的[升级路径](https://docs.gitlab.com/ee/update/index.html#upgrade-paths) => `13.9.2` -> `13.12.12` -> `14.0.11` -> `14.1.6`
433 |
434 | ```bash
435 | docker pull gitlab/gitlab-ce:13.12.12-ce.0
436 | docker pull gitlab/gitlab-ce:13.12.15-ce.0
437 | docker pull gitlab/gitlab-ce:14.0.11-ce.0
438 | docker pull gitlab/gitlab-ce:14.0.12-ce.0
439 | docker pull gitlab/gitlab-ce:14.1.6-ce.0
440 | docker pull gitlab/gitlab-ce:14.1.7-ce.0
441 | docker pull gitlab/gitlab-ce:14.1.8-ce.0
442 | docker pull gitlab/gitlab-ce:14.8.2-ce.0
443 | ```
444 |
445 | 我先将所有的版本下载到本地。先将 `13.9.2` 升级到 `14.0.11`,启动的时候会有提示升级需要更改配置:
446 |
447 | ```bash
448 | There was an error running gitlab-ctl reconfigure:
449 |
450 | Removed configurations found in gitlab.rb. Aborting reconfigure.
451 |
452 | * unicorn['worker_processes'] has been deprecated since 13.10 and was removed in 14.0. Starting with GitLab 14.0, Unicorn is no longer supported and users must switch to Puma, following https://docs.gitlab.com/ee/administration/operations/puma.html.
453 | * unicorn['worker_memory_limit_min'] has been deprecated since 13.10 and was removed in 14.0. Starting with GitLab 14.0, Unicorn is no longer supported and users must switch to Puma, following https://docs.gitlab.com/ee/administration/operations/puma.html.
454 | * unicorn['worker_memory_limit_max'] has been deprecated since 13.10 and was removed in 14.0. Starting with GitLab 14.0, Unicorn is no longer supported and users must switch to Puma, following https://docs.gitlab.com/ee/administration/operations/puma.html.
455 |
456 | Running handlers complete
457 |
458 | Chef Infra Client failed. 0 resources updated in 12 seconds
459 | ```
460 |
461 | 通过回滚到 `13.9.2` 更改配置重新加载配置:
462 |
463 | ```bash
464 | gitlab-ctl reconfigure
465 | ```
466 |
467 | 启动没有问题再升级到 `14.0.11`。
468 |
--------------------------------------------------------------------------------
/docs/harbor.md:
--------------------------------------------------------------------------------
1 | Harbor
2 | ===
3 |
4 | [Harbor](https://goharbor.io/) 是 `VMware` 公司开源了企业级 `Registry` 项目, 其的目标是帮助用户迅速搭建一个企业级的 `Docker registry` 服务。
5 |
6 | 由于 Harbor 是基于 Docker Registry V2 版本,所以 docker 版本必须 `>=1.10.0` [docker-compose](https://docs.docker.com/compose/install/#prerequisites) `>=1.6.0`
7 |
8 | Github: [goharbor/harbor](https://github.com/goharbor/harbor),官方[预览示例](https://demo.goharbor.io/)
9 |
10 | 对硬件需求
11 |
12 | > CPU => 最小 2CPU/4CPU(首选)
13 | > Mem => 最小 4GB/8GB(首选)
14 | > Disk => 最小 40GB/160G(首选)
15 |
16 | ## 下载安装包
17 |
18 | CentOS中通过 [docker-compose](https://docs.docker.com/compose/install/#prerequisites) 安装部署。
19 |
20 | ```bash
21 | # 下载最新版 `Docker Compose`
22 | sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
23 | # 对二进制文件应用可执行权限:
24 | sudo chmod +x /usr/local/bin/docker-compose
25 | # 测试是否安装成功
26 | docker-compose --version
27 | # docker-compose version 1.22.0, build f46880fe
28 | ```
29 |
30 | 可以从[发布页面](https://github.com/goharbor/harbor/releases)下载安装程序的二进制文件,选择在线或离线安装程序,使用tar命令解压缩包,天朝人民下面这种方式安装可能要翻墙,推荐这种方式,因为上面也不见得能下载下来。
31 |
32 | ```bash
33 | # 下载离线安装包
34 | wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0.tgz
35 | # 解压缩包
36 | tar xvf harbor-offline-installer-v1.6.0.tgz
37 | ```
38 |
39 | ## 修改配置
40 |
41 | 进去 `vim harbor/harbor.cfg` 修改文件相关配置。
42 |
43 | ```bash
44 | # hostname 设置访问地址,支持IP,域名,主机名,禁止设置127.0.0.1
45 | hostname = reg.mydomain.com
46 | # 访问协议,可设置 http,https
47 | ui_url_protocol = http
48 |
49 | # 邮件通知, 配置邮件通知。
50 | email_identity =
51 | email_server = smtp.mydomain.com
52 | email_server_port = 25
53 | email_username = sample_admin@mydomain.com
54 | email_password = abc
55 | email_from = admin
56 | email_ssl = false
57 | email_insecure = false
58 |
59 | # harbor WEB UI登陆使用的密码
60 | harbor_admin_password = Harbor12345
61 |
62 | # 认证方式,这里支持多种认证方式,默认是 db_auth ,既mysql数据库存储认证。
63 | # 这里还支持 ldap 以及 本地文件存储方式。
64 | auth_mode = db_auth
65 | # ldap 服务器访问地址。
66 | ldap_url = ldaps://ldap.mydomain.com
67 | ldap_basedn = uid=%s,ou=people,dc=mydomain,dc=com
68 |
69 | # mysql root 账户的 密码
70 | db_password = root123
71 | self_registration = on
72 | use_compressed_js = on
73 | max_job_workers = 3
74 | verify_remote_cert = on
75 | customize_crt = on
76 | ```
77 |
78 | ## 运行安装脚本
79 |
80 | 配置设置完成运行安装脚本,⚠️ 注意如果你事先部署了 nginx 需要停掉,避免端口冲突
81 |
82 | ```bash
83 | sudo ./install.sh
84 | ```
85 |
86 | 要更改 Harbour 的配置,请先停止现有的 Harbor 实例并更新 `harbour.cfg`。 然后运行 `prepare` 脚本来填充配置,最后重新创建并启动Harbor的实例:
87 |
88 | ```bash
89 | $ docker-compose down -v
90 | # 注:其实上面是停止 docker-compose.yml 中定义的所有容器
91 | $ vim harbor.cfg
92 | $ prepare
93 | $ docker-compose up -d
94 | ```
95 |
96 | 通过 http://192.168.188.222 就可以访问 Harbour 服务了
97 |
98 | ## 配置修改
99 |
100 | 因为 `harbor` 默认端口为 `80`,而大多数时候是不希望使用 `80` 端口的,修改端口方法如下
101 |
102 | ```bash
103 | # vim docker-compose.yml
104 |
105 | proxy:
106 | image: vmware/nginx-photon:v1.5.1
107 | container_name: nginx
108 | restart: always
109 | volumes:
110 | - ./common/config/nginx:/etc/nginx:z
111 | networks:
112 | - harbor
113 | ports:
114 | - 8070:80
115 | - 443:443
116 | ```
117 |
118 | 修改 `common/templates/registry/config.yml` 文件
119 |
120 | ```
121 | # vim common/templates/registry/config.yml
122 | auth:
123 | token:
124 | issuer: harbor-token-issuer
125 | realm: $public_url:8070/service/token
126 | rootcertbundle: /etc/registry/root.crt
127 | service: harbor-registry
128 | ```
129 |
130 | ## 使用 harbor
131 |
132 | ```bash
133 | # 镜像推送
134 | docker login 192.168.188.222:8070
135 | # 查看 cat ~/.docker/config.json
136 | # 镜像打包时候需要按一定规则 tag
137 | docker pull nginx
138 | docker tag nginx 192.168.188.222:8070/library/nginx:latest
139 | docker push 192.168.188.222:8070/library/nginx
140 | docker rmi -f 192.168.188.222:8070/library/nginx:latest
141 | ```
142 |
143 | 若推送镜像报以下错误:
144 |
145 | > Error response from daemon: Get https://192.168.188.222:8070/v1/users/: http: server gave HTTP response to HTTPS client
146 |
147 | 原因为,`docker` 默认使用的是 `https` 协议,而搭建的 `Harbor` 是 `http` 提供服务的,所以要配置可信任。PS:如果 `Harbor` 是 `https` 的就不会报该错误。
148 |
149 | 方法1
150 |
151 | ```bash
152 | # vim /usr/lib/systemd/system/docker.service
153 | ExecStart=/usr/bin/dockerd --insecure-registry=192.168.188.222:8070
154 | # 修改完毕后按安装步骤走一遍即可。
155 | ```
156 |
157 | 方法2
158 |
159 | ```bash
160 | # vim /etc/docker/daemon.json
161 |
162 | {
163 | "registry-mirrors": ["http://xxx.m.daocloud.io"],
164 | "insecure-registries":["192.168.100.127:8070"]
165 | }
166 | ```
167 |
168 | ```json
169 | {
170 | "insecure-registries" : [
171 | "docker.google.com"
172 | ],
173 | "debug" : true,
174 | "experimental" : true
175 | }
176 | ```
177 |
178 | 客户机docker启动时候带上 `--insecure-registry=docker.xxx.com` 强制 `docker login` 走 `http` 的 `80` 端口,就可以正常 `push` 了
179 |
--------------------------------------------------------------------------------
/docs/jenkins/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM --platform=linux/amd64 jenkins/jenkins:2.468-jdk21
2 |
3 | # 切换到 root 用户以安装 Docker CLI
4 | USER root
5 |
6 | # 安装必要的软件包
7 | RUN apt-get update && apt-get install -y \
8 | curl \
9 | gnupg2 \
10 | lsb-release \
11 | software-properties-common
12 |
13 | # 安装特定版本的 Docker CLI
14 | RUN curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz | tar xzvf - --strip-components=1 -C /usr/local/bin
15 |
16 | # 创建 docker 组并将 jenkins 用户添加到该组
17 | RUN groupadd docker && usermod -aG docker jenkins
18 |
19 | # 切换回 jenkins 用户
20 | USER jenkins
--------------------------------------------------------------------------------
/docs/jenkins/README.md:
--------------------------------------------------------------------------------
1 | Jenkins
2 | ===
3 |
4 | 本教程展示如何在 Linux(CentOS 7) 服务器上通过 Docker 部署 Jenkins,并在 Docker 容器中运行 Pipeline 脚本。这样可以方便地使用任何版本的 Node.js 或 Java 沙盒环境。
5 |
6 | ## 部署 Jenkins
7 |
8 | 由于国内服务器无法直接拉取 Docker 镜像,需要先通过本机 VPN 下载 Jenkins 和 Jenkins agent 镜像,然后上传到服务器。
9 |
10 | ```sh
11 | # 获取 Jenkins 镜像
12 | docker pull --platform linux/amd64 jenkins/jenkins:2.468-jdk21
13 | # 保存 Docker 镜像到本地文件
14 | docker save -o jenkins-2.468-jdk21.tar jenkins/jenkins:2.468-jdk21
15 | # 上传到服务器
16 | scp -P 2222 jenkins-2.468-jdk21.tar root@152.22.3.186:/home/docker-images
17 |
18 | # 获取 Jenkins agent 镜像
19 | docker pull --platform linux/amd64 jenkins/ssh-agent:jdk21
20 | docker save -o jenkins-ssh-agent-jdk21.tar jenkins/ssh-agent:jdk21
21 | scp -P 2222 jenkins-ssh-agent-jdk21.tar root@152.22.3.186:/home/docker-images
22 | ```
23 |
24 | 基于 `jenkins/jenkins:2.468-jdk21` 镜像添加 Docker 支持,创建一个新的 Jenkins 镜像。以下是 `Dockerfile` 配置内容:
25 |
26 | ```Dockerfile
27 | FROM --platform=linux/amd64 jenkins/jenkins:2.468-jdk21
28 |
29 | # 切换到 root 用户以安装 Docker CLI
30 | USER root
31 |
32 | # 安装必要的软件包
33 | RUN apt-get update && apt-get install -y \
34 | curl \
35 | gnupg2 \
36 | lsb-release \
37 | software-properties-common
38 |
39 | # 安装 Docker CLI
40 | # RUN curl -fsSL https://get.docker.com | sh
41 | # 安装特定版本的 Docker CLI
42 | RUN curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz | tar xzvf - --strip-components=1 -C /usr/local/bin
43 |
44 | # 创建 docker 组并将 jenkins 用户添加到该组
45 | RUN groupadd docker && usermod -aG docker jenkins
46 |
47 | # 切换回 jenkins 用户
48 | USER jenkins
49 | ```
50 |
51 | 构建 Jenkins 新的镜像,命名为 `my-jenkins-docker-2468-jdk21`
52 |
53 | ```sh
54 | docker build --platform=linux/amd64 -t my-jenkins-docker-2468-jdk21 .
55 | # 保存 Docker 镜像为一个 tar 文件
56 | docker save -o my-jenkins-docker-2468-jdk21.tar my-jenkins-docker-2468-jdk21
57 | # 通过 SCP 传输 tar 文件到远程服务器
58 | scp -P 2222 my-jenkins-docker-2468-jdk21.tar root@152.22.3.186:/home/docker-images
59 | ```
60 |
61 | 在服务器上添加 Docker Compose 配置 `docker-compose.yml`。以下是 `docker-compose.yml` 配置内容:
62 |
63 | ```yml
64 | # https://github.com/jenkinsci/docker/blob/master/README.md#docker-compose-with-jenkins
65 | services:
66 | jenkins:
67 | image: my-jenkins-docker-2468-jdk21 # 自定义镜像
68 | #image: jenkins/jenkins:2.468-jdk21
69 | ports:
70 | - "8086:8080"
71 | volumes:
72 | # 将命名卷 jenkins_home 挂载到容器内的 /var/jenkins_home 目录,用于持久化 Jenkins 的数据。
73 | - jenkins_home:/var/jenkins_home
74 | # 将宿主机的 Docker 挂载到容器内,以便在 Jenkins 容器内直接访问 Docker 引擎,从而支持在 Jenkins 中运行 Docker 命令。
75 | - /var/run/docker.sock:/var/run/docker.sock
76 | ssh-agent:
77 | image: jenkins/ssh-agent:jdk21
78 | volumes:
79 | jenkins_home:
80 | ```
81 |
82 | 确保与 `docker-compose.yml` 在同一个目录中。并启动 `Jenkins`:
83 |
84 | ```sh
85 | docker compose up -d # 启动 Jenkins
86 | docker compose down # 停止并删除与 Docker Compose 配置文件相关的所有容器、网络、卷和镜像
87 | ```
88 |
89 | 访问 jenkins: http://152.22.3.186:8086/
90 |
91 | ## 1. 安装插件
92 |
93 | [Git Parameter Plug-In](https://plugins.jenkins.io/git-parameter) 支持在 CI 上自动加载仓库分支
94 |
95 |
96 |
97 |
98 |
99 | 在 `Manage Jenkins` -> `System` 中设置 `Git Parameter`
100 |
101 |
102 |
103 | ## 2. 添加凭据
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 | 添加 `SSH` 和 `SCP` 需要的凭据
114 |
115 |
116 |
117 | `ssh-keygen -t rsa` 生成 `id_rsa` 和 `id_rsa.pub` 文件,将 `id_rsa` 私钥文本复制到 `jenkins` 中
118 |
119 |
120 |
121 | ## 3. 新建工作流
122 |
123 |
124 |
125 | 修改配置
126 |
127 |
128 |
129 |
130 | 设置 [`Git Parameter`](https://plugins.jenkins.io/git-parameter) 可以在构建的时候读取分支,选择分支
131 |
132 |
133 |
134 |
135 |
136 | ## 3. 添加构建选项
137 |
138 | 可以在构建前选择 `生产` 还是 `开发` 模式,在脚本中判断
139 |
140 |
141 |
142 | ## 4. 选择 `Pipeline script from SCM` 指定脚本位置
143 |
144 |
145 |
146 | 这方法是将 仓库 `config` 分支添加一个 `Jenkinsfile` 配置
147 |
148 | ## Nodejs
149 |
150 | 安装 [Docker Pipeline](https://plugins.jenkins.io/git-parameter) 插件,支持从管道中构建和使用 `Docker` 容器。
151 |
152 | ```sh
153 | docker pull --platform linux/amd64 node:14.16.0
154 | docker pull --platform linux/amd64 node:18
155 | docker pull --platform linux/amd64 node:20
156 | docker pull --platform linux/amd64 node:22
157 |
158 | # 保存 Docker 镜像到本地文件
159 | docker save -o node14.16.tar node:14.16.0
160 | # 上传到服务器
161 | scp -P 2222 node14.16.tar root@152.22.3.186:/home/docker-images
162 |
163 | docker save -o node18.tar node:18
164 | scp -P 2222 node18.tar root@152.22.3.186:/home/docker-images
165 |
166 | docker save -o node20.tar node:20
167 | scp -P 2222 node20.tar root@152.22.3.186:/home/docker-images
168 |
169 | docker save -o node22.tar node:22
170 | scp -P 2222 node22.tar root@152.22.3.186:/home/docker-images
171 | ```
172 |
173 | Pipeline 脚本中使用 Docker `nodejs 20` 运行示例
174 |
175 | ```groovy
176 | pipeline {
177 | //agent any
178 | // pipeline 放到 docker 中执行
179 | agent {
180 | docker {
181 | // 使用 Node.js 18 的 Docker 镜像
182 | image 'node:20'
183 | // 可选:挂载 NPM 缓存目录,加速构建
184 | // 使用 Jenkins 工作空间中的 .npm 目录作为缓存目录,不会有权限写入问题
185 | args '-v ${JENKINS_HOME}/.npm:/home/node/.npm'
186 | }
187 | }
188 | environment {
189 | def git_url="http://152.22.3.186:8081/mall/h5.git"
190 | def git_auth = "12312312-f199-4b15-b087-123123"
191 | def git_branch = "${branch}"
192 | def project_env = "${project_env}"
193 | def data_dir = "/mnt/mall/h5/h5_vip"
194 |
195 | // 本地需要上传的目录 以及远程服务器的目录
196 | def localDir = "${WORKSPACE}/h5_vip/test_dir/"
197 | def vip_host = '152.22.3.186'
198 | def vip_remote_dir = "/mnt/mall/h5"
199 | }
200 | stages {
201 | stage('Git Checkout') {
202 | steps {
203 | echo "🏆 WORKSPACE: 【${WORKSPACE}】"
204 | echo "🎯 branch: 【${git_branch}】"
205 | echo "🏅 project_env: 【${project_env}】"
206 | echo 'check git'
207 | checkout([
208 | $class: 'GitSCM',
209 | branches: [[name: "${git_branch}" ]],
210 | doGenerateSubmoduleConfigurations: false,
211 | extensions: [],
212 | submoduleCfg: [],
213 | userRemoteConfigs: [[
214 | credentialsId: "${git_auth}",
215 | url: "${git_url}"
216 | ]]
217 | ])
218 | sh 'pwd'
219 | sh 'ls -la'
220 | }
221 | }
222 | stage('Send Files') {
223 | when {
224 | expression {
225 | currentBuild.result == null || currentBuild.result == 'SUCCESS'
226 | }
227 | }
228 | steps {
229 | sh 'pwd'
230 | script {
231 | switch (project_env) {
232 | case "vip":
233 | sh '''
234 | ls -la
235 | cd h5_vip
236 | npm install --cache /home/node/.npm --registry=https://registry.npmmirror.com/
237 | ls -la
238 | npm run build
239 | ls -la
240 | rm -rf test_dir
241 | mv dist test_dir
242 | '''
243 | withCredentials([sshUserPrivateKey(credentialsId: '9dfd-4fd5-b94b-7559ca212e9a', keyFileVariable: 'SSH_KEY')]) {
244 | // 连接到远程服务器并删除 test_dir 目录 重新上传
245 | sh '''
246 | ssh -i ${SSH_KEY} -o StrictHostKeyChecking=no root@152.22.3.186 "rm -rf /mnt/mall/h5/test_dir"
247 | scp -i ${SSH_KEY} -o StrictHostKeyChecking=no -P 22 -r "${localDir}" root@152.22.3.186:${vip_remote_dir}
248 | '''
249 | }
250 | break
251 | case "dev":
252 | // for (i in ['152.22.3.186']) {
253 | // data_dir = "/mnt/mall/h5/"
254 | // //sh "ssh $i 'cp -rf ${data_dir}/* ${data_dir}/h5_vip_{uuid_no}'"
255 | // sh "scp -r -o StrictHostKeyChecking=no -i /var/lib/jenkins/.ssh/id_rsa -P 22 '${WORKSPACE}/h5_vip/' '$i:${data_dir}'"
256 | // }
257 | break
258 | }
259 | }
260 | }
261 | }
262 | }
263 | post {
264 | success {
265 | sh "echo 'Success success'"
266 | }
267 |
268 | failure {
269 | sh "echo 'Faild faild'"
270 | }
271 | }
272 | }
273 | ```
274 |
275 | ## Java 环境
276 |
277 | 基于 `openjdk:11` 创建一个包含 `Maven` 的自定义 Docker 镜像
278 |
279 | ```dockerfile
280 | FROM --platform=linux/amd64 openjdk:11
281 |
282 | # 安装 Maven 3.8.7
283 | ENV MAVEN_VERSION=3.8.7
284 | RUN apt-get update && apt-get install -y wget tar \
285 | && wget https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
286 | && tar xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /opt \
287 | && ln -s /opt/apache-maven-${MAVEN_VERSION} /opt/maven \
288 | && rm apache-maven-${MAVEN_VERSION}-bin.tar.gz
289 |
290 | # 设置 Maven 环境变量
291 | ENV MAVEN_HOME=/opt/maven
292 | ENV PATH="${MAVEN_HOME}/bin:${PATH}"
293 |
294 | # 创建非 root 用户并设置权限
295 | RUN useradd -u 1000 -ms /bin/bash jenkins \
296 | && mkdir -p /home/jenkins/.m2/repository \
297 | && chown -R jenkins:jenkins /home/jenkins/.m2
298 |
299 | # 切换到非 root 用户
300 | USER jenkins
301 |
302 | # 验证 Maven 版本
303 | RUN mvn -version
304 | ```
305 |
306 | 构建 `openjdk` 新的镜像,命名为 `my-openjdk-maven`
307 |
308 | ```sh
309 | docker build -t my-openjdk-maven:3.8.7 .
310 | # 保存 Docker 镜像到本地文件
311 | docker save -o my-openjdk-maven.3.8.7.tar my-openjdk-maven:3.8.7
312 | docker save -o my-openjdk-maven.3.8.8.tar my-openjdk-maven:3.8.8
313 | # 上传到服务器
314 | scp -P 2222 my-openjdk-maven.3.8.7.tar root@106.55.8.163:/home/docker-images
315 | ```
316 |
317 | 加载 docker 自定义镜像
318 |
319 | ```sh
320 | docker load -i ./my-openjdk-maven.3.8.7.tar
321 | ```
322 |
323 | 缓存下载的 `maven` 的包
324 |
325 | ```sh
326 | docker run -it --rm my-openjdk-maven:3.8.7 /bin/bash
327 | # 在【容器】内运行
328 | id jenkins
329 | # uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
330 | # 在【宿主机】上使用这些 ID 来更改目录的拥有者
331 | sudo chown -R 1000:1000 /root/.m2/
332 | # 将目录权限设置为可读写
333 | sudo chmod -R 777 /root/.m2/
334 | ```
335 |
336 | Pipeline 脚本中使用 Docker java `openjdk:11` & `maven.3.8.7` 运行示例
337 |
338 | ```groovy
339 | pipeline {
340 | agent {
341 | docker {
342 | image 'my-openjdk-maven:3.8.7'
343 | // 将 Maven 的本地仓库挂载到容器的 /root/.m2 路径,
344 | // 确保你每次构建时都能重用之前下载的依赖
345 | args '-v /root/.m2:/home/jenkins/.m2:rw'
346 | }
347 | }
348 | environment {
349 | def git_url="http://106.55.8.163:8081/mall/springboot-mall.git"
350 | def git_auth = "211ca2-55c4f199-4b15-b087-238db80b102d"
351 | def git_branch = "${branch}"
352 | def project_env = "${project_env}"
353 | def vip_host = '152.22.3.186'
354 | def vip_remote_dir = "/mnt/mall/admin"
355 | }
356 | stages {
357 | stage('Git Checkout') {
358 | steps {
359 | echo 'check git'
360 | checkout([
361 | $class: 'GitSCM',
362 | branches: [[name: "${git_branch}" ]],
363 | doGenerateSubmoduleConfigurations: false,
364 | extensions: [
365 | // 只拉取最新的提交
366 | [$class: 'CloneOption', depth: 1, shallow: true, noTags: true]
367 | ],
368 | submoduleCfg: [],
369 | userRemoteConfigs: [[
370 | credentialsId: "${git_auth}",
371 | url: "${git_url}"
372 | ]]
373 | ])
374 | }
375 | }
376 | stage('Manven Build') {
377 | steps {
378 | /**
379 | * 执行maven打包
380 | * -B --batch-mode 在非交互(批处理)模式下运行(该模式下,当Mven需要输入时,它不会停下来接受用户的输入,而是使用合理的默认值)
381 | * 打包时跳过JUnit测试用例
382 | * -DskipTests 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
383 | * -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类
384 | **/
385 | sh "cd ${WORKSPACE} ; mvn clean package -Dmaven.test.skip=true -Dmaven.repo.local=/home/jenkins/.m2/repository -U"
386 | }
387 | }
388 | stage('Send Files') {
389 | when {
390 | expression {
391 | currentBuild.result == null || currentBuild.result == 'SUCCESS'
392 | }
393 | }
394 | steps {
395 | script {
396 | switch (project_env) {
397 | case "pro":
398 | // 部署服务器 SSH 凭据,验证登录用,才可以 ssh 和 scp 上传等功能
399 | withCredentials([sshUserPrivateKey(credentialsId: 'bd6f00e69dfd-4fd5-b94b-7559ca212e9a', keyFileVariable: 'SSH_KEY')]) {
400 | // 连接到远程服务器并删除 admin 目录 重新上传
401 | sh '''
402 | scp -i ${SSH_KEY} -o StrictHostKeyChecking=no -r -P 22 '${WORKSPACE}/admin/target/lib' 'root@${vip_host}:${vip_remote_dir}'
403 | scp -i ${SSH_KEY} -o StrictHostKeyChecking=no -r -P 22 '${WORKSPACE}/admin/target/admin-2.3.jar' 'root@${vip_host}:${vip_remote_dir}'
404 | ssh -i ${SSH_KEY} -o StrictHostKeyChecking=no root@${vip_host} '/mnt/sh/admin-8000.sh restart;'
405 | '''
406 | }
407 | break
408 | case "dev":
409 |
410 | break
411 | }
412 | }
413 | }
414 | }
415 | }
416 | post {
417 | success {
418 | sh "echo 'Success success'"
419 | }
420 | failure {
421 | sh "echo 'Faild faild'"
422 | }
423 | }
424 | }
425 | ```
--------------------------------------------------------------------------------
/docs/jenkins/imgs/0-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/0-1.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/0-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/0-2.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/0-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/0-3.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/1.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/10.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/2.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/3.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/4-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/4-1.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/4-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/4-2.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/4.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/5.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/6.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/7.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/8.png
--------------------------------------------------------------------------------
/docs/jenkins/imgs/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/jenkins/imgs/9.png
--------------------------------------------------------------------------------
/docs/jenkins/openjdk/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM --platform=linux/amd64 openjdk:11
2 |
3 | # 安装 Maven 3.8.7
4 | ENV MAVEN_VERSION=3.8.7
5 | RUN apt-get update && apt-get install -y wget tar \
6 | && wget https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
7 | && tar xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /opt \
8 | && ln -s /opt/apache-maven-${MAVEN_VERSION} /opt/maven \
9 | && rm apache-maven-${MAVEN_VERSION}-bin.tar.gz
10 |
11 | # 设置 Maven 环境变量
12 | ENV MAVEN_HOME=/opt/maven
13 | ENV PATH="${MAVEN_HOME}/bin:${PATH}"
14 |
15 | # 创建非 root 用户并设置权限
16 | RUN useradd -u 1000 -ms /bin/bash jenkins \
17 | && mkdir -p /home/jenkins/.m2/repository \
18 | && chown -R jenkins:jenkins /home/jenkins/.m2
19 |
20 | # 切换到非 root 用户
21 | USER jenkins
22 |
23 | # 验证 Maven 版本
24 | RUN mvn -version
--------------------------------------------------------------------------------
/docs/jenkins/openjdk/README.md:
--------------------------------------------------------------------------------
1 |
2 | [Java 环境镜像](../README.md#java-环境)
--------------------------------------------------------------------------------
/docs/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/logo.png
--------------------------------------------------------------------------------
/docs/mattermost.md:
--------------------------------------------------------------------------------
1 | Mattermost
2 | ===
3 |
4 | `Slack` 的开源替代品 [`Mattermost`](https://github.com/mattermost),使用下面命令即可启动 `Mattermost`,并且可以直接使用。
5 |
6 | ## 运行容器
7 |
8 | ```bash
9 | docker run --name mattermost-preview \
10 | --publish 8065:8065 \
11 | --add-host dockerhost:127.0.0.1 \
12 | --rm \
13 | -d mattermost/mattermost-preview:5.4.0
14 | ```
15 |
16 | 上面命令直接在命令行运行,就可以使用,通常情况我们想映射配置和存储,以便删除容器数据还存在,避免数据丢失。首先我们需要通过上面运行好的容器,将里面的配置拷贝出来。
17 |
18 | ```bash
19 | docker container cp mattermost-preview:/mm/mattermost/config $HOME/_docker/mattermost/
20 | ```
21 |
22 | 挂载配置目录数据库目录运行
23 |
24 | ```bash
25 | docker run --name mattermost-preview \
26 | --publish 8065:8065 \
27 | --add-host dockerhost:127.0.0.1 \
28 | -v $HOME/_docker/mattermost/config:/mm/mattermost/config \
29 | -v $HOME/_docker/mattermost/mysql:/var/lib/mysql \
30 | -v $HOME/_docker/mattermost/data:/mm/mattermost-data \
31 | -d mattermost/mattermost-preview:5.4.0
32 | ```
33 |
34 | ## 设置 Gitlab 单点登陆
35 |
36 | 这个功能官方说需要购买 [Mattermost Enterprise Edition](https://about.mattermost.com/pricing/) 版本,文档这里: [GitLab Single Sign-On](https://docs.mattermost.com/deployment/sso-gitlab.html)。
37 |
38 | 修改 mattermost 配置 `vim $HOME/_docker/mattermost/config/config.json`。
39 |
40 | ```json
41 | "GitLabSettings": {
42 | "Enable": true,
43 | "Secret": "{mattermost-app-secret-from-gitlab}",
44 | "Id": "{mattermost-app-application-id-from-gitlab}",
45 | "Scope": "",
46 | "AuthEndpoint": "https://{gitlab-site-name}/oauth/authorize",
47 | "TokenEndpoint": "https://{gitlab-site-name}/oauth/token",
48 | "UserApiEndpoint": "https://{gitlab-site-name}/api/v4/user"
49 | }
50 | ```
51 |
52 | [您可以在GitLab服务器上运行GitLab Mattermost服务。](https://docs.gitlab.com/omnibus/gitlab-mattermost/),这篇文档介绍了修改 gitlab 配置。
53 |
54 | ```bash
55 | vim /etc/gitlab/gitlab.rb
56 |
57 | mattermost_external_url 'http://mattermost.example.com'
58 |
59 | gitlab_rails['mattermost_host'] = "https://mattermost.example.com"
60 | ```
61 |
62 | 下面这部分配置在 `gitlab.rb` 中设置,之后**还需要**在 `mattermost` 系统中设置 [http://mattermost.example.com/admin_console/authentication/gitlab](http://mattermost.example.com/admin_console/authentication/gitlab)
63 |
64 | ```bash
65 | mattermost['gitlab_enable'] = true
66 | mattermost['gitlab_id'] = "12345656"
67 | mattermost['gitlab_secret'] = "123456789"
68 | mattermost['gitlab_scope'] = ""
69 | mattermost['gitlab_auth_endpoint'] = "http://gitlab.example.com/oauth/authorize"
70 | mattermost['gitlab_token_endpoint'] = "http://gitlab.example.com/oauth/token"
71 | mattermost['gitlab_user_api_endpoint'] = "http://gitlab.example.com/api/v4/user"
72 | ```
73 |
74 | 如果您使用的是 `GitLab Mattermost`,请在系统控制台或 `gitlab.rb` 中[配置您的站点URL](https://docs.mattermost.com/administration/config-settings.html?highlight=add%20members%20team#site-url)。
75 |
76 | 在配置 `vim $HOME/_docker/mattermost/config/config.json`,这个目录是你挂载出来的配置目录文件,容器中实际目录 `/mm/mattermost/config`,修改下面内容。
77 |
78 | ```json
79 | "ServiceSettings": {
80 | "SiteURL": "http://mattermost.example.com",
81 | }
82 | ```
83 |
--------------------------------------------------------------------------------
/docs/mysql.md:
--------------------------------------------------------------------------------
1 | MySQL
2 | ===
3 |
4 | [MySQL](https://www.mysql.com/) 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一,属于 Oracle 旗下产品。
5 |
6 | ## 下载镜像
7 |
8 | 拉取官方的镜像,标签为`5.7`,[Docker官方资料](https://docs.docker.com/samples/library/mysql/#-via-docker-stack-deploy-or-docker-compose)、[MySQL 官方资料](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html),[MySQL镜像](https://hub.docker.com/_/mysql/)
9 |
10 | ```bash
11 | docker pull mysql:5.7.23
12 | # Trying to pull repository docker.io/library/mysql ...
13 | # 5.7: Pulling from docker.io/library/mysql
14 | # 85b1f47fba49: Already exists
15 | # f34057997f40: Pull complete
16 | # ....
17 | # Digest: sha256:bfb22e93ee87c6aab6c1c9a4e70f28fa289f9ffae9fe8e173
18 | ```
19 |
20 | ## 运行容器示
21 |
22 | ```bash
23 | docker run --name mysql \
24 | -p 3306:3306 \
25 | -v $HOME/_docker/mysql/conf.d:/etc/mysql/conf.d \
26 | -v $HOME/_docker/mysql/data:/var/lib/mysql \
27 | -v /etc/localtime:/etc/localtime:ro \
28 | -e MYSQL_ROOT_PASSWORD=123456 \
29 | -d mysql:5.7.23
30 | ```
31 |
32 | - `--name mysql`:容器名字为 `mysql`
33 | - `-p 3306:3306`:将容器的 3306 端口映射到主机的 3306 端口
34 | - `-v $HOME/_docker/mysql/conf.d`:将主机当前目录下的 `~/_docker/mysql/conf.d` 挂载到容器的 `/etc/mysql/conf.d`,这个是挂载配置目录
35 | - `-v $HOME/_docker/mysql/data`:将主机当前目录下的 data 目录挂载到容器的 `/var/lib/mysqs`,为数据文件存放路径
36 | - `-e MYSQL_ROOT_PASSWORD=123456`:初始化root用户的密码
37 |
38 | ## 查看日志
39 |
40 | docker exec 命令允许您在 Docker 容器内运行命令。 以下命令行将在 mysql 容器中为您提供一个 bash shell:
41 |
42 | ```bash
43 | $ docker exec -it mysql bash
44 | ```
45 |
46 | MySQL Server日志可通过 Docker 的容器日志获得:
47 |
48 | ```bash
49 | $ docker logs mysql
50 | ```
51 |
52 | ## 修改配置
53 |
54 | ```ini
55 | # For advice on how to change settings please see
56 | # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
57 | [client]
58 | default-character-set = utf8mb4
59 |
60 | [mysql]
61 | default-character-set = utf8mb4
62 |
63 | [mysqld]
64 | character-set-client-handshake = FALSE
65 | character-set-server = utf8mb4
66 | collation-server = utf8mb4_unicode_ci
67 | # 忽略数据库表名的大小写区分
68 | lower_case_table_names = 1
69 | # 解决时区与中国时区不至问题
70 | default-time_zone=+8:00
71 | # 设置服务ID
72 | server-id=1
73 | #
74 | # Remove leading # and set to the amount of RAM for the most important data
75 | # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
76 | # innodb_buffer_pool_size = 128M
77 | #
78 | # Remove leading # to turn on a very important data integrity option: logging
79 | # changes to the binary log between backups.
80 | # log_bin
81 | # 开启 binlog,log_bin 等于 server-id
82 | log_bin=1
83 | #
84 | # Remove leading # to set options mainly useful for reporting servers.
85 | # The server defaults are faster for transactions and fast SELECTs.
86 | # Adjust sizes as needed, experiment to find the optimal values.
87 | # join_buffer_size = 128M
88 | # sort_buffer_size = 2M
89 | # read_rnd_buffer_size = 2M
90 | datadir=/var/lib/mysql
91 | socket=/var/lib/mysql/mysql.sock
92 |
93 | # Disabling symbolic-links is recommended to prevent assorted security risks
94 | symbolic-links=0
95 |
96 | #log-error=/var/log/mysqld.log
97 | pid-file=/var/run/mysqld/mysqld.pid
98 | ```
99 |
100 | 通过[容器名字]或者[容器 ID]来重启 MySQL,让配置生效。
101 |
102 | ```bash
103 | docker restart mysql
104 | ```
105 |
106 | ## 进入数据库
107 |
108 | ```bash
109 | # 进入 mysql 容器
110 | docker exec -it mysql /bin/bash
111 | # 通过 mysql 命令登陆
112 | mysql -uroot -p
113 |
114 | # 查看是否开启了binlog
115 | show binary logs;
116 | show variables like '%server_id%';
117 | ```
--------------------------------------------------------------------------------
/docs/navidrome.md:
--------------------------------------------------------------------------------
1 | Navidrome
2 | ===
3 |
4 | 现代音乐服务器和流媒体兼容 Subsonic/Airsonic
5 |
6 | ## 使用 `docker-compose`
7 |
8 | 创建包含以下内容的 `docker-compose.yml` 文件(或将下面的 navidrome 服务添加到现有文件中):
9 |
10 | ```yml
11 | version: "3"
12 | services:
13 | navidrome:
14 | image: deluan/navidrome:latest
15 | user: 1000:1000 # should be owner of volumes
16 | ports:
17 | - "4533:4533"
18 | restart: unless-stopped
19 | environment:
20 | # Optional: put your config options customization here. Examples:
21 | ND_SCANSCHEDULE: 1h
22 | ND_LOGLEVEL: info
23 | ND_SESSIONTIMEOUT: 24h
24 | ND_BASEURL: ""
25 | volumes:
26 | - "/path/to/data:/data"
27 | - "/path/to/your/music/folder:/music:ro"
28 | ```
29 |
30 | 使用 `docker-compose up -d` 启动它。 请注意,上面的环境变量只是一个示例,不是必需的。 示例中的值已经是默认值
31 |
32 | ## 使用docker命令行工具
33 |
34 | ```bash
35 | $ docker run -d \
36 | --name navidrome \
37 | --restart=unless-stopped \
38 | --user $(id -u):$(id -g) \
39 | -v /path/to/music:/music \
40 | -v /path/to/data:/data \
41 | -p 4533:4533 \
42 | -e ND_LOGLEVEL=info \
43 | deluan/navidrome:latest
44 | ```
--------------------------------------------------------------------------------
/docs/nginx.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP)的协议链接。并且提供了负载均衡以及 HTTP 缓存。它的设计充分使用异步事件模型,削减上下文调度的开销,提高服务器并发能力。采用了模块化设计,提供了丰富模块的第三方模块。
8 |
9 | 所以关于 Nginx,有这些标签:「异步」「事件」「模块化」「高性能」「高并发」「反向代理」「负载均衡」
10 |
11 | 下面是 nginx 在 Docker 中的应用,这里还有 [nginx入门教程](https://github.com/jaywcjlove/nginx-tutorial) 供你参考
12 |
13 | ## 查找镜像
14 |
15 | 在 docker hub 中查找 nginx 相关镜像。
16 |
17 | ```bash
18 | $ docker search nginx
19 |
20 | # INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
21 | # docker.io docker.io/nginx Official build of Nginx. 7006 [OK]
22 | # docker.io docker.io/jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1137 [OK]
23 | ```
24 |
25 | ## 下载镜像
26 |
27 | 拉取官方镜像,其中上面的非官方镜像是用户们根据自己的需要制作的镜像,方便大家的使用。
28 |
29 | ```bash
30 | $ docker pull nginx
31 | # Using default tag: latest
32 | # Trying to pull repository docker.io/library/nginx ...
33 | # latest: Pulling from docker.io/library/nginx
34 | # bc95e04b23c0: Pull complete
35 | # ...
36 | # Digest: sha256:004ac1d5e791e705f12a1
37 | ```
38 |
39 | ## 启动容器
40 |
41 | 利用这个镜像启动一个新的容器
42 |
43 | ```bash
44 | docker run --name my-nginx -d -p 8080:80 nginx /bin/bash
45 | # faaed6a2d63af248961aab59713e515c76aea447
46 | ```
47 |
48 | ## 查看日志
49 |
50 | 查看容器运行日志
51 |
52 | ```
53 | docker logs my-nginx
54 | ```
55 |
56 | ## 运行容器示例一
57 |
58 | 启动一个更复杂Nginx的例子:
59 |
60 | ```bash
61 | # 上面的命令将本地文件中的 nginx.conf 配置文件挂载到容器,并且将要展示的静态页面也挂载到容器。
62 | docker run --name my-nginx \
63 | -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro \
64 | -v /some/html:/usr/share/nginx/html:ro \
65 | -p 8080:80 \
66 | -d nginx
67 | ```
68 |
69 | `-v` 参数语法为 `-v host dir:container dir[:ro|rw]`
70 |
71 | - --name 为容器取一个名字
72 | - -p 参数语法为 `-p host port:container port`; -p 8080:80 将主机上的8080端口绑定到容器上的80端口,因此在主机中访问8080端口时其实就是访问 nginx 容器的80端口
73 | - -d 后台运行容器
74 |
75 | ## 运行容器示例二
76 |
77 | 新需求,nginx 容器需要加载 [Let's Encrypt](https://www.sslforfree.com/) 提供的免费 SSL 证书,需要挂载证书目录,需要挂载一个静态资源目录。
78 |
79 | ```bash
80 | # 创建目录 nginx, 用于存放 nginx 的相关东西
81 | mkdir -p ~/_docker/nginx
82 | # 拉取官方的镜像
83 | docker pull nginx
84 | ```
85 |
86 | 运行容器,记住先将目录中的 `/etc/nginx/conf.d/defautl.conf` 文件复制出来,不然会报错。
87 |
88 | ```bash
89 | # 拷贝容器中的内容
90 | docker container cp webserver:/etc/nginx/conf.d $HOME/docker/nginx
91 | docker container cp webserver:/usr/share/nginx/html $HOME/docker/nginx
92 |
93 | # 运行容器并挂载目录
94 | docker run -d --name webserver \
95 | --restart always \
96 | -p 443:443 -p 80:80 \
97 | -v $HOME/docker/nginx/html:/usr/share/nginx/html \
98 | -v $HOME/docker/nginx/conf.d:/etc/nginx/conf.d \
99 | -v /etc/letsencrypt:/etc/letsencrypt:rw \
100 | -v /etc/localtime:/etc/localtime:ro \
101 | -v /home/www/:/home/www:rw \
102 | -d \
103 | nginx
104 |
105 | # 命令行进入容器
106 | docker exec -it webserver /bin/bash
107 | ```
108 |
109 | - **--rm**:容器停止运行后,自动删除容器文件
110 | - **-d**:在后台运行
111 | - **-p 802:80**:将容器的 `80` 端口映射到主机的 `802` 端口
112 | - **--name webserver**:将容器命名为 `webserver`
113 | - **-v $HOME/docker/nginx/html:/usr/share/nginx/html**:将主机中当前目录下的 `html` 挂载到容器的 `/html`
114 | - **-v $HOME/docker/nginx/conf.d:/etc/nginx/conf.d**:将主机中当前目录下的 `nginx` 配置,挂载到容器的 `/etc/nginx/conf.d`
115 | - **-v $HOME/docker/nginx/logs:/wwwlogs**:将主机中当前目录下的logs挂载到容器的/wwwlogs
116 |
117 | 默认挂载的路径权限为读写。如果指定为只读可以用:ro
118 | 重载 nginx 配置
119 |
120 | ```bash
121 | # 测试配置是否正确
122 | docker exec -it webserver nginx -t
123 | # 重新加载配置
124 | docker exec -it webserver nginx -s reload
125 | ```
126 | 注意:⚠️ webserver 可以是 `容器名称` 或者 `容器ID`
127 |
128 | ## 启用 Gitlab Registry 功能
129 |
130 | 修改配置 `/etc/gitlab/gitlab.rb` 文件,将 `registry_external_url` 的值修改为 http://192.168.188.211:5008
131 |
132 | ```ruby
133 | registry_external_url 'http://192.168.188.211:5008'
134 | ```
135 |
136 | `registry_external_url` 这个地址是我们使用 `docker` 命令进行 `pull` 或者 `push` 镜像的仓库地址。
137 |
138 | 重启 `Gitlab` 后,可以在 `Gitlab` 左侧面板看到 `Container Registry` 的菜单。
139 |
140 | 修改 `vim ~/.docker/daemon.json` 添加 `"192.168.188.211:5008"`
141 |
142 | ```js
143 | {
144 | "insecure-registries":[
145 | "192.168.188.211:5008"
146 | ]
147 | }
148 | ```
149 |
150 | 按照 gitlab 给出的提示,我们先登录上 gitlab 的 registry:
151 |
152 | ```bash
153 | docker login 192.168.188.211:5008
154 | Username: ****
155 | Password: **
156 | ```
157 |
158 | 注意:⚠️ 密码是需要通过 [Gitlab > User Settings > Access Tokens > Add a personal access token](http://gitlab.com/-/profile/personal_access_tokens) 生成一个 `personal_access_tokens` 而不是真正的密码
159 |
160 |
161 | ```
162 | docker build -t 192.168.188.211:5008/docker/docker-static-service-template .
163 | # 提交镜像
164 | docker push 192.168.188.211:5008/docker/docker-static-service-template
165 | ```
--------------------------------------------------------------------------------
/docs/nps/001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/001.png
--------------------------------------------------------------------------------
/docs/nps/002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/002.png
--------------------------------------------------------------------------------
/docs/nps/003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/003.png
--------------------------------------------------------------------------------
/docs/nps/004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/004.png
--------------------------------------------------------------------------------
/docs/nps/005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/005.png
--------------------------------------------------------------------------------
/docs/nps/006.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/006.png
--------------------------------------------------------------------------------
/docs/nps/007.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/007.png
--------------------------------------------------------------------------------
/docs/nps/008.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/008.png
--------------------------------------------------------------------------------
/docs/nps/009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/009.png
--------------------------------------------------------------------------------
/docs/nps/010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/010.png
--------------------------------------------------------------------------------
/docs/nps/011.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/011.png
--------------------------------------------------------------------------------
/docs/nps/012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/nps/012.png
--------------------------------------------------------------------------------
/docs/nps/README.md:
--------------------------------------------------------------------------------
1 | NPS
2 | ===
3 |
4 | [nps](https://github.com/ehang-io/nps) 一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等
5 |
6 | ### ① 搭建NPS服务端
7 |
8 | 服务器搭建在拥有公网 `ip=150.106.195.110` 的服务器上。下载配置 [nps/conf](https://github.com/ehang-io/nps/tree/master/conf),将配置放在 `/opt/nps/conf` 目录下,下面我们使用 docker 部署 NPS 服务端:
9 |
10 | ```bash
11 | # 创建 /opt/nps 目录存放配置文件
12 | mkdir /opt/nps
13 | # 拉取 ffdfgdfg/nps 镜像
14 | docker pull ffdfgdfg/nps
15 | # 运行 nps 容器,配置文件夹 conf 在 /opt/nps/conf 目录下
16 | docker run -d --name=nps --restart=always --net=host -v /opt/nps/conf:/conf ffdfgdfg/nps
17 | # 查看日志
18 | docker logs nps
19 | ```
20 |
21 | 启动之后默认端口 `8080`,通过使用 `http://<你服务器IP>:8080` 访问管理界面。
22 |
23 | 
24 |
25 | 使用用户名和密码登陆(默认`admin/123`,正式使用一定要更改,修改 `/opt/nps/conf/nps.conf` 配置文件中的 `web_password`),也可以在这里配置更改默认控制台管理平台端口(`web_port` = `8666`),通道端口更改 `bridge_port=8024`
26 |
27 | 记得在控制台开放端口,面板**默认端口**是 `8080`,与客户端**通信端口**是 `8024`。
28 |
29 | ### ② 添加客户端
30 |
31 | 
32 |
33 | 
34 |
35 | 
36 |
37 | 注意:客户端命令 `./npc -server=150.106.195.110:8024 -vkey=<唯一验证密钥> -type=tcp` 中的 `唯一验证密钥` 用于客户端安装需要使用
38 |
39 | ### ③ 客户端安装使用
40 |
41 | 客户端安装在你需要穿透的内网服务器(电脑)上。
42 |
43 | ```bash
44 | # 创建 /opt/nps 目录存放配置文件
45 | mkdir /opt/npc
46 | # 拉取 ffdfgdfg/nps 镜像
47 | docker pull ffdfgdfg/npc
48 | # 运行 npc 容器,按提示改好命令,如下图所示
49 | # 唯一验证密钥在管理界面中获取
50 | docker run -d --name=npc --restart=always --net=host ffdfgdfg/npc -server= -vkey= <以及一些其他参数>
51 | # 示例
52 | docker run -d --name=npc --restart=always --net=host ffdfgdfg/npc -server=150.106.195.110:8024 -vkey=<唯一验证密钥>
53 | # 查看日志
54 | docker logs npc
55 | ```
56 |
57 | 服务运行起来,这样客户端就连接到了 NPS 的服务端了
58 |
59 | 
60 |
61 | ### ④ 建立内网穿透隧道
62 |
63 | 
64 |
65 | 
66 |
67 | 假设我们要穿透局域网 MySQL 数据库,在 `目标 (IP:端口)` 配置内网 MySQL IP:端口 `192.168.188.222:3306`,在外网访问的端口 `服务端端口` 配置 `33066`
68 |
69 | 
70 |
71 | 配置完成之后你可以使用公网 `ip=150.106.195.110` IP 地址 和端口 `33066` 连接到你内网的机器中的数据库。
72 |
73 | 到这里就完成了,你可以自己继续研究一下更多的功能,也可以看看官方的[说明文档](https://ehang-io.github.io/nps/#/)。
74 |
75 | ### ⑤ 新建 Socks5 代理
76 |
77 | 通过 Socks5 代理可以访问内网任意服务,不必建立一个个的内网穿透隧道。在设置代理之前确保 `客户端` 建立好,并且 `链接` 状态为 `在线`。
78 |
79 | 
80 |
81 | 
82 |
83 | 
84 |
85 | 在建立好 Socks5 代理之后,需要使用 [`proxifier`](https://www.proxifier.com/) 配置代理访问公司内网
86 |
87 | 
88 |
89 | ### 相关链接
90 |
91 | - 官网文档:https://ehang-io.github.io/nps/
92 | - GitHub:https://github.com/ehang-io/nps
93 |
--------------------------------------------------------------------------------
/docs/penpot.md:
--------------------------------------------------------------------------------
1 | Penpot
2 | ===
3 |
4 | 开源设计和原型平台
5 |
6 | ## 启动 `Penpot`
7 |
8 | 第一步,您需要获取 `docker-compose.yaml` 文件。 您可以从 [`Penpot`](https://raw.githubusercontent.com/penpot/penpot/main/docker/images/docker-compose.yaml) 存储库下载它。
9 |
10 | ```bash
11 | wget https://raw.githubusercontent.com/penpot/penpot/main/docker/images/docker-compose.yaml
12 | ```
13 |
14 | or
15 |
16 | ```bash
17 | curl -o docker-compose.yaml https://raw.githubusercontent.com/penpot/penpot/main/docker/images/docker-compose.yaml
18 | ```
19 |
20 | 然后只需启动 `Penpot`:
21 |
22 |
23 | ```bash
24 | docker compose -p penpot -f docker-compose.yaml up -d
25 | ```
26 |
27 | 最后它将开始监听 http://localhost:9001
28 |
29 |
30 | ## 停止 `Penpot`
31 |
32 | 如果你想停止运行 Penpot,只需输入
33 |
34 | ```bash
35 | docker compose -p penpot -f docker-compose.yaml down
36 | ```
--------------------------------------------------------------------------------
/docs/portainer.md:
--------------------------------------------------------------------------------
1 | Portainer
2 | ===
3 |
4 | [Portainer](https://github.com/portainer/portainer) 是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
5 |
6 | ## v2 安装
7 |
8 | ```bash
9 | docker volume create portainer_data
10 | ```
11 |
12 | Docker Standalone
13 |
14 | ```bash
15 | docker run -d \
16 | -p 8000:8000 \
17 | -p 9000:9000 \
18 | --name=portainer \
19 | --restart=always \
20 | -v /var/run/docker.sock:/var/run/docker.sock \
21 | -v portainer_data:/data \
22 | portainer/portainer-ce
23 | ```
24 |
25 | Docker Swarm
26 |
27 | ```bash
28 | curl -L https://downloads.portainer.io/ee2-18/portainer-agent-stack.yml -o portainer-agent-stack.yml
29 | # 下载 https://downloads.portainer.io/portainer-agent-stack.yml
30 | docker stack deploy -c portainer-agent-stack.yml portainer
31 | ```
32 |
33 | ## v2.20
34 |
35 | 新建 `portainer-agent-stack.yml` 文件, 将下面内容复制到配置文件中,你可以从官方仓库拷贝 [`portainer/portainer-compose`](https://github.com/portainer/portainer-compose) 配置。
36 |
37 | ```yml
38 | version: '3.2'
39 | services:
40 | agent:
41 | image: portainer/agent:2.20.3-alpine
42 | volumes:
43 | - /var/run/docker.sock:/var/run/docker.sock
44 | #- ${HOME}/.orbstack/run/docker.sock:/var/run/docker.sock
45 | - /var/lib/docker/volumes:/var/lib/docker/volumes
46 | networks:
47 | - agent_network
48 | deploy:
49 | mode: global
50 | placement:
51 | constraints: [node.platform.os == linux]
52 |
53 | portainer:
54 | image: portainer/portainer-ce:2.20.3-alpine
55 | command: -H tcp://tasks.agent:9001 --tlsskipverify
56 | ports:
57 | - "9443:9443"
58 | - "9000:9000"
59 | - "8000:8000"
60 | volumes:
61 | - portainer_data:/data
62 | - /etc/localtime:/etc/localtime:ro
63 | networks:
64 | - agent_network
65 | deploy:
66 | mode: replicated
67 | replicas: 1
68 | placement:
69 | constraints: [node.role == manager]
70 |
71 | networks:
72 | agent_network:
73 | driver: overlay
74 | attachable: true
75 |
76 | volumes:
77 | portainer_data:
78 | ```
79 |
80 | ## 启动容器
81 |
82 | ```bash
83 | docker stack deploy --compose-file=portainer-agent-stack.yml portainer
84 | ```
85 |
86 | ## 运行容器
87 |
88 | ```bash
89 | docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 \
90 | --name=portainer --restart=always \
91 | -v /var/run/docker.sock:/var/run/docker.sock \
92 | -v ~/_docker/portainer/data:/data \
93 | portainer/portainer-ce:latest
94 | ```
--------------------------------------------------------------------------------
/docs/postgres.md:
--------------------------------------------------------------------------------
1 | PostgreSQL
2 | ===
3 |
4 | [PostgreSQL](https://www.postgresql.org/) (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。
5 |
6 | ## 快速启动容器
7 |
8 | ```bash
9 | docker run \
10 | -p 5432:5432 \
11 | -e POSTGRES_PASSWORD=wcjiang \
12 | --name postgres \
13 | --restart always \
14 | -d \
15 | postgres:latest
16 | ```
17 |
18 | ## 使用 stack 部署示例
19 |
20 | ```yml
21 | # Use postgres/example user/password credentials
22 | version: '3.1'
23 |
24 | services:
25 |
26 | db:
27 | image: postgres:latest
28 | restart: always
29 | environment:
30 | POSTGRES_PASSWORD: example
31 |
32 | adminer:
33 | image: adminer:latest
34 | restart: always
35 | ports:
36 | - 8081:8080
37 | ```
38 |
39 | ```bash
40 | docker stack deploy -c stack.yml postgres
41 | ```
42 |
43 |
--------------------------------------------------------------------------------
/docs/rancher.md:
--------------------------------------------------------------------------------
1 | Rancher 单节点安装
2 | ===
3 |
4 | [Rancher](https://github.com/rancher/rancher) 是为使用容器的公司打造的容器管理平台。Rancher 简化了使用 Kubernetes 的流程,开发者可以随处运行 Kubernetes(Run Kubernetes Everywhere),满足 IT 需求规范,赋能 DevOps 团队。
5 |
6 | ### Rancher 2.5.x 及之后的版本
7 |
8 | 登录到 Linux 主机,然后运行下面这个非常简洁的安装命令。
9 |
10 | 与 2.4.x 或之前的版本相比,使用docker run命令安装 Rancher 2.5.x 时,需要添加 `--privileged` 标志变量,启用特权模式安装 Rancher。
11 |
12 | ```
13 | docker run -d --restart=unless-stopped \
14 | -p 80:80 -p 443:443 \
15 | --privileged \
16 | rancher/rancher:latest
17 | ```
18 |
19 | ### 使用已有的可信证书
20 |
21 | ```bash
22 | docker run -d --restart=unless-stopped \
23 | -p 80:80 -p 443:443 \
24 | -v /etc/letsencrypt/live/xxxx.cn/cert.pem:/etc/rancher/ssl/cert.pem \
25 | -v /etc/letsencrypt/live/xxxx.cn/key.pem:/etc/rancher/ssl/key.pem \
26 | -v /etc/letsencrypt/live/xxxx.cn/cacerts.pem:/etc/rancher/ssl/cacerts.pem \
27 | -v $HOME/docker/rancher:/var/lib/rancher \
28 | --privileged \
29 | rancher/rancher:latest
30 | ```
31 |
32 | ### 使用 Let's Encrypt 证书
33 |
34 | ```bash
35 | docker run -d --restart=unless-stopped \
36 | -p 80:80 -p 443:443 \
37 | --privileged \
38 | rancher/rancher:latest \
39 | --acme-domain rancher.mydomain.com
40 | ```
41 |
42 | ### 持久化数据
43 |
44 |
45 | ```bash
46 | docker run -d --restart=unless-stopped \
47 | -p 80:80 -p 443:443 \
48 | -v $HOME/docker/rancher:/var/lib/rancher \
49 | --privileged \
50 | rancher/rancher:latest \
51 | --acme-domain rancher.mydomain.com
52 | ```
--------------------------------------------------------------------------------
/docs/redis.md:
--------------------------------------------------------------------------------
1 | Redis
2 | ===
3 |
4 | [Redis](https://redis.io/)(Remote Dictionary Server ),即远程字典服务,是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
5 |
6 | ## 下载镜像
7 |
8 | ```bash
9 | $ docker pull redis:4.0.11
10 | ```
11 |
12 | ## 运行容器
13 |
14 | ```bash
15 | $ docker run -d --rm -p 6389:6379 --name redis2 redis:4.0.11 redis-server --appendonly yes
16 | ```
17 |
18 | ## 使用自己的配置
19 |
20 | [Redis](https://hub.docker.com/_/redis/) 加载自己的配置文件,需要重新编译一个 `images`,通过复制官方[Redis 配置](https://github.com/antirez/redis/blob/3a27b3d0d85d56ecd758b56c6af477ae5ff08a76/redis.conf)。
21 |
22 | ```dockerfile
23 | FROM redis:4.0.11
24 | RUN mkdir -p /etc/redis
25 | # 设置时区
26 | ENV TimeZone=Asia/Shanghai
27 | RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
28 |
29 | COPY ./redis.conf /etc/redis/redis.conf
30 | CMD [ "redis-server", "/etc/redis/redis.conf" ]
31 | EXPOSE 6379
32 | ```
33 |
34 | 创建 docker 镜像,镜像名字为 `redis`,标记 `4.0.11`
35 |
36 | ```bash
37 | docker image build -t redis:4.0.11 .
38 | ```
39 |
40 | 如果你不需要更改配置,可以直接 `docker pull redis:4.0.11` 下载镜像。
41 |
42 | ```bash
43 | # 先运行 redis
44 | docker run -d --rm -p 6389:6379 --name redis2 redis:4.0.11 redis-server --appendonly yes
45 | # docker 禁止用主机上不存在的文件挂载到 container 中已经存在的文件
46 | docker container cp redis2:/etc/redis/redis.conf $HOME/_docker/redis/conf/redis.conf
47 | # 完成拷贝文件,停止 redis 容器 --rm 参数表示停止删除 redis2 容器
48 | docker stop redis2
49 | # 这个时候,container 中已经存在的配置文件
50 | docker run -d \
51 | -p 6389:6379 \
52 | --name redis2 \
53 | --restart always \
54 | -v $HOME/_docker/redis/data:/data \
55 | -v $HOME/_docker/redis/conf:/etc/redis \
56 | -v /etc/localtime:/etc/localtime:ro \
57 | redis:4.0.11 redis-server --appendonly yes
58 | # redis-server --appendonly yes 数据持久化
59 | ```
60 |
61 | ## 修改配置文件
62 |
63 | 修改配置文件 `$HOME/_docker/redis/conf/redis.conf` 将数据持久化目录指向 `/data` 目录,设置配置中的 `dir /data`。
64 |
65 | ```bash
66 | vim ~/_docker/redis/redis.conf
67 | ```
68 |
69 | ## 重启容器让配置生效
70 |
71 | ```
72 | docker restart redis2
73 | ```
--------------------------------------------------------------------------------
/docs/rocket.chat/README.md:
--------------------------------------------------------------------------------
1 | 企业聊天工具 Rocket.Chat 开源 IM 系统
2 | ===
3 |
4 | [Rocket.Chat](https://github.com/rocketchat/) 是特性最丰富的 Slack 开源替代品之一。
5 |
6 | 主要功能:群组聊天,直接通信,私聊群,桌面通知,媒体嵌入,链接预览,文件上传,语音/视频 聊天,截图等等。
7 |
8 | Rocket.Chat 原生支持 Windows,Mac OS X ,Linux,iOS 和 Android 平台。Rocket.Chat 通过 hubot 集成了非常流行的服务,比如 GitHub,GitLab,Confluence,JIRA 等等。
9 |
10 | 高级的特性包括:OTR 消息,XMPP 多用户聊天,Kerberos 认证,p2p 文件分享等等。
11 |
12 | 安装顺执行下面命令启动服务,[官方部署文档](https://rocket.chat/docs/installation/docker-containers/docker-compose/)
13 |
14 | ## docker-compose.yml
15 |
16 | ```yml
17 | version: '2'
18 |
19 | services:
20 | rocketchat:
21 | image: rocketchat/rocket.chat:latest
22 | restart: unless-stopped
23 | volumes:
24 | - ./uploads:/app/uploads
25 | environment:
26 | - PORT=3500
27 | - ROOT_URL=http://localhost:3500
28 | - MONGO_URL=mongodb://mongo:27017/rocketchat
29 | - MONGO_OPLOG_URL=mongodb://mongo:27017/local
30 | - MAIL_URL=smtp://smtp.email
31 | # - HTTP_PROXY=http://proxy.domain.com
32 | # - HTTPS_PROXY=http://proxy.domain.com
33 | depends_on:
34 | - mongo
35 | ports:
36 | - 3500:3500
37 | labels:
38 | - "traefik.backend=rocketchat"
39 | - "traefik.frontend.rule=Host: your.domain.tld"
40 |
41 | mongo:
42 | image: mongo:3.2
43 | restart: unless-stopped
44 | volumes:
45 | - ./data/db:/data/db
46 | #- ./data/dump:/dump
47 | command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
48 | labels:
49 | - "traefik.enable=false"
50 |
51 | # this container's job is just run the command to initialize the replica set.
52 | # it will run the command and remove himself (it will not stay running)
53 | mongo-init-replica:
54 | image: mongo:3.2
55 | command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
56 | depends_on:
57 | - mongo
58 |
59 | # hubot, the popular chatbot (add the bot user first and change the password before starting this image)
60 | hubot:
61 | image: rocketchat/hubot-rocketchat:latest
62 | restart: unless-stopped
63 | environment:
64 | - ROCKETCHAT_URL=rocketchat:3500
65 | - ROCKETCHAT_ROOM=GENERAL
66 | - ROCKETCHAT_USER=bot
67 | - ROCKETCHAT_PASSWORD=botpassword
68 | - BOT_NAME=bot
69 | # you can add more scripts as you'd like here, they need to be installable by npm
70 | - EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
71 | depends_on:
72 | - rocketchat
73 | labels:
74 | - "traefik.enable=false"
75 | volumes:
76 | - ./scripts:/home/hubot/scripts
77 | # this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
78 | ports:
79 | - 3001:8080
80 |
81 | #traefik:
82 | # image: traefik:latest
83 | # restart: unless-stopped
84 | # command: traefik --docker --acme=true --acme.domains='your.domain.tld' --acme.email='your@email.tld' --acme.entrypoint=https --acme.storagefile=acme.json --defaultentrypoints=http --defaultentrypoints=https --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' --entryPoints='Name:https Address::443 TLS.Certificates:'
85 | # ports:
86 | # - 80:80
87 | # - 443:443
88 | # volumes:
89 | # - /var/run/docker.sock:/var/run/docker.sock
90 | ```
91 |
92 | ## 服务启动
93 |
94 | ```bash
95 | docker-compose up -d mongo
96 | # 第一次启动mongo时,您还需要初始化它才能使用Rocket.Chat。
97 | # 确保mongo处于运行状态,然后:
98 | docker-compose up -d mongo-init-replica
99 | # mongo 启动完成启动主程序
100 | docker-compose up -d rocketchat
101 | # 如果你想要一个机器人,所以你不必自己说话,
102 | # 在你创建了一个管理员用户和一个机器人用户之后,再次编辑文件 docker-compose.yml 来改变变量:
103 | # - ROCKETCHAT_USER 和 ROCKETCHAT_PASSWORD 在 hubot 部分然后启动 hubot:
104 | docker-compose up -d hubot
105 | ```
--------------------------------------------------------------------------------
/docs/rocket.chat/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 |
3 | services:
4 | rocketchat:
5 | image: rocketchat/rocket.chat:latest
6 | restart: unless-stopped
7 | volumes:
8 | - ./uploads:/app/uploads
9 | environment:
10 | - PORT=3500
11 | - ROOT_URL=http://localhost:3500
12 | - MONGO_URL=mongodb://mongo:27017/rocketchat
13 | - MONGO_OPLOG_URL=mongodb://mongo:27017/local
14 | - MAIL_URL=smtp://smtp.email
15 | # - HTTP_PROXY=http://proxy.domain.com
16 | # - HTTPS_PROXY=http://proxy.domain.com
17 | depends_on:
18 | - mongo
19 | ports:
20 | - 3500:3500
21 | labels:
22 | - "traefik.backend=rocketchat"
23 | - "traefik.frontend.rule=Host: your.domain.tld"
24 |
25 | mongo:
26 | image: mongo:7.0
27 | restart: unless-stopped
28 | volumes:
29 | - ./data/db:/data/db
30 | #- ./data/dump:/dump
31 | command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
32 | labels:
33 | - "traefik.enable=false"
34 |
35 | # this container's job is just run the command to initialize the replica set.
36 | # it will run the command and remove himself (it will not stay running)
37 | mongo-init-replica:
38 | image: mongo:7.0
39 | command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
40 | depends_on:
41 | - mongo
42 |
43 | # hubot, the popular chatbot (add the bot user first and change the password before starting this image)
44 | hubot:
45 | image: rocketchat/hubot-rocketchat:latest
46 | restart: unless-stopped
47 | environment:
48 | - ROCKETCHAT_URL=rocketchat:3500
49 | - ROCKETCHAT_ROOM=GENERAL
50 | - ROCKETCHAT_USER=bot
51 | - ROCKETCHAT_PASSWORD=botpassword
52 | - BOT_NAME=bot
53 | # you can add more scripts as you'd like here, they need to be installable by npm
54 | - EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
55 | depends_on:
56 | - rocketchat
57 | labels:
58 | - "traefik.enable=false"
59 | volumes:
60 | - ./scripts:/home/hubot/scripts
61 | # this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
62 | ports:
63 | - 3001:8080
64 |
65 | #traefik:
66 | # image: traefik:latest
67 | # restart: unless-stopped
68 | # command: traefik --docker --acme=true --acme.domains='your.domain.tld' --acme.email='your@email.tld' --acme.entrypoint=https --acme.storagefile=acme.json --defaultentrypoints=http --defaultentrypoints=https --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' --entryPoints='Name:https Address::443 TLS.Certificates:'
69 | # ports:
70 | # - 80:80
71 | # - 443:443
72 | # volumes:
73 | # - /var/run/docker.sock:/var/run/docker.sock
--------------------------------------------------------------------------------
/docs/seaweedfs/ .dockerignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/docs/seaweedfs/ .dockerignore
--------------------------------------------------------------------------------
/docs/seaweedfs/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM frolvlad/alpine-glibc:alpine-3.5
2 |
3 | # Tried to use curl only (curl -o /tmp/linux_amd64.tar.gz ...), however it turned out that the following tar command failed with "gzip: stdin: not in gzip format"
4 | RUN apk add --no-cache --virtual build-dependencies --update wget curl ca-certificates && \
5 | wget -P /tmp https://github.com/$(curl -s -L https://github.com/chrislusf/seaweedfs/releases/latest | egrep -o 'chrislusf/seaweedfs/releases/download/.*/linux_amd64.tar.gz') && \
6 | tar -C /usr/bin/ -xzvf /tmp/linux_amd64.tar.gz && \
7 | apk del build-dependencies && \
8 | rm -rf /tmp/*
9 |
10 | # volume server gprc port
11 | EXPOSE 18080
12 | # volume server http port
13 | EXPOSE 8080
14 | # filer server gprc port
15 | EXPOSE 18888
16 | # filer server http port
17 | EXPOSE 8888
18 | # master server shared gprc+http port
19 | EXPOSE 9333
20 |
21 | VOLUME /data
22 |
23 | COPY filer.toml /etc/seaweedfs/filer.toml
24 | COPY entrypoint.sh /entrypoint.sh
25 | RUN chmod +x /entrypoint.sh
26 |
27 | ENTRYPOINT ["/entrypoint.sh"]
--------------------------------------------------------------------------------
/docs/seaweedfs/README.md:
--------------------------------------------------------------------------------
1 | SeaweedFS
2 | ===
3 |
4 | [SeaweedFS](https://github.com/chrislusf/seaweedfs) 是一个简单且高度可扩展的分布式文件系统。 有两个目标:存储数十亿个文件! 快速提供文件! SeaweedFS实现了一个带有O(1)磁盘搜索的对象存储,以及一个带有POSIX接口的可选Filer。
5 |
6 | ```bash
7 | docker build -t wcjiang/seaweedfs . # 编译docker镜像
8 | docker push wcjiang/seaweedfs:latest
9 | docker-compose up # 使用docker-compose 执行新建容器组
10 | docker-compose start # 启动容器组
11 | docker-compose stop # 停止容器组
12 | docker-compose ps # 查询容器组所有容器状态
13 | docker-compose down # 删除容器组
14 | ```
15 |
16 | ⚠️: `volume` 节点不可以被负载均衡,不然会出现上传错误。
17 |
18 | ## 名词
19 |
20 | - `master`: 主节点,即集群管理,同时存储文件和fid映射关系
21 | - `volume`: 1、文件卷节点,实际存储文件;2、卷,一个存储级别
22 | - `client`: 客户端,该FS使用RESTful交互,所以客户端都归纳为一类
23 | - `dataCenter`: 数据中心,简称DC
24 | - `rack`: 机架。一个机架属于特定的数据中心,一个数据中心可以包含多个机架。
25 |
26 | ```bash
27 | ┌┈┈┈┈┈┈┈┈┐ ┌┈┈┈┈┈┈┈┈┐
28 | ┆ ┆ ┆ ┆
29 | ┌┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┐ ┆M-master├┈┈┤S-master┆
30 | ┆ ├┈┈┈┈┈┈┈┈┈┈┈┈›▷▶ ┆ ┆ ┆
31 | ┆ client/web browser ┆ └┈┈┈┬┈┈┈┈┘ └┈┈┈┬┈┈┈┈┘
32 | ┆ ├┈┈┐ ┆ ┆
33 | └┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┘ ┆ ┌┈┈┈┈┈┴┈┈┈┈┈┬┈┈┈┈┈┴┈┈┈┈┈┐
34 | ┆ ┆ ┆ ┆
35 | ┆ ┆ ┆ ┆
36 | ┆ ┌┈┈┈┴┈┈┈┈┐ ┌┈┈┈┴┈┈┈┈┐ ┌┈┈┈┴┈┈┈┈┐
37 | ┆ ┆ ┆ ┆ ┆ ┆ ┆
38 | └┈┈┈›▷▶ volume ┆ ┆ volume ┆ ┆ volume ┆
39 | ┆ ┆ ┆ ┆ ┆ ┆
40 | └┈┈┈┈┈┈┈┈┘ └┈┈┈┈┈┈┈┈┘ └┈┈┈┈┈┈┈┈┘
41 | ```
42 |
43 | ## 写文件
44 |
45 | **上传文件**:首先,将HTTP `POST`,`PUT`或`GET`请求发送到 `/dir/assign`以获取fid和卷服务器URL:
46 |
47 | ```bash
48 | curl http://localhost:9333/dir/assign
49 | # {"count":1,"fid":"3,01637037d6","url":"127.0.0.1:8080","publicUrl":"localhost:8080"}
50 | ```
51 |
52 | 其次,要存储文件内容,请从响应中向 `URL +'/'+ fid` 发送`HTTP` `POST`请求:
53 |
54 | ```bash
55 | curl -F file=@/home/chris/myphoto.jpg http://127.0.0.1:8080/3,01637037d6
56 | # {"size": 43234}
57 | ```
58 |
59 | ⚠️:要更新,请发送包含更新文件内容的其他POST请求。
60 |
61 | ## 删除文件
62 |
63 | 将HTTP DELETE请求发送到相同的`URL +'/'+ fid` URL:
64 |
65 | ```bash
66 | curl -X DELETE http://127.0.0.1:8083/3,01637037d6
67 | ```
68 |
69 | ## 保存文件ID
70 |
71 | 现在,您可以将fid(本例中为3,01637037d6)保存到数据库字段中。
72 |
73 | 开头的数字 `3` 表示卷 `ID`。 在逗号之后,它是一个文件密钥 `01` 和一个文件 cookie `637037d6`
74 |
75 | 卷`id`是无符号的32位整数。 文件密钥是无符号的64位整数。 文件cookie是无符号的32位整数,用于防止URL猜测。
76 |
77 | 文件密钥和文件cookie都以十六进制编码。 您可以以自己的格式存储``元组,或者只是将fid存储为字符串。
78 |
79 | 如果存储为字符串,理论上,您需要`8+1+16+8=33`字节。 如果不是绰绰有余,char(33) 就足够了,因为大多数用法不需要 `2^32`卷。
80 |
81 | 如果空间确实存在问题,您可以使用自己的格式存储文件ID。 对于卷id,您需要一个4字节整数,对于文件密钥,需要8字节长整数,对于文件cookie,需要4字节整数。 所以16个字节绰绰有余。
82 |
83 | ## 读取文件
84 |
85 | 以下是如何呈现URL的示例。
86 |
87 | 首先按文件的 `volumeId` 查找卷服务器的URL:
88 |
89 | ```bash
90 | curl http://localhost:9333/dir/lookup?volumeId=3
91 | # {"locations":[{"publicUrl":"localhost:8080","url":"localhost:8080"}]}
92 | ```
93 |
94 | 由于(通常)卷服务器不是太多,并且卷不经常移动,因此您可以在大多数时间缓存结果。 根据复制类型,一个卷可以具有多个副本位置。 只需随机选择一个位置即可阅读。
95 |
96 | 现在您可以通过url获取公共URL,呈现URL或直接从卷服务器读取:
97 |
98 | ```bash
99 | http://localhost:8083/3,01637037d6.jpg
100 | ```
101 |
102 | ⚠️:请注意,我们在这里添加文件扩展名 `.jpg`。 它是可选的,只是客户端指定文件内容类型的一种方式。
103 |
104 | 如果您想要更好的URL,可以使用以下其中一种替代URL格式:
105 |
106 | ```bash
107 | http://localhost:8083/3/01637037d6/my_preferred_name.jpg
108 | http://localhost:8083/3/01637037d6.jpg
109 | http://localhost:8083/3,01637037d6.jpg
110 | http://localhost:8083/3/01637037d6
111 | http://localhost:8083/3,01637037d6
112 | ```
113 |
114 | 如果您想获得图像的缩放版本,可以添加一些参数:
115 |
116 | ```bash
117 | http://localhost:8083/3/01637037d6.jpg?height=200&width=200
118 | http://localhost:8083/3/01637037d6.jpg?height=200&width=200&mode=fit
119 | http://localhost:8083/3/01637037d6.jpg?height=200&width=200&mode=fill
120 | ```
--------------------------------------------------------------------------------
/docs/seaweedfs/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 |
3 | services:
4 | master:
5 | image: wcjiang/seaweedfs # use a remote image
6 | # build: . # build our container from the local Dockerfile
7 | ports:
8 | - 9333:9333
9 | command: "master"
10 | networks:
11 | default:
12 | aliases:
13 | - seaweed_master
14 | volume:
15 | image: wcjiang/seaweedfs # use a remote image
16 | # build: . # build our container from the local Dockerfile
17 | ports:
18 | - 8083:8080
19 | - 18080:18080
20 | command: 'volume -max=5 -mserver="master:9333" -port=8080'
21 | depends_on:
22 | - master
23 | networks:
24 | default:
25 | aliases:
26 | - seaweed_volume
27 | filer:
28 | image: wcjiang/seaweedfs # use a remote image
29 | # build: . # build our container from the local Dockerfile
30 | ports:
31 | - 8888:8888
32 | - 18888:18888
33 | command: 'filer -master="master:9333"'
34 | depends_on:
35 | - master
36 | - volume
37 | networks:
38 | default:
39 | aliases:
40 | - seaweed_filer
--------------------------------------------------------------------------------
/docs/seaweedfs/entrypoint.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | case "$1" in
4 |
5 | 'master')
6 | ARGS="-ip `hostname -i` -mdir /data"
7 | # Is this instance linked with an other master? (Docker commandline "--link master1:master")
8 | if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
9 | ARGS="$ARGS -peers=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
10 | fi
11 | exec /usr/bin/weed $@ $ARGS
12 | ;;
13 |
14 | 'volume')
15 | ARGS="-ip `hostname -i` -dir /data"
16 | # Is this instance linked with a master? (Docker commandline "--link master1:master")
17 | if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
18 | ARGS="$ARGS -mserver=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
19 | fi
20 | exec /usr/bin/weed $@ $ARGS
21 | ;;
22 |
23 | 'server')
24 | ARGS="-ip `hostname -i` -dir /data"
25 | if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
26 | ARGS="$ARGS -master.peers=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
27 | fi
28 | exec /usr/bin/weed $@ $ARGS
29 | ;;
30 |
31 | 'filer')
32 | ARGS="-ip `hostname -i`"
33 | if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
34 | ARGS="$ARGS -master=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
35 | fi
36 | exec /usr/bin/weed $@ $ARGS
37 | ;;
38 |
39 | *)
40 | exec /usr/bin/weed $@
41 | ;;
42 | esac
--------------------------------------------------------------------------------
/docs/seaweedfs/filer.toml:
--------------------------------------------------------------------------------
1 | [leveldb]
2 | enabled = true
3 | dir = "."
--------------------------------------------------------------------------------
/docs/sourcegraph/README.md:
--------------------------------------------------------------------------------
1 | Sourcegraph
2 | ===
3 |
4 |
5 |
6 | [Sourcegraph](https://about.sourcegraph.com/) 是一个快速,开源,功能齐全的代码搜索和导航引擎。
7 |
8 | 
9 |
10 | ```bash
11 | docker run \
12 | --publish 7080:7080 --rm \
13 | --volume ~/_docker/sourcegraph/config:/etc/sourcegraph \
14 | --volume ~/_docker/sourcegraph/data:/var/opt/sourcegraph \
15 | --volume /var/run/docker.sock:/var/run/docker.sock \
16 | -d sourcegraph/server:2.13.5
17 | ```
--------------------------------------------------------------------------------
/idoc.chapters.yml:
--------------------------------------------------------------------------------
1 | - README.md: 入门
2 | - README: 实践
3 | - docker-compose.md: Docker Compose
4 | - elasticsearch.md: ElasticSearch 搜索服务器
5 | - gitlab/README.md: Gitlab 代码仓库管理系统
6 | - harbor.md: Harbor
7 | - mattermost.md: Mattermost 聊天工具
8 | - mysql.md: MySQL 数据库
9 | - nginx.md: Nginx Web 服务器
10 | - nps/README.md: NPS 内网穿透
11 | - portainer.md: Portainer Docker 管理
12 | - postgres.md: PostgreSQL 数据库
13 | - penpot.md: Penpot 设计和原型
14 | - navidrome.md: Navidrome 音乐服务器
15 | - rancher.md: Rancher 容器管理平台
16 | - redis.md: Redis 数据库
17 | - jenkins/README.md: Jenkins
18 | - rocket.chat/README.md: Rocket.Chat 聊天工具
19 | - seaweedfs/README.md: SeaweedFS 文件系统
20 | - sourcegraph/README.md: Sourcegraph 代码搜索引擎
--------------------------------------------------------------------------------
/idoc.yml:
--------------------------------------------------------------------------------
1 | site: Docker 入门教程
2 | logo: "./img/logo.svg"
3 | favicon: "./img/logo.svg"
4 |
5 | cacheFileStat: true
6 |
7 | homepage: https://wangchujiang.com/docker-tutorial/
8 |
9 | menus:
10 | 首页: index.html
11 | 捐赠:
12 | url: https://wangchujiang.com/#/sponsor
13 | target: __blank
14 |
15 | editButton:
16 | label: Edit this page on GitHub
17 | url: https://github.com/jaywcjlove/docker-tutorial/tree/master/
18 | footer: |
19 | App •
20 | Projects •
21 | Sponsor •
22 | More Apps
23 | Released under the MIT License. Copyright © 2024 Kenny Wong
24 | Generated by idoc v{{idocVersion}}
--------------------------------------------------------------------------------
/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaywcjlove/docker-tutorial/a2f70b16739b4aa33bdb1600ce1638c11eda2642/img/logo.png
--------------------------------------------------------------------------------
/img/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/package.json",
3 | "private": true,
4 | "name": "docker-tutorial",
5 | "description": "Docker 是一个开源的应用容器引擎,而一个容器其实是一个虚拟化的独立的环境,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。",
6 | "version": "1.0.0",
7 | "scripts": {
8 | "start": "idoc --watch",
9 | "build": "idoc"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "https://github.com/jaywcjlove/docker-tutorial"
14 | },
15 | "keywords": [
16 | "docker",
17 | "containers",
18 | "tutorial"
19 | ],
20 | "dependencies": {
21 | "idoc": "^1"
22 | }
23 | }
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": [
3 | "config:base"
4 | ],
5 | "packageRules": [
6 | {
7 | "matchPackagePatterns": ["*"],
8 | "rangeStrategy": "replace"
9 | }
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------