Docker

简介

服务器搭建(2):Docker部署GitLab - 图1
Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
推荐链接:

  • Docker 官网
  • Github Docker 源码
  • Docker Hub

    docker关键词

    | 关键词 | 面向对象类比 | 虚拟机类比 | 网吧无盘系统类比 | | —- | —- | —- | —- | | 镜像(Images) | 类 | 安装镜像(.iso文件) | 存在网吧主服务器上的系统启动镜像 | | 容器(Container) | 对象(实体化的类) | 虚拟机 | 无盘计算机 | | 仓库(Registry) | 各种类声明的集合 | 提供各种版本iso文件下载的网站 | 网吧主服务器 |
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container) 容器是独立运行的一个或一组应用。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

CentOS 7 下安装 Docker

Docker CE需要内核版本不低于3.10,先查看CentOS内核版本

  1. [root@localhost ~]# uname -r
  2. 3.10.0-957.el7.x86_64

官方文档:https://docs.docker.com/install/linux/docker-ce/centos/
安装docker ce即社区免费版,先安装必要的软件包,安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。

  1. $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

紧接着配置一个稳定(stable)的仓库 ,仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中。此处我们使用阿里云。

  1. $ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新Yum安装的相关Docke软件包

  1. $ sudo yum makecache fast1

安装Docker CE

  1. $ sudo yum install docker-ce

设置随系统启动

  1. $ systemctl enable docker.service1

启动Docker

  1. $ sudo systemctl start docker

查看docker版本,说明安装成功

  1. [root@localhost ~]# docker version
  2. Client:
  3. Version: 18.09.5
  4. API version: 1.39
  5. Go version: go1.10.8
  6. Git commit: e8ff056
  7. Built: Thu Apr 11 04:43:34 2019
  8. OS/Arch: linux/amd64
  9. Experimental: false
  10. Server: Docker Engine - Community
  11. Engine:
  12. Version: 18.09.5
  13. API version: 1.39 (minimum version 1.12)
  14. Go version: go1.10.8
  15. Git commit: e8ff056
  16. Built: Thu Apr 11 04:13:40 2019
  17. OS/Arch: linux/amd64
  18. Experimental: false

查看docker运行状态

  1. [root@localhost ~]# systemctl status docker
  2. docker.service - Docker Application Container Engine
  3. Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  4. Active: active (running) since 2019-05-05 09:55:36 CST; 2 days ago
  5. Docs: https://docs.docker.com
  6. Main PID: 7605 (dockerd)
  7. Tasks: 102
  8. Memory: 166.1M
  9. CGroup: /system.slice/docker.service
  10. ├─7605 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  11. ├─8499 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8443 -container-ip 172.17.0.3 -container-port 443
  12. ├─8513 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8090 -container-ip 172.17.0.3 -container-port 80
  13. ├─8527 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 2222 -container-ip 172.17.0.3 -container-port 22
  14. └─9284 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8091 -container-ip 172.17.0.2 -container-port 80
  15. 5 05 09:55:33 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:33.630158793+08:00" level=info msg="Loading contai...tart."
  16. 5 05 09:55:34 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:34.215245368+08:00" level=info msg="Default bridge...dress"
  17. 5 05 09:55:36 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:36.161163189+08:00" level=info msg="Loading contai...done."
  18. 5 05 09:55:36 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:36.209954974+08:00" level=info msg="Docker daemon"...8.09.5
  19. 5 05 09:55:36 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:36.211382418+08:00" level=info msg="Daemon has com...ation"
  20. 5 05 09:55:36 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:36.301429467+08:00" level=info msg="API listen on ....sock"
  21. 5 05 09:55:36 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
  22. 5 07 13:53:39 localhost.localdomain dockerd[7605]: time="2019-05-07T13:53:39.301135574+08:00" level=info msg="Container 93fb...force"
  23. 5 07 13:53:40 localhost.localdomain dockerd[7605]: time="2019-05-07T13:53:40.008715925+08:00" level=info msg="ignoring event...elete"
  24. 5 07 14:00:02 localhost.localdomain dockerd[7605]: time="2019-05-07T14:00:02.919668287+08:00" level=info msg="ignoring event...elete"
  25. Hint: Some lines were ellipsized, use -l to show in full.

Docker 下部署 GitLab

检索镜像

通过命令docker search gitlab在docker hub上搜索gitlab,第一个就是gitlab社区版

  1. [root@localhost ~]# docker search gitlab
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. gitlab/gitlab-ce GitLab Community Edition docker image based 2492 [OK]
  4. sameersbn/gitlab Dockerized gitlab web server 1110 [OK]
  5. gitlab/gitlab-runner GitLab CI Multi Runner used to fetch and run 505 [OK]
  6. twang2218/gitlab-ce-zh 汉化的 GitLab 社区版 Docker Image 179 [OK]
  7. gitlab/gitlab-ee GitLab Enterprise Edition docker image based 145
  8. jangrewe/gitlab-ci-android GitLab CI image for building Android apps 50 [OK]
  9. centurylink/gitlab This image uses the image from sameersbn / g 26 [OK]
  10. edbizarro/gitlab-ci-pipeline-php Docker images for build and test PHP applica 22
  11. cdrx/rancher-gitlab-deploy Painless deployment of projects built with G 22 [OK]
  12. klud/gitlab-runner GitLab Runner for ARM devices 19
  13. gitlab/gitlab-runner-helper 13
  14. ciricihq/gitlab-sonar-scanner Gitlab Docker container to run sonar-scanner 12 [OK]
  15. dockerphp/gitlab-ci-pipeline Gitlab CI pipeline for PHP applications 4 [OK]
  16. sgillespie/gitlab-runner A Dockerized GitLab Runner that automaticall 3 [OK]
  17. gitlab/cog GitLab Bundle for Cog 3
  18. mastertinner/gitlab-merge-request-resource A concourse resource to check for new merge 1 [OK]
  19. primetoninc/gitlab gitlab-ce 1 [OK]
  20. lorands/gitlab-merge-request-resource This is a fork of swisscom/gitlab-merge-requ 1 [OK]
  21. adamkl/gitlab-merge-request-resource Customized with support for gitlab ssh on di 0 [OK]
  22. stanfordlegion/gitlab-ci An image for Gitlab CI. 0 [OK]
  23. integram/gitlab Gitlab integration for Telegram 0 [OK]
  24. samcontesse/gitlab-merge-request-resource A concourse resource to check for new merge 0 [OK]
  25. gitlab/gitlab-qa GitLab QA has a test suite that allows end-t 0
  26. instrumentisto/gitlab-builder Docker image with minimal toolchain required 0 [OK]
  27. boldcommerce/gitlab-merge-request-resource Reverted build of Swisscom's resource until … 0 [OK]

下载gitlab镜像

  1. $ sudo docker pull gitlab/gitlab-ce

docker images命令看docker镜像,镜像已经准备好

  1. [root@localhost ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. gitlab/gitlab-ce latest 8700fb8408e8 11 days ago 1.78GB
  4. seafileltd/seafile latest 68e4dbd7c90d 2 months ago 1.03GB

运行镜像

由于之前我们已经为应用程序创建好了数据分区,所以docker容器的磁盘映射放在/data下。根据GitLab官方文档,应创建三个文件路径,分别为/data/gitlab/config,/data/gitlab/logs,/data/gitlab/data。根据名称也能推断出三个路径中分别存放什么文件:

Local location Container location Usage
/data/gitlab/data /var/opt/gitlab For storing application data
/data/gitlab/logs /var/log/gitlab For storing logs
/data/gitlab/config /etc/gitlab For storing the GitLab configuration files

运行gitlab镜像

  1. $ sudo docker run --detach \
  2. --publish 8443:443 --publish 8090:80 --publish 2222:22 \
  3. --name gitlab \
  4. --restart always \
  5. --volume /data/gitlab/config:/etc/gitlab \
  6. --volume /data/gitlab/logs:/var/log/gitlab \
  7. --volume /data/gitlab/data:/var/opt/gitlab \
  8. gitlab/gitlab-ce:latest

操作参数说明:

  • —detach:后台运行
  • —publish:端口映射,如—publish 8443:443将docker容器的443端口映射到实体机的8443端口
  • —name:定义容器名称
  • —volume:磁盘映射,实体机路径:容器内路径

注意:实体机防火墙打开映射出的几个端口,不然将无法访问,在这里分别是8443,8090,2222
此时浏览器登录http://192.168.1.19:8090即可访问GitLab。

修改配置文件

到这里虽然能访问了,但是还存在一个问题,那就是URL。此时如果不修改配置文件,当创建一个project之后,你会发现GitLab给出的项目连接是http://93fbe098e00a/root/projectname.git。那么这个93fbe098e00a是什么呢,通过docker ps可以看到,这实际是docker容器ID,这里需要修改gitlab配置文件来纠正这个URL。
可通过命令打开docker中gitlab的配置文件:

  1. $ sudo docker exec -t -i gitlab vim /etc/gitlab/gitlab.rb

也可在实体机映射的路径中打开

  1. $ sudo vim /data/gitlab/config/gitlab.rb

在文件中修改如下三处,external_url、gitlab_rails的具体URL及端口根据实际情况自行修改,nginx侦听端口为80:

  1. external_url 'http://192.168.1.19:8090'
  1. gitlab_rails['gitlab_ssh_host'] = '192.168.1.19'
  2. gitlab_rails['gitlab_shell_ssh_port'] = 2222
  1. nginx['listen_port'] = 80

此处之所以指定nginx侦听端口,是因为external_url不指定端口时,nginx默认侦听80端口;external_url修改为指定端口的url之后,nginx便会去侦听该指定的端口,注意这里的nginx是容器内部的,所以不应去侦听8090,而应当继续侦听80端口,如果不修改此处回导致无法访问。这就是网上一些帖子中说external_url只能配置ip或者域名,不能有端口,否则不能启动的真正原因,其实是并未理解docker的运行机制,误人子弟。
重启gitlab容器,使配置文件生效

  1. $ sudo docker restart gitlab