Docker 全家桶简介

758

CentOS Docker 安装

目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

使用yum安装

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本

安装 Docker

从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
本文介绍 Docker CE 的安装使用。

方法一(推荐):

curl -sSL https://get.daocloud.io/docker | sh

方法二:

移除旧的版本:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

安装一些必要的系统工具:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

把软件仓库地址替换为 阿里云:

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

更新 yum 缓存:

sudo yum makecache fast

安装 Docker-ce:

sudo yum -y install docker-ce

启动docker

启动 Docker 后台服务

sudo systemctl start docker

测试运行 hello-world

docker run hello-world

由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
验证hello-world是否安装成功

docker ps

到此,Docker 在 CentOS 系统的安装完成。

镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是阿里云的镜像地址。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。

  • 创建文件夹
sudo mkdir -p /etc/docker 
  • 编辑配置文件
vim /etc/docker/daemon.json
  • 将如下配置置入配置文件中
{
  "registry-mirrors": [
    "https://ab0kpooh.mirror.aliyuncs.com",
    "http://f1361db2.m.daocloud.io",
    "https://mirror.ccs.tencentyun.com"
  ]
}
  • 重启docker
sudo systemctl daemon-reload 
sudo systemctl restart docker

远程访问

  • 首先编辑docker的宿主机文件/lib/systemd/system/docker.service
vim /lib/systemd/system/docker.service

  • 修改以ExecStart开头的行(centos 7):
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
  • 如果是centos7以下的话,就把ExecStart修改为:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

上面两种都是修改后的结果

注意,端口号不一定是要2375,此端口号过于危险,生产环境建议更改为其他端口并开启TSL连接。此处不做拓展。

  • 修改后保存文件,然后通知docker服务做出的修改
systemctl daemon-reload
  • 重启docker服务
service docker restart
  • 测试一下看是否能连接到docker api。上面的2375就是对应端口
curl http://localhost:2375/verion

如果是阿里云服务器,有开防火墙或安全组需打开2375端口。

删除 Docker CE

执行以下命令来删除 Docker CE:

sudo yum remove docker-ce
sudo rm -rf /var/lib/docker

docker命令简介

docker   # docker 命令帮助

Commands:
    attach    Attach to a running container                 # 当前 shell 下 attach 连接指定运行镜像
    build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
    commit    Create a new image from a container's changes # 提交当前容器为新的镜像
    cp        Copy files/folders from the containers filesystem to the host path
              # 从容器中拷贝指定文件或者目录到宿主机中
    create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器
    diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化
    events    Get real time events from the server          # 从 docker 服务获取容器实时事件
    exec      Run a command in an existing container        # 在已存在的容器上运行命令
    export    Stream the contents of a container as a tar archive   
              # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
    history   Show the history of an image                  # 展示一个镜像形成历史
    images    List images                                   # 列出系统当前镜像
    import    Create a new filesystem image from the contents of a tarball  
              # 从tar包中的内容创建一个新的文件系统映像[对应 export]
    info      Display system-wide information               # 显示系统相关信息
    inspect   Return low-level information on a container   # 查看容器详细信息
    kill      Kill a running container                      # kill 指定 docker 容器
    load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]
    login     Register or Login to the docker registry server   
              # 注册或者登陆一个 docker 源服务器
    logout    Log out from a Docker registry server         # 从当前 Docker registry 退出
    logs      Fetch the logs of a container                 # 输出当前容器日志信息
    port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
              # 查看映射端口对应的容器内部源端口
    pause     Pause all processes within a container        # 暂停容器
    ps        List containers                               # 列出容器列表
    pull      Pull an image or a repository from the docker registry server
              # 从docker镜像源服务器拉取指定镜像或者库镜像
    push      Push an image or a repository to the docker registry server
              # 推送指定镜像或者库镜像至docker源服务器
    restart   Restart a running container                   # 重启运行的容器
    rm        Remove one or more containers                 # 移除一个或者多个容器
    rmi       Remove one or more images                 
              # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    run       Run a command in a new container
              # 创建一个新的容器并运行一个命令
    save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]
    search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像
    start     Start a stopped containers                    # 启动容器
    stop      Stop a running containers                     # 停止容器
    tag       Tag an image into a repository                # 给源中镜像打标签
    top       Lookup the running processes of a container   # 查看容器中运行的进程信息
    unpause   Unpause a paused container                    # 取消暂停容器
    version   Show the docker version information           # 查看 docker 版本号
    wait      Block until a container stops, then print its exit code   
              # 截取容器停止时的退出状态值
Run 'docker COMMAND --help' for more information on a command.

docker-compose安装

安装很简单,执行如下命令即可

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装完成后执行命令

docker-compose --version

显示出版本即安装成功。

也可以自行去官网查看安装:点我去官网

docker-compose命令简介

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information
#解释一下

build #构建或重建服务
help #命令帮助
kill #杀掉容器
logs #显示容器的输出内容
port #打印绑定的开放端口
ps #显示容器
pull #拉取服务镜像
restart #重启服务
rm #删除停止的容器
run #运行一个一次性命令
scale #设置服务的容器数目
start #开启服务
stop #停止服务
up #创建并启动容器

Dockerfile

通过dockerfile来创建docker镜像,使用方法
目录结构
tomcat/
└── Dockerfile
编译命令(不加tag)
docker build  ucweb

docker build -f tomcat/Dockerfile
上面命令编译出来的镜像是没有名字和tag的,只有ID号。如果想自定义镜像名和tag,增加参数-t
docker build  tomcat -t tomcat:0.1   # name\[:tag]

指令简介

  • FROM:指定基础镜像
    第一条指令。scratch是虚拟的镜像,表示一个空白的镜像。文件第一行,用于创建镜像时使用的基础镜像,必须指定。建议使用当前官方基础镜像,推荐 Alpine ,一个非常小的完全的发行版。
  • LABEL: 标签
    添加标识性内容。多行用\分隔。可能有其他作用暂不深入。
  • MAINTAINER: 作者信息,标识,可有可无
  • RUN:执行命令
    镜像编译过程中执行的命令,第一个run命令都会提交一层文件,如果涉及到apt-get或者yum类的功能,在允许的情况下,建议在一条run命令中执行,会减小最终镜像的大小。
shell 格式: RUN <命令> ,RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式: RUN ["可执行文件", "参数1", "参数2"] 。run可以写多个,每一个指令都会建立一层,所以正确写法应该是↓
RUN buildDeps='gcc libc6-dev make' \
         && apt-get update \
         && apt-get install -y $buildDeps \
         && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
         && mkdir -p /usr/src/redis \
         && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
         && make -C /usr/src/redis \
         && make -C /usr/src/redis install \
         && rm -rf /var/lib/apt/lists/* \
         && rm redis.tar.gz \
         && rm -r /usr/src/redis \
         && apt-get purge -y --auto-remove $buildDeps
  • COPY:复制文本
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
<源路径> 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则,如:COPY hom* /mydir/    COPY hom?.txt /mydir/
<目标路径>使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。
  • ADD:高级复制文件
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
<源路径> 可以是一个 URL ,下载后的文件权限自动设置为 600 。
  • CMD:容器启动命令
    容器运行时执行的命令,一般为dockerfile文件最后一项,格式 。保证命令前台执行,否则命令执行完成,容器也停止运行,无法在后台运行程序。
shell 格式: CMD <命令>
exec 格式: CMD ["可执行文件", "参数1", "参数2"...]

CMD ["nginx", "-g", "daemon off;"]
  • ENTRYPOINT:入口点
    同CMD,指定容器启动程序及参数。
    通过--entrypoint 参数在运行时替换。
用例一:使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数。
示例:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

追加-i参数
$ docker run myip -i
......
当前 IP:61.148.226.66 来自:北京市 联通
  • ENV:设置环境变量
    在其他指令中可以直接引用ENV设置的环境变量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
示例:
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
  • ARG:构建参数
    与ENV不同的是,容器运行时不会存在这些环境变量。
    可以用 docker build --build-arg <参数名>=<值> 来覆盖。
  • VOLUME:定义匿名卷
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
  • EXPOSE:暴露端口
EXPOSE <端口1> [<端口2>...] 
EXPOSE :EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
  • WORKDIR:指定工作目录
WORKDIR <工作目录路径>
RUN cd /app
RUN echo "hello" > world.txt
CMD后命令执行时的当前目录,两次run不在一个环境内,可以使用WORKDIR。
  • USER:指定当前用户
这个用户必须是事先建立好的,否则无法切换。
USER <用户名>
  • HEALTHCHECK:健康检查
HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK 支持下列选项:
    --interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
    --timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
    --retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3次。

示例
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1

完整示例

FROM ubuntu   
#通过对centos 和ubuntu官方镜像文件大小的比较,建议使用ubuntu,基础镜像只有120MB。后期测试Alpine,尽量减小镜像大小.
MAINTAINER kevin3101
#作者或组织信息
COPY tomcat /usr/local/tomcat  
#复制java代码到镜像中,注意目标路径不能是上一级目录,与源对等。
ENV JAVA_HOME /usr/local/jdk   
#为减小镜像大小,这里使用宿主的java文件,运行容器时通过volume挂载主机的java home到容器。 
ENV CLASSPATH=.:$JAVA_HOME/lib/tools.jar
# 不再把java文件打到镜像里
ENV PATH=$JAVA_HOME/bin:$PATH     
#设置CMD 运行时的java环境变量
VOLUME ["/usr/local/jdk"]     
#挂载的卷(目录)
WORKDIR /usr/local/tomcat     
#当前工作目录
EXPOSE 8080               
#暴露的端口
CMD ["/usr/bin/nohup", "bin/startup.sh"]   
#容器运行时的命令,注意保持进程一直在前台运行,否则命令执行完,容器即停止运行。

运行命令:

docker run -d -v $JAVA_HOME:/usr/local/jdk -p 8080:8080 tomcat

镜像优化

  • 不管从存储还是发布上考虑,镜像文件的大小对docker的应用都有不小的影响。在编译镜像的过程中,通过多种方式尽量减小镜像的大小。
  • 每次编译都使用基础镜像,初期建议使用ubuntu,在docker运行正常的情况下考虑使用Alpine。在docker环境下,centos和ubuntu不同的包管理方式及运行模式对运维和使用,几乎没有什么差距。而且docker官方很多镜像都是基于ubutntu来构建的。
  • 使用宿主机的java环境,通过VOLUME挂载到容器内,同时设置程序运行时的环境变量。一个java包解压后370M,如果放在镜像内部的话,最后的应用镜像打出来将近600M,编译速度,发布时间都有较大的影响。
  • 尽量减少RUN指令的次数,特别是在run指令中执行软件安装命令的,尽可能放在一条RUN指令里执行。

Portainer可视化docker服务

简介

  • Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

Portainer安装

  • 建立安装目录
mkdir -p /mnt/docker/portainer
cd /mnt/docker/portainer
  • 建立挂载卷
docker volume create portainer_data
  • doker-compose.yaml编写
version: '3'
services:
  portainer:
    image: portainer/portainer
    container_name: portainer
    restart: always
    ports:
      - 9000:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer_data:/data

注意,安装Portainer前必须安装好docker服务。

  • 至此,可视化界面安装完毕。使用ip:9000进行访问即可。