1. Docker容器中各种镜像介绍

目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS Fedora系列。前者以自带软件包版本较新而出名;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时,社区还推出了完全基于Docker的Linux发行版CoreOS。
使用Docker,只需要一个命令就能快速获取一个Linux发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简 ,但是可以支持完整Linux系统的大部分功能。
下面将介绍如何使用Docker安装和使用BusyBox、Alphine、Debian/Ubuntu、Cent0S/Fedor等操作系统。

1.1 BusyBox

BusyBox是一个集成了一百多个最常用Linux命令和工具(如cat、echo、 grep、 mount、 telnet等 )的精简工具箱,它只有几MB的大小,很方便进行各种快速验证, 被誉为”Linux系统的瑞士军刀”。BusyBox可运行于多款POSIX环境的操作系统中,如Linux(包括Android)、Hurd、 FreeBSD等。
在docker Hub中搜索busybox相关的镜像:

  1. docker search busybox

带有OFFICIAL标记说明是官方镜像。可使用docker pull指定下载镜像busybox:latest

  1. docker pull busybox:latest

下载后,可看到镜像只有1.15M
启动一个busybox容器,并在容器内查看挂载信息:
busybox镜像虽然小巧,但包括了大量常见的Linux命令,读者可以用它快速熟悉Linux命令。

1.2 Alpine

Alpine操作系统是一个面向安全的轻型inux发行版。它不同于通常的Linux发行版,Alpine采用了musl libc和BusyBox以减小系统的体积和运行时资源消耗,但功能上比BusyBox又完善得多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Apine还提供了自己的包管理工具apk,可以通过https:/pkgs.alpinelinuxcore/packages查询包信息,也可以通过apk命合直接查询和安装各种软件。
Alpine是由非商业组织维护的支持广泛场景的Linux发行版,它特别为资深/重度Linux用户而优化,关注安全、性能和资源效能。Alpine镜像适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
Alpine Docker镜像也继承了Alpine Linux发行版的这些优势。相比于其他Docker镜像,它的容量非常小,仅仅只有5MB左右(Ubuntu系列镜像接近200MB),且拥有非常友好的包管理机制。官方镜像来自Docker alpine项目。
目前Dcker官方已开始推荐使用Apine替代之前的Ubuntu作为基础镜像环境。这样会带来多个好处,包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
1.2.1使用官方镜像
由于镜像很小,下载时间往往很短,可以使用docker run指令直接运行一个alpine容器,并指定运行的Linux指令,例如:

  1. docker run a1pine echo '123'

笔者使用time工具测试在本地没有提前pul1镜像的情况下,执行echo命令的时间,仅需要3秒左右。

  1. time docker run alpine echo '23'

1.2.2迁移至Alpine基础镜像
目前,大部分Docker官方镜像都已经支持Alpine作为基础镜像,因此可以很容易地进行迁移。
例如:

  1. ubuntu/debian -> alpine
  2. python:2.7-alpinepython:2.7->
  3. ruby:2.3 -> ruby:2.3-alpine

另外,如果使用Apine镜像替换Ubuntu基础镜像,安装软件包时需要用apk包管理器替换apt工具,如

  1. $ apk add --no-cache <package>

Alpine中软件安装包的名字可能会与其他发行版有所不同,可以在htps://pkgs.apinelinux.org/packages网站搜索并确定安装包的名称。如果需要的安装包不在主索引内,但是在测试或社区索引中,那么可以按照以下方法使用这些安装包:

  1. echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
  2. apk --update add --no-cache <package>

1.3 Debian/Ubuntu

Debian和Ubuntu都是目前较为流行的Debian系的服务器操作系统,十分适合研发场景。DockerHub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
1.3.1 Debian系统简介及使用
Debian是由GPI和其他自由软件许可协议授权的自由软件组成的操作系统,由Debian Project组织维护。Debian计划是一一个独立、分散的组织,由3000个志愿者组成,接受世界多个非盈利组织的资金支持,Software in the Public Interest提供支持并持有商标作为保护机构。Debian以其坚守Unix和自由软件的精神,以及给予用户的众多选择而闻名。现在Debian包括 了超过25000个软件包并支持12个计算机系统结构。
作为一个大的系统组织框架,Debian下面有多种不同操作系统核心的分支计划,主要为采用Linux核心的Debian GNU/Linux系统,其他还有采用GNUHurd核心的Debian GNU/Hurd系统、采用FreeBSD核心的Debian GNU/kFreeBSD系统,以及采用NetBSD核心的Debian GNUNetBSD系统,甚至还有利用Debia的系统架构和工具,采用OpenSolaris核心构建而成的Nexenta Os系统。在这些Debian系统中,以采用Linux核心的Debian GNU/L inux最为著名。
众多的Linux发行版,例如Ubuntu、Knoppix和Linspire及Xandros等,都基于Debian GNU/Linux。
可以使用docker search搜索Docker Hub,查找Debian镜像,结果如下所示:

  1. docker search debian

官方提供了大家熟知的debian镜像以及面向科研领域的neurodebian镜像。
可以使用docker ru直接运行debian

  1. $ docker run -it debian bash
  2. root@668e178d8d69:/# cat /etc/issueDebian GNU/L1nux

debian镜像很适合作为基础镜像,用于构建自定义镜像。
1.3.2 Ubuntu系统简介及使用
Ubuntu是一个以桌面应用为主的GNU/L inux操作系统,其名称来自非洲南都提鲁语,基于debian发行版和GNOME/Unity桌面环境,与Debian的不同在于它每6个月会发布个新版本,每2年会推出一个长期支持( LongTerm Support, LTS) 版本,一般支持3年。
下面以Ubuntu 18.04为例,演示如何使用该镜像安装一些常用软件。
首先使用一七参数启动容器,登录bash,查看ubunt的发行版本号:

  1. $ docker run -ti ubuntu:18.04 /bin/bash
  2. roote7d93de07bf76:/# 1sb_ release -a

当试图直接使用apt-get安装一个软件的时候,会提示E :Unable to locate package :

  1. root@7d93de07bf76:/# apt-get install curl
  2. Reading package lists... Done
  3. Reading state infor

这并非系统不支持apt-get命令。Docker镜像在制作时为了精简清除了apt仓库信息,因此需要先执行apt-get update命合来更新仓库信息。更新信息后即可成功通过apt- get命合来安装软件:

  1. roote7d93de07bf76:/ apt-get update

安装cul工具

1.4 CentOS/Fedora

1.4.1 Centos系统简介及使用

CentOs和Fedora都是基于Redhat的常见Linux分支。CentOS是目前企业级服务器的常用操作系统; Fedora则主要面向个人桌面用户。
CentOS (Community Enterprise Operating System,社区企业操作系统)是基于Red Hat Enterprise Linu源代码编译而成的。由于CentOs与Redhat Linux源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用
CentOs来替代商业版Red Hat Fnterprise Linux。CgntOS自 身不包含闭源软件。
在Docker Hub.上使用docker search命合来搜索标星至少为25的CentOS相关镜像,如下所示:

  1. docker search -f stars=25 centos

使用docker run直接运行最新的Centos镜像,并登录bash :

  1. docker run -it centos bash
  2. [roote43eb3b194d48/1# cat /etc/redhat-releaseCentOs Linux release 7.2.1511 (Core)

1.4.2 Fedora系统简介及使用

Fedora是由Fedora Project社区开发,红帽公司赞助的inux发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。对用户而言,Fedora是一套功能完备的、可以更新的免费操作系统,而对赞助商RedHat而言,它是许多新技术的测试平台,被认为可用的技术最终会加入到RedHat Enterprise Linux中。
本章讲解了典型操作系统镜像的下载和使用。除了官方的镜像之外,在Docker Hub上还有许多第三方组织或个人上传的Docker镜像。读者可以根据具体情况来选择。一般来说注意如下几点:
·官方镜像体积都比较小,只带有一些基本的组件。精简的系统有利于安全、稳定和高效运行,也适合进行定制。
·个别第三方镜像(如tutum,已被Docker收购)质量也非常高。这些镜像通常针对某个具体应用进行配置,比如,包含LAMP组件的Ubuntu镜像。
·出于安全考虑,几乎所有官方制作的镜像都没有安装SSH服务,无法使用用户名和密码直接登录。
后续章节中,笔者将介绍如何创建一个带sSH服务 的Docker镜像。

2. 为镜像添加ssh服务

用两种方法创建带有ssh服务的镜像。

2.1 基于docker commit命令创建

Docker提供了docker commit命令,支持用户提交自己定制容器的修改,并生成新的镜像。

  1. 命令格式为:docker commit [option] container [repository:tag]
  2. OPTIONS说明:
  3. -a :提交的镜像作者;
  4. -c :使用Dockerfile指令来创建镜像;
  5. -m :提交时的说明文字;
  6. -p :在commit时,将容器暂停。

2.1.1 准备基础镜像

  1. docker run -it --name sshd ubuntu:latest

2.1.2 更新apt缓存,并安装openssh-server

  1. root@aa4fdad2e9c9:/# apt-get update && apt-get install openssh-server y

2.1.3 配置ssh服务

  1. root@aa4fdad2e9c9:/# mkdir -p /var/run/sshd
  2. root@aa4fdad2e9c9:/# /usr/sbin/sshd -D &
  3. root@aa4fdad2e9c9:/# ps -ef|grep sshd

修改ssh服务的安全登陆配置,取消pam登陆限制:

  1. root@aa4fdad2e9c9:/# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

配置公钥:

  1. mkdir root/.ssh
  2. vim /root/.ssh/authorized_keys

创建自动启动ssh服务的可执行文件run.sh,并添加权限:

  1. root@aa4fdad2e9c9:/# vim /run.sh
  2. root@aa4fdad2e9c9:/# chmod +x run.sh
  3. #! /bin/bash
  4. /usr/sbin/sshd p

2.1.4 保存镜像

  1. docker commit sshd sshd:docker1.0

2.1.5 使用镜像

启动容器,添加端口映射10022—->22

  1. docker run -d -p 10022:22 sshd:docker1.0 sh -c /run.sh

**2.1.6 ssh登陆容器在宿主机上或者其他主机上,通过ssh访问10022端口来登陆容器:

  1. [root@server01 ~]# ssh 192.168.136.131 -p 10022
  2. root@aa4fdad2e9c9:~#

2.2 基于Dockerfile创建

2.2.1 创建工作目录

  1. mkdir sshd_docker
  2. cd sshd_docker/
  3. touch Dockerfile run.sh

2.2.2 编写run.sh 和authorized_keys文件

  1. [root@server01 sshd_docker]# cat run.sh
  2. #! /bin/bash
  3. /usr/sbin/sshd -D

宿主机上创建密钥对,并创建authorized_keys文件:

  1. ssh-keygen -t rsa
  2. cat ~/.ssh/id_rsa.pub >authorized_keys

2.2.3 编写Dockerfile

  1. [root@server01 sshd_docker]# cat Dockerfile
  2. FROM ubuntu:latest
  3. MAINTAINER Jordan
  4. RUN apt-get update && apt-get install -y openssh-server
  5. ENV DEBIAN_FRONTEND=noninteractive
  6. RUN apt-get install -y tzdata
  7. ENV TIME_ZONE Asia/Shanghai
  8. RUN mkdir -p /var/run/sshd \
  9. && mkdir -p /root/.ssh \
  10. && echo "${TIME_ZONE}" > /etc/timezone \
  11. && ln -fs /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \
  12. && dpkg-reconfigure -f noninteractive tzdata
  13. RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
  14. ADD authorized_keys /root/.ssh/authorized_keys
  15. COPY run.sh /run.sh
  16. RUN chmod 755 /run.sh
  17. EXPOSE 22
  18. CMD ["/bin/sh","-c","/run.sh"]

2.2.4 创建镜像

cd sshd_docker/
docker build -t sshd:Dockerfile4.0 .

2.2.5 测试镜像

docker run -d -p 10023:22 sshd:Dockerfile4.0

**2.1.6 ssh登陆容器在宿主机上或者其他主机上,通过ssh访问10023端口来登陆容器:

[root@server01 ~]# ssh 192.168.136.131 -p 10023
root@56dec786503f:~#

3. tomcat

下面以tomcat9.0为例介绍定制镜像的步骤。

3.1 创建相关文件

mkdir tomcat_docker
cd tomcat_docker
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12-deployer.tar.gz
wget -O jdk-8u181-linux-x64.tar.gz http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz?AuthParam=1539048790_f740159598417b6d0cd7c3d61ba5d054
tar zxf apache-tomcat-9.0.12-deployer.tar.gz .
tar zxf jdk-8u181-linux-x64.tar.gz .
touch Dockerfile run.sh
cp springboot-test.war .

3.2 文件夹下具体文件如下

[root@server01 tomcat_docker]# ll
total 39520
drwxr-xr-x. 9 root root      160 Jun 28 15:22 apache-tomcat-9.0.10
-rw-r--r--. 1 root root  8592743 Jun 28 15:23 apache-tomcat-9.0.10.zip
-rw-r--r--. 1 root root      443 Oct  8 15:08 Dockerfile
drwxr-xr-x. 7   10  143      245 Jul  7 16:09 jdk1.8.0_181
-rw-r--r--. 1 root root       75 Oct  8 14:57 run.sh
-rw-r--r--. 1 root root 31863088 Sep 27 11:51 springboot-test.war

3.3 Dockerfile文件和其他脚本文件

[root@server01 tomcat_docker]# cat Dockerfile 
FROM sshd:Dockerfile8  #基于上面sshd镜像基础之上
MAINTAINER Jordan
#RUN apt-get install -yq --no-install-recommends wget pwgen ca-certficates && \
RUN  apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk
ADD apache-tomcat-9.0.10 /tomcat
ADD springboot-test.war ${CATALINA_HOME}/webapps
ADD jdk1.8.0_181 /jdk    #把tomcat,jdk,项目文件拷贝到容器里面
ADD run.sh /run.sh
RUN chmod +x /run.sh && \
chmod +x /tomcat/bin/*.sh
EXPOSE 8080
CMD ["/bin/sh","-c","/run.sh"]


[root@server01 tomcat_docker]# cat run.sh
#! /bin/bash
/usr/sbin/sshd -D &
exec ${CATALINA_HOME}/bin/catalina.sh run

3.4 创建和测试镜像

cd tomcat_docker
docker build -t tomcat9.0:jdk1.8-1 .

3.5 启动镜像

docker run -d -P --name tomcat tomcat9.0:jdk1.8-1

3.6 查看映射的端口信息

3.7 使用的同一网络的浏览器访问项目路径

4. jenkins

4.1 运行命令

(挂载目录uid=1000,和容器内设置成一样)

docker run -d --name jenkins  -p 8080:8080 -p 5000:5000  --restart always -v /home/jenkins:/var/jenkins_home  jenkins

4.2 登陆密码

cat /var/jenkins_home/secrets/initialAdminPassword

4.3 访问IP:8080,测试

5. gitlab

5.1 运行命令(内存2G)

docker run -d \
--hostname 192.168.136.131 \
-p 1443:443 -p  1080:80 -p 1092:22 \
--name gitlab \
--restart always \
-v /root/gitlab/config:/etc/gitlab \
-v /root/gitlab/logs:/var/log/gitlab \
-v /root/gitlab/data:/var/opt/gitlab gitlab-ce:latest

5.2 访问1080端口,测试

6