├── .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 | [![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](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 | [![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor) 11 | 12 | [Docker](https://www.docker.com/) 是一个开源的应用容器引擎,而一个容器containers其实是一个虚拟化的独立的环境,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 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 | ![](./logo.png) 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 | ![Gitlab runner](./001.png) 365 | 366 | ![Gitlab runner](./002.png) 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 | ![](./001.png) 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 | ![](./002.png) 32 | 33 | ![](./003.png) 34 | 35 | ![](./004.png) 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 | ![](./005.png) 60 | 61 | ### ④ 建立内网穿透隧道 62 | 63 | ![](./006.png) 64 | 65 | ![](./007.png) 66 | 67 | 假设我们要穿透局域网 MySQL 数据库,在 `目标 (IP:端口)` 配置内网 MySQL IP:端口 `192.168.188.222:3306`,在外网访问的端口 `服务端端口` 配置 `33066` 68 | 69 | ![](./008.png) 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 | ![](./009.png) 80 | 81 | ![](./010.png) 82 | 83 | ![](./011.png) 84 | 85 | 在建立好 Socks5 代理之后,需要使用 [`proxifier`](https://www.proxifier.com/) 配置代理访问公司内网 86 | 87 | ![](./012.png) 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 | Sourcegraph 5 | 6 | [Sourcegraph](https://about.sourcegraph.com/) 是一个快速,开源,功能齐全的代码搜索和导航引擎。 7 | 8 | ![Screenshot](https://user-images.githubusercontent.com/1646931/46309383-09ba9800-c571-11e8-8ee4-1a2ec32072f2.png) 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 | 2 | 3 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------