Docker
简介

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内核版本
[root@localhost ~]# uname -r3.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)必须的两个软件包。
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
紧接着配置一个稳定(stable)的仓库 ,仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中。此处我们使用阿里云。
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新Yum安装的相关Docke软件包
$ sudo yum makecache fast1
安装Docker CE
$ sudo yum install docker-ce
设置随系统启动
$ systemctl enable docker.service1
启动Docker
$ sudo systemctl start docker
查看docker版本,说明安装成功
[root@localhost ~]# docker versionClient:Version: 18.09.5API version: 1.39Go version: go1.10.8Git commit: e8ff056Built: Thu Apr 11 04:43:34 2019OS/Arch: linux/amd64Experimental: falseServer: Docker Engine - CommunityEngine:Version: 18.09.5API version: 1.39 (minimum version 1.12)Go version: go1.10.8Git commit: e8ff056Built: Thu Apr 11 04:13:40 2019OS/Arch: linux/amd64Experimental: false
查看docker运行状态
[root@localhost ~]# systemctl status docker● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since 日 2019-05-05 09:55:36 CST; 2 days agoDocs: https://docs.docker.comMain PID: 7605 (dockerd)Tasks: 102Memory: 166.1MCGroup: /system.slice/docker.service├─7605 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock├─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├─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├─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└─9284 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8091 -container-ip 172.17.0.2 -container-port 805月 05 09:55:33 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:33.630158793+08:00" level=info msg="Loading contai...tart."5月 05 09:55:34 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:34.215245368+08:00" level=info msg="Default bridge...dress"5月 05 09:55:36 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:36.161163189+08:00" level=info msg="Loading contai...done."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.55月 05 09:55:36 localhost.localdomain dockerd[7605]: time="2019-05-05T09:55:36.211382418+08:00" level=info msg="Daemon has com...ation"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"5月 05 09:55:36 localhost.localdomain systemd[1]: Started Docker Application Container Engine.5月 07 13:53:39 localhost.localdomain dockerd[7605]: time="2019-05-07T13:53:39.301135574+08:00" level=info msg="Container 93fb...force"5月 07 13:53:40 localhost.localdomain dockerd[7605]: time="2019-05-07T13:53:40.008715925+08:00" level=info msg="ignoring event...elete"5月 07 14:00:02 localhost.localdomain dockerd[7605]: time="2019-05-07T14:00:02.919668287+08:00" level=info msg="ignoring event...elete"Hint: Some lines were ellipsized, use -l to show in full.
Docker 下部署 GitLab
检索镜像
通过命令docker search gitlab在docker hub上搜索gitlab,第一个就是gitlab社区版
[root@localhost ~]# docker search gitlabNAME DESCRIPTION STARS OFFICIAL AUTOMATEDgitlab/gitlab-ce GitLab Community Edition docker image based … 2492 [OK]sameersbn/gitlab Dockerized gitlab web server 1110 [OK]gitlab/gitlab-runner GitLab CI Multi Runner used to fetch and run… 505 [OK]twang2218/gitlab-ce-zh 汉化的 GitLab 社区版 Docker Image 179 [OK]gitlab/gitlab-ee GitLab Enterprise Edition docker image based… 145jangrewe/gitlab-ci-android GitLab CI image for building Android apps 50 [OK]centurylink/gitlab This image uses the image from sameersbn / g… 26 [OK]edbizarro/gitlab-ci-pipeline-php Docker images for build and test PHP applica… 22cdrx/rancher-gitlab-deploy Painless deployment of projects built with G… 22 [OK]klud/gitlab-runner GitLab Runner for ARM devices 19gitlab/gitlab-runner-helper 13ciricihq/gitlab-sonar-scanner Gitlab Docker container to run sonar-scanner… 12 [OK]dockerphp/gitlab-ci-pipeline Gitlab CI pipeline for PHP applications 4 [OK]sgillespie/gitlab-runner A Dockerized GitLab Runner that automaticall… 3 [OK]gitlab/cog GitLab Bundle for Cog 3mastertinner/gitlab-merge-request-resource A concourse resource to check for new merge … 1 [OK]primetoninc/gitlab gitlab-ce 1 [OK]lorands/gitlab-merge-request-resource This is a fork of swisscom/gitlab-merge-requ… 1 [OK]adamkl/gitlab-merge-request-resource Customized with support for gitlab ssh on di… 0 [OK]stanfordlegion/gitlab-ci An image for Gitlab CI. 0 [OK]integram/gitlab Gitlab integration for Telegram 0 [OK]samcontesse/gitlab-merge-request-resource A concourse resource to check for new merge … 0 [OK]gitlab/gitlab-qa GitLab QA has a test suite that allows end-t… 0instrumentisto/gitlab-builder Docker image with minimal toolchain required… 0 [OK]boldcommerce/gitlab-merge-request-resource Reverted build of Swisscom's resource until … 0 [OK]
下载gitlab镜像
$ sudo docker pull gitlab/gitlab-ce
docker images命令看docker镜像,镜像已经准备好
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEgitlab/gitlab-ce latest 8700fb8408e8 11 days ago 1.78GBseafileltd/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镜像
$ sudo docker run --detach \--publish 8443:443 --publish 8090:80 --publish 2222:22 \--name gitlab \--restart always \--volume /data/gitlab/config:/etc/gitlab \--volume /data/gitlab/logs:/var/log/gitlab \--volume /data/gitlab/data:/var/opt/gitlab \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的配置文件:
$ sudo docker exec -t -i gitlab vim /etc/gitlab/gitlab.rb
也可在实体机映射的路径中打开
$ sudo vim /data/gitlab/config/gitlab.rb
在文件中修改如下三处,external_url、gitlab_rails的具体URL及端口根据实际情况自行修改,nginx侦听端口为80:
external_url 'http://192.168.1.19:8090'
gitlab_rails['gitlab_ssh_host'] = '192.168.1.19'gitlab_rails['gitlab_shell_ssh_port'] = 2222
nginx['listen_port'] = 80
此处之所以指定nginx侦听端口,是因为external_url不指定端口时,nginx默认侦听80端口;external_url修改为指定端口的url之后,nginx便会去侦听该指定的端口,注意这里的nginx是容器内部的,所以不应去侦听8090,而应当继续侦听80端口,如果不修改此处回导致无法访问。这就是网上一些帖子中说external_url只能配置ip或者域名,不能有端口,否则不能启动的真正原因,其实是并未理解docker的运行机制,误人子弟。
重启gitlab容器,使配置文件生效
$ sudo docker restart gitlab
