Docker、Docker compose实战

Docker及Docker compose使用

  • 简介
  • Why docker
  • 架构
  • 详解三要素
  • 工作原理
  • 为什么比虚拟机快
  • centos安装docker
    • 卸载旧版本
    • 安装所需的依赖包
    • 配置国内源(阿里云)
    • 更新yum缓存
    • 安装docker-ce
    • 配置阿里云镜像加速
    • 设置开启自启
  • Docker命令
    • 帮助命令
    • 镜像命令
    • 容器命令
  • DockerFile
    • 通过dockerfile构建并启动镜像三步骤
    • 规范
    • 流程
    • DockerFile结构
  • Docker-Compose
    • 安装docker-compose
    • docker-compose.yml模板文件
    • docker-compose常用命令
  • Docker私有仓库
    • docker-compose.yml
    • 创建并启动容器
    • 管理界面
    • 配置管理员密码
    • 添加仓库地址
    • 私有仓库使用

简介

Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的核心理念是 Build, Ship, and Run Any App, Anywher,即一次封装,到处运行。

Why docker

  • 开发和运维之间因为环境不同而导致的矛盾
  • 集群环境下每台机器部署相同的应用
  • DevOps(Development and Operations)

架构

Docker、Docker compose实战_第1张图片

  1. Docker daemon:Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。可通过Docker客户端与之通信。
  2. Client:Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。
  3. Images:Docker镜像是一个只读模版,它包含创建Docker容器的说明。它和系统安装光盘有点像–使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行Docker镜像中的程序。
  4. Container:容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。
  5. Registry:Docker Registry是一个集中存储与分发镜像的服务。构建完Docker镜像后,就可在当前宿主机上运行。Docker Registry可分为公有(Docker Hub)和私有。

详解三要素

  1. 镜像(Image):就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。Docker、Docker compose实战_第2张图片

  2. 容器(Container)
    ①Docker利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
    ②可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
    ③容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

  3. 仓库(Repository)
    ①是集中存放镜像文件的场所。
    ②仓库和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含多个镜像,每个镜像有不同德标签(tag)。
    ③仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    ④最大的公开仓库是Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括:阿里云、网易云等。

工作原理

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器:是一个运行时环境。

为什么比虚拟机快

  • docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

  • docker利用的是宿主主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核等比较费时费资源的过程,当新建一个虚拟机软件需要加载Guest OS,新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了该过程,因此新建一个docker容器只需要几分钟。
    Docker、Docker compose实战_第3张图片

centos安装docker

卸载旧版本

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

安装所需的依赖包

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

配置国内源(阿里云)

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

更新yum缓存

yum makecache fast

安装docker-ce

yum -y install docker-ce

配置阿里云镜像加速

登录阿里云官网,按下图流程来获取自己的加速器地址,并在服务器配置。
Docker、Docker compose实战_第4张图片
Docker、Docker compose实战_第5张图片
Docker、Docker compose实战_第6张图片
Docker、Docker compose实战_第7张图片
重启docker的守护进程

systemctl daemon-reload

重启docker服务

systemctl restart docker

验证加速成功,执行docker info 命令,查看Registry Mirrors为刚才配置的加速器地址。

[root@localhost docker]# docker info
 Registry Mirrors:
  https://********.mirror.aliyuncs.com/
 Live Restore Enabled: false

设置开启自启

systemctl enable docker

Docker命令

帮助命令

docker version :版本信息
docker info:docker信息
docker --help:帮助命令

镜像命令

  • 列出宿主机上的镜像。
docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
jenkinsci/blueocean   latest              9393ec9589f7        2 weeks ago         568MB

REPOSITORY:表示镜像的仓库源。
TAG:镜像的标签(版本)
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

  • docker search name:查询名称为name的镜像,从dockerhub上查找
docker search redis
NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis                            Redis is an open source key-value store that…   8230                [OK]                
bitnami/redis                    Bitnami Redis Docker Image                      145                                     [OK]
...
  • docker pull name: 下载名称为name的镜像
  • docker rmi id:根据id删除某个镜像
  • docekr rmi -f name:tag name:tag :删除多个
  • docker rmi -f ${doker image -qa}:删除全部
  • docker inspect id:根据id获取镜像元信息
  • docker inspect name:根据name获取镜像元信息

容器命令

  • 新建并启动容器:docker run [options] image [command] [arg…]
    Docker、Docker compose实战_第8张图片

  • 列出当前所有正在运行的容器:docker ps [options]
    Docker、Docker compose实战_第9张图片

  • docker start [容器ID或者容器名]:启动容器

  • docker stop 容器id:停止容器

  • docker kill 容器id:强制停止容器

  • docker start 容器id:启动已停止的容器

  • docker inspect 容器id:查看容器的所有信息

  • docker container logs 容器id:查看容器日志

  • docker logs 【容器名称】:查看容器日志

  • docker top 容器id:查看容器里的进程

  • docker rm 容器id:删除已停止的容器

  • docker rm -f 容器id:删除正在运行的容器

  • docker rm -f $(docker ps -d)

  • docker container prune:删除所有已经退出的容器

  • docker exec -it 容器id /bin/bash:进入容器

  • exit:容器停止退出

  • ctrl+P+Q:容器不停止退出

  • docker cp 宿主机文件路径 容器ID或名称:容器路径:宿主机文件拷贝到容器中

  • docker cp 容器ID或名称:容器路径 宿主机文件路径:容器文件拷贝到宿主机中

DockerFile

用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本。涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程等。
Docker、Docker compose实战_第10张图片

通过dockerfile构建并启动镜像三步骤

  1. 按照规范创建一个dockerFile文件。
  2. 执行docker build 命令,获得一个自定义镜像。
  3. docker run创建并启动容器

规范

  1. 每条保留字指令都必须为大写字母且后面会跟随至少一个参数。
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile结构

  • FROM:基础镜像,当前镜像是基于哪个镜像的
  • MAINTAINER:镜像维护者的姓名和邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:镜像运行的端口号
  • WORKDIR:指定再创建容器后,终端默认登录进来的工作目录,一个落脚点
  • ENV:用来在构建过程中设置环境变量,ENV MY_PATH /usr/mytest,这个环境变量可以在后续的任务RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH
  • ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包
  • COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件或目录 复制到新的一层的镜像内的 <目录路径>位置
  • VOLUME:容器数据卷,用于数据持久化,宿主机和容器文件共享
  • CMD:指定一个容器启动时要运行的命令,Dockerfile中可以有多个cmd命令,但只有最后一个生效,cmd会被docker run之后的参数替换
  • ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD的区别,cmd会被docker run之后参数替换,而ENTRYPOINT不会覆盖而是追加,docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
  • ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承之后父镜像的onbuild会被触发。

Docker-Compose

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

安装docker-compose

docker-compose-Linux-v1.25.5
下载解压后上传到宿主机/usr/local/bin/目录下,

重命名

mv docker-compose-Linux-x86_64  docker-compose

授予可执行权限

chmod +x docker-compose

查看版本,验证安装成功

docker-compose -v

docker-compose.yml模板文件

Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。
#Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"
services:
  # 服务名称
  redis-master: 
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
    image: redis 
    # 创建的容器名称
    container_name: redis-master 
    # 自启动
    restart: always
    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
    privileged: true 
    # 为容器设置环境变量:
    environment: 
      - TZ=Asia/Shanghai
    # 端口映射,格式为宿主机端口:容器内部端口
    ports:
      - "6379:6379" 
    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录
    volumes: 
      - /zimo/redis/masterData:/data
      - /zimo/redis/conf/redis-master.conf:/usr/local/etc/redis/redis.conf
    # 覆盖容器启动后默认执行的命令。
    command: redis-server /usr/local/etc/redis/redis.conf 
  redis-sentinel:
    image: redis
    container_name: redis-sentinel
    restart: always
    privileged: true
    environment: 
      - TZ=Asia/Shanghai
    ports:
      - "26379:26379"
    volumes:
      - /zimo/redis/conf/redis-sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf

docker-compose常用命令

docker-compose命令必须在对应的docker-compose.yml同级目录中执行

  • docker-compose up -d:在后台创建并运行服务容器,自动拉取镜像
  • docker-compose stop:停止正在运行的容器
  • docekr-compose start:再次启动容器
  • docker-compose down:停止和删除容器、网络、卷、镜像。
  • docker-compose logs:查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。

Docker私有仓库

docker-compose.yml

[root@localhost docker-registry]# vi docker-compose.yml 

version: '3'
services:
  registry:
    image: registry
    container_name: docker-registry
    privileged: true
    restart: always
    ports:
      - "5000:5000"
    environment:
      - REGISTRY_AUTH=htpasswd
      - REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm
      - REGISTRY_AUTH_HTPASSWD_PATH=./auth/htpasswd
    volumes:
      - ./registry:/var/lib/registry
      - ./auth:/auth
  registry-ui:
    image: konradkleine/docker-registry-frontend:v2
    container_name: docker_registry_ui
    restart: always
    privileged: true
    environment:
      - ENV_DOCKER_REGISTRY_HOST=192.168.1.234
      - ENV_DOCKER_REGISTRY_PORT=5000
    ports:
      - "5001:80"

创建并启动容器

[root@localhost docker-registry]# docker-compose up -d
Creating network "docker-registry_default" with the default driver
Pulling registry (registry:)...
Trying to pull repository docker.io/library/registry ... 
latest: Pulling from docker.io/library/registry
486039affc0a: Pull complete
ba51a3b098e6: Pull complete
8bb4c43d6c8e: Pull complete
6f5f453e5f2d: Pull complete
42bc10b72f42: Pull complete
Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7
Status: Downloaded newer image for docker.io/registry:latest
Pulling registry-ui (konradkleine/docker-registry-frontend:v2)...
Trying to pull repository docker.io/konradkleine/docker-registry-frontend ... 
v2: Pulling from docker.io/konradkleine/docker-registry-frontend
...

管理界面

管理界面: http://192.168.1.234:5001/home
Docker、Docker compose实战_第11张图片
点击Browse repositories,提示需要用户名和密码。
Docker、Docker compose实战_第12张图片

配置管理员密码

进入auth目录,将用户名和密码写入htppasswd文件

[root@localhost auth]# docker run --entrypoint htpasswd registry -Bbn admin admin  >> /data/docker-registry/auth/htpasswd
[root@localhost auth]# cat htpasswd 
admin:$2y$05$eQQNyF7t11tllqgLcNcwZuu/lrjeCFpkys4FfA9HGrFhHGlPlgKnK

重启容器后再次尝试登录。

添加仓库地址

registry-mirrors:公共仓库。
insecure-registries:私有仓库。

[root@localhost docker]# vi /etc/docker/daemon.json 

{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"],
"insecure-registries":["192.168.1.234:5000"]
}

#重启服务
systemctl restart docker

私有仓库使用

登录
若报错:http: server gave HTTP response to HTTPS client时请检查本地docker的daemon.json中配置的私有仓库地址是否正确。

[root@localhost docker]# docker login 192.168.1.234:5000
Username: admin
Password: 
Login Succeeded

标记本地镜像
docker tag 镜像名 私有仓库IP:端口/镜像名:版本

[root@localhost docker]# docker tag hello-world 192.168.1.234:5000/hello-world

push images
docker push 私有仓库IP:端口/镜像名:版本

[root@localhost docker]# docker push 192.168.1.234:5000/hello-world
The push refers to a repository [192.168.1.234:5000/hello-world]
9c27e219663c: Pushed 
latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525

登录仓库管理页面,验证镜像push成功
Docker、Docker compose实战_第13张图片

你可能感兴趣的:(docker,docker-compose)