1. Docker

Docker 是一个开源的应用容器引擎

2. 安装

  1. yum install -y docker

3. 架构

17. Docker - 图1

4. Docker 镜像加速器

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://o7uzc3zp.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

5. Docker 命令

5.1. 服务

  1. systemctl start docker # 启动
  2. systemctl stop docker # 停止
  3. systemctl status docker #状态
  4. systemctl restart docker #重启
  5. systemctl enabled docker #开机自启

5.2. 镜像

  • 查看本地镜像
    1. docker images
  • 搜索镜像
    1. docker search 镜像名
  • 拉取镜像
    1. docker pull 镜像名:版本号 # 版本号默认为latest
  • 删除镜像
    1. docker rmi 镜像id # 也可以通过名称:版本号删除
  • 删除所有镜像
    1. docker rmi `docker images -q`

5.3. 容器

  • 创建容器并 运行参数run

    • -i 保持运行
    • -t 以终端模式运行并进入
    • -d 后台常驻模式
    • —name=xxx 此容器名称
    • 镜像名/id
    • /bin/bash 初始化命令
      1. docker run -it --name=redis redis /bin/bash #进入容器内部
      2. docker run -d --name=redis2 redis # 后台运行容器
  • 查询容器

    1. docker ps #查询正在运行的容器
    2. docker ps -a # 查看所有容器包括已停止的
  • 进入已经运行的容器内部
    1. docker exec -it 名称/id /bin/bash
  • 运行 停止容器
    1. docker stop 名称/id #停止容器
    2. docker start 名称/id #启动容器
  • 删除00容器
    1. docker rm 名称/id # 删除容器 先docker ps -a 查询
    2. docker rm `docker ps -aq` # 删除所有容器 慎用 正在运行的容器无法删除
  • 查看容器 配置信息
    1. docker inspect 名称/id
  • 修改配置信息
  1. systemctl stop docker
  2. cd /var/lib/docker/containers/docekr inspect查出的id
  3. vim config.v2.json
  4. systemctl restart docker
  • 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及即无tag的镜像 谨慎使用
    1. docker system prune
  • 查看docker自身磁盘使用情况
    1. docker system df

6. 容器数据卷

数据卷是宿主机中的一个目录或文件 称为挂载目录 一个数据卷可以被多个容器同时挂载

  • 创建启动容器时 使用 -v参数 设置数据集
    1. docker run -d -v 宿主机目录:容器内目录


目录必须为绝对路径 如果目录不存在则自动创建

7. 数据卷容器

多容器进行数据交换 之前我们通过多容器绑定宿主机的同目录

  1. 创建一个数据卷容器 单创建容器目录 作为数据卷容器
    1. docker run -it --name=c3 -v /volume redis /bin/bash
  1. 创建 c1 c2 容器 使用 —volume-from 参数 设置数据卷from c3数据卷容器中
    1. docker run -it --name=c1 --volume-from c3 redis /bin/bash
    2. docker run -it --name=c2 --volume-from c3 redis /bin/bash

8. 应用部署

8.1. MySQL

创建容器

  1. docker run -id \
  2. -p 3307:3306 \
  3. --name=my_mysql \
  4. -v $PWD/conf:/etc/mysql \
  5. -v $PWD/logs:/logs \
  6. -v $PWD/data:/var/lib/mysql \
  7. -e MYSQL_ROOT_PASSWORD=123456 \
  8. mysql:5.6

进入容器中

  1. docker exec -it my_mysql /bin/bash
  2. mysql -uroot -p123456

8.2. Tomcat

创建容器

  1. docker run -d \
  2. --name=my_tomcat \
  3. -p 8080:8080 \
  4. -v $PWD:/usr/local/tomcat/webapps \
  5. tomcat

8.3. Nginx

  1. docker run -id \
  2. --name=my_nginx \
  3. -p 80:80 \
  4. -v $PWD/html:/usr/share/nginx/html \
  5. nginx

8.4. Redis

  1. docker run -id --name=my_redis -p 6379:6379 redis

9. Docker 镜像

17. Docker - 图2

Docker镜像是由特殊的文件系统叠加而成

最底端是bootfs 并使用宿主机的bootfs

第二层是 root 文件系统 rootfs 称为 base image

17. Docker - 图3

9.1. 镜像制作

  1. 容器转为镜像 注意通过映射方式挂载的目录或文件 打包后并不会保存在镜像中
    1. docker commit 容器id 镜像名称:版本号
  1. 镜像转为压缩文件
    1. docker save -o 压缩名称.tar 镜像名称:版本号
  1. 从压缩文件中 加载镜像
    1. docker load -i 压缩名称.tar

9.2. Dockerfile

Dockerfile是一个文本文件 包含许多指令 每一条指令构建一层 基于基础镜像 最终构建出一个新的镜像

命令 说明 示例
FROM 基于这个Image开始 FROM nginx:latest
ENV 环境变量 ENV localfile /usr/local/nginx
RUN 新层中执行命令 RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME’
LABEL 设置metadata LABEL version=”1.0”
MAINTAINER 维护者 (deprecated) MAINTAINER ducafecat
EXPOSE 声明容器监听端口 EXPOSE 80 443
ADD 复制文件 ADD ./dist ${foo}/html
COPY 复制文件 COPY ./dist ${foo}/html
ENTRYPOINT 容器启动时执行指令 CMD [“ls”]
CMD 容器启动时执行指令默认值 CMD [“-la”]
VOLUME 挂载点 VOLUME [“/data”]
USER 指定操作用户 USER www
WORKDIR 设置工作目录 WORKDIR /path/to/workdir
ARG 设置参数 ARG user=www
ONBUILD 镜像被From时触发 ONBUILD RUN /bin/bash -c ‘echo ONBUILD …’
STOPSIGNAL 停止信号退出 STOPSIGNAL SIGTERM
HEALTHCHECK 检查容器的健康状况 HEALTHCHECK —interval=5m —timeout=3s CMD curl -f http://localhost/ exit 1
SHELL 覆盖默认shell SHELL [“powershell”, “-command”]

9.2.1. 通过官方centos 自定义

  1. 创建dockerfile文件
  1. FROM centos:7
  2. MAINTAINER Iekr <Iekr_wh@qq.com>
  3. RUN yum install -y vim
  4. WORKDIR /usr
  5. CMD /bin/bash
  1. 通过file文件build镜像
    1. # docker buid -f dockerfile文件 -t 镜像名称:版本号 .
    2. # 注意最后有一个 点
    3. docker build -f ./my_dockerfile -t my_centos:1 .
  1. 运行容器
    1. #docker run --name <容器名称> -d -p 8080:8080 <上一步构建的镜像名称>
    2. docker run --name test -d -p 8080:8080 my_centos:1

9.2.2. Spring Boot dockerfile

  1. FROM java:8
  2. MAINTAINER iekr iekr_wh@qq.com
  3. VOLUME /home/iekr
  4. ADD Schoolelectricity-1.0-SNAPSHOT.jar app.jar
  5. RUN bash -c 'touch /app.jar'
  6. ENTRYPOINT ["java","-Duser.timezone=GMT+8","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  1. docker build -t mystory .
  2. docker run -d -p 8080:8080 mystory

第二个方案

  1. docker run -id -p 8080:8080 openjdk:8-jre-alpine
  2. #添加时区
  3. apk add tzdata
  4. #下载好复制时区过去 就可以了
  5. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  1. nohup java -jar Schoolelectricity-1.0-SNAPSHOT.jar > /logs.log 2>&1 & #后台启动java

10. Docker Compose服务编排

微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,工作量会非常的大

Docker Compose是一个编排多容器分布式部署的工具 提供命令集管理容器化应用的完整开发周期,包括服务构建 启动 停止

  • 安装 Docker Compose
  1. curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose
  3. ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  4. docker-compose --version
  1. 创建 docker-compose.yml
    1. # yaml 配置实例
    2. version: '3'
    3. services:
    4. web: #自定义名称
    5. build: . # builddockerfile
    6. ports: #映射端口
    7. - "5000:5000"
    8. volumes: #映射目录
    9. - .:/code
    10. - logvolume01:/var/log
    11. links: #当前容器可以访问下面的容器
    12. - redis
    13. redis: # 第二个容器
    14. image: redis #容器名称
    15. volumes:
    16. logvolume01: {}
  1. 在当前目录 构建编写配置
    1. docker-compose up #启动配置
    2. docker-compose up -d # 后台启动

11. 私有仓库

服务端

  1. docker pull registry
  2. docker run -id --name=registry -p 5000:5000 registry
  3. #访问 http://192.168.130.124:5000/v2/_catalog 如果出现{"repositories":[]}则安装成功

客户端

  1. vim /etc/docker/daemon.json
  2. #添加为私有仓库服务端地址
  3. {"insecure-registries":["192.168.130.124:5000"]}
  4. #重启docker服务
  5. systemctl restart docker

上传前先给镜像打上标记

  1. #docker tag 镜像名:版本号 私有仓库地址/镜像名:版本号
  2. docker tag centos:7 192.168.130.124:5000/centos:7

上传

  1. docker push 192.168.130.124:5000/centos:7

从仓库拉取镜像

  1. docker pull 192.168.130.124:5000/centos:7

12. Docker Hub

登陆 输入账号和密码

  1. docker login

镜像改名 以自己 用户名/镜像名 改

  1. docker tag centos:7 iekr/centos:7
  2. docker push iekr/centos:7

13. docker容器与虚拟机比较

17. Docker - 图4

17. Docker - 图5

14. 本地镜像导出和导入

使用export 和 import 将容器镜像导出和导入操作

14.1. 导出

docker export 镜像id > 压缩文件名.tar

  1. docker export f299f501774c > hangger_server.tar

14.2. 导入

docker import - 自定义容器名称 < 镜像压缩文件.tar

  1. docker import - new_hangger_server < hangger_server.tar
  • export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
  • save 保存镜像所有的信息-包含历史
  • export 只导出当前的信息 只包含当前版本信息 无法回滚其他版本