Fork me on GitHub

虚拟容器化学习----Docker学习

安装前准备

  • yum install -y yum-utils device-mapper-persistent-data lvm2 安装数据存储驱动包 , 安装yum工具
  • yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 设置安装源
  • yum makecache fast yum自动检测最快安装源

安装

yum -y install docker-ce 安装docker开源社区版本

service docker start 启动docker服务

检测

docker version 查看版本信息

docker pull hello-world 下载docker hello-word

docker run hello-world

更换阿里云的镜像加速

  1. 登录阿里云
  2. 搜索镜像加速器
  3. 根据相关操作文档操作即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [加速器地址]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker是什么

Docker 是一种CS架构的软件, Docker 是提供应用打包,部署于运行引用的容器平台

docker 引擎包裹:

  1. docker 引擎
  2. docker REST API
  3. docker CLI

Docker 使用了HTTP 协议,docker的兼容于拓展很好

docker 结构

  • 客户端:docker CLI
  • 通信层:REST API
  • 引擎:docker daemon

容器与镜像

镜像: 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的集装箱

容器: 镜像的实例,由Docker负责创建,容器之间彼此隔离

docker 容器与镜像在宿主机上的安装路径 /var/lib/docker 除非特殊需要,一般不建议修改默认安装地址

Docker 常用命令

  • docker pull 镜像名<:tags> - 从远程仓库抽取镜像
    • tags:指定版本类型
  • docker images - 查看本地镜像
  • docker run 镜像名 <:tags> - 创建容器,启动应用
    • 如果在运行run的时候,镜像在没有pull到本地的话docker会先去pull latest 版本的镜像 latest 版本为使用最多的版本
    • tags:指定版本类型
  • docker ps - 查看正在运行中的镜像
  • docker rm <-f> 容器id - 删除容器
    • 如果容器在运行的情况下 <-f> 强制删除
  • docker rmi <-f> 镜像名<:tags> - 删除镜像
    • 如果镜像存在且有容器在运行的情况下 <-f> 强制删除
    • tags:指定版本类型
  • docker stop 容器id - 停止容器
  • docker exec [-it ] 容器id linux 命令...[bash || /bin/bash]
    • exec 在容器内部执行命令
    • -it 使用交互的方式执行命令

PS

  • hub.docker.com docker 远程中央仓库

  • 在开发中可以使用 -f 强制移除,但是在开发环境中不能这么做,-f 相当于强制关机。

  • docker hub 一般有图片或者镜像名为需要的软件名一般是官方提供的。其他的通常是有第三方或个人提供的。第三方的一般不推荐,除非你对它非常了解

Docker 宿主机与容器通信

docker run -p 宿主机端口:容器内部端口 -d 容器名

  • -p 端口映射
  • -d 后台运行

查看

容器生命周期

DockerFile 构建镜像

什么是Dockerfile

  • DockerFile 是一个包含用于组合镜像的命令的文本文档
  • Docker通过读取Dockerfile中的指定命令按步自动生成镜像
  • docker build -t 机构/镜像名<:tags> Dockerfile 目录

Docker 的分层(Docker layer)

docker file 在构建的过程中,每一步都会创建一个临时容器,这个临时容器是只读的,好处:临时容器在使用的时候的好处在于可以共用。

列如

  1. 构建一个普通的Dockerfile

  2. 对Dockerfile重新进行编辑

修改完之后重新build,之后输出如下

它使用了缓存,这里看到没有使用缓存的是由输出的。使用缓存的是没有输出的

Dockerfile 基础命令

  • FROM 容器版本 基于基准镜像

    • 尽量使用官方提供的BASE Image
    • FROM scratch 不依赖任何基准镜像
  • MAINTAINER 作者 没有运行含义,只是说明名作者

  • LABEL XXX="XXX" 描述性信息

  • WORKDIR 容器目录 切换工作目录 , 如果当前目录不存在的时候,会自动创建这个目录

    • 这个目录是通过我们的docker exec -it 进程号 bash 进入来的

  • 尽量使用绝对路径

  • ADD 宿主机目录 容器目录 将宿主机的目录全部复制到容器目录中

    • ADD xxx.gz / 添加根目录并解压缩
    • ADD 除了复制,还具备添加远程文件功能
  • ENV XXX /XXX/XXX 设置环境常量

    • ENV JAVA_HOME /usr/local/openjdk8
    • RUN ${JAVA_HOME}/bin/java -jar XXX.jar
    • 尽量使用环境常量,可提高程序的维护性
  • RUN&&CMD&&ENTRYPOINT

    • RUN 在构建镜像时执行命令(修改镜像内部的文件)
    • CMD|ENTRYPOINT 在容器创建时执行命令(对容器中的文件进行操作)

RUN 构建时运行

  • 命令格式 RUN yum install -y vim # Shell
  • 命令格式 RUN ["yum","install","-y","vim"] #Exec
    • 在分不清的情况下推荐使用

Shell 运行方式

  1. 使用Shell执行时,当前shell 时父进程,生成一个子shell进程
  2. 在子shell中执行脚本,脚本执行完毕,退出子shell进程,回到当前shell

Exec 运行方式

  1. 使用Exec方式,会用Exec进程替换当前进程,并保持PID不变
  2. 执行完毕,直接退出,并不会退回之前的进程环境

ENTRYPOINT 启动命令

  • ENTRYPOINT (入口点) 用于在容器启动时执行命令
  • Dockerfile中只有最后一个ENTRYPOINT会被执行
  • 推荐使用Exec格式

CMD 默认命令

  • CMD 用于设置默认执行的命令
    • 如Dockerfile中出现多个CMD,则只有最后一个被执行
    • 如容器启动时附加指令,则CMD被忽略
    • 推荐使用Exec命令格式
    • 若容器启动时有其他的参数,CMD 将不会执行

当我们使用下面这种情况启动容器时CMD将不会被执行,这里可以配合ENTRYPOINT一起使用。

Dockerfile 使用例子

使用Dockerfile 构建redis

FROM centos
# 安装C编译组件
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]
  • 构建镜像

docker build -t xxx/xxx:1.0 .

  • 启动容器

docker run -p 7000:6379 xxx/xxx:1.0

容器间的单向访问

docker 内部每个容器都会有一个虚拟ip

docker inspect id 显示容器的原数据

ip放再netSetting中。

在容器间通信的时候不能使用ip进行通信,这个虚拟ip会变动的。

这时我们可以通过对容器取个名字

docker run -d --name xxx 镜像

在没有配置的情况下,ip默认时互通的,但是别名时无法访问得

若要能使用别名访问需要在启动的时候添加额外的参数

docker run -d --name xxx --link 别名 镜像名

Bridge 网桥双向通信

docker 环境下的网桥能够直接链接到宿主机的物理网卡上,配置了网桥后,容器内部可以直接访问到公网上的数据了。

网桥还可以实现docker容器网络上的分组,只要绑定在同一个网桥上,这是容器在网络层面进行了分组。在同一个网桥上,天然互通。

  • docker network ls :列出docker网络服务
  • docker network create -d bridge 网桥名称 创建网桥
  • docker network connect 网桥名称 容器名称 容器与网桥绑定

Volume 容器间数据共享

在宿主机上开个空间,所有容器可以读取这个空间上的文件

  1. 通过设置-v挂在宿主机目录

    docker run --name 容器名 —v 宿主机路径:容器内挂在路径 镜像名

  2. 通过--volumes-from 共享容器内挂载点

    1. 创建共享容器docker create --name 共享容器名 -v /xx/xx:/xx/xx 镜镜像名 /bin/true
    2. 共享容器挂载点 docker run --volumes-from 共享容器名 --name xxx -d 镜像名

DockerCompose容器编排

docker 官方为我们提供的容器编排工具时docker compose

我们可以使用docker compose对一组容器进行编排,让他们有顺序的创建。有顺序的启动。

  • Docker Compose 单机多容器部署工具
  • 通过yml文件定义多容器如何部署
  • WIN/MAC 默认提供Docker Compose, Linux 需要安装

安装

由于是github 所以下载会比较慢

https://docs.docker.com/compose/install/

安装后若出现

Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/doc

这种情况的问题则是版本不对,需要去官网下载对应版本的docker-compose然后手动替换掉

docker-compose官网:https://github.com/docker/compose/releases/

/usr/local/bin/ 路径下的docker-compose 删除

重新上传正确版本的docker-compose

授权chmod +x /usr/local/bin/docker-compose

因为正式环境下使用的比较少,一般不使用这个,所以这里我不打算研究了

posted @ 2020-07-27 16:39  Banana_Fish  阅读(302)  评论(0编辑  收藏  举报