当前位置:   article > 正文

Docker容器

docker容器

什么是 Docker?为什么会有 Docker?Docker 的优势?

  1. 为什么会有 Docker?

我们知道一款产品从开发到上线,从开发环境到生成环境。作为开发和运维人员之间协作需要考虑很多问题,尤其是当我们的产品多版本迭代之后,不同环境之间的兼容就会成为一个大问题;
这时 Docker 的出现就解决了这一难题,Docker 的出现使我们开发的软件可以“带环境安装”,即安装的时候,可以把原始环境一模一样的的复制过来,不用在担心环境不一致导致“开发时可以正常运行,生成环境就会出问题”,“在我的机器上可以正常运行,在别人的机器上就不能运行”的问题了

  1. 什么是 Docker?

Docker 就像是一个轻量级的虚拟机,Docker是一个轻量级的容器,我们可以将环境交给 Docker 来管理,当我们需要移植我们的产品的时候,就可以将环境整个的迁移到另一台主机上,而不向虚拟机一样,迁移一台虚拟机极其资源;

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

总之:Docker相较于虚拟机来说具有更加轻量,启动更快,效率更高,可移植性更强等优势,实现了“一次封装,到处运行”,不用在关心环境的不一致问题

  1. Docker 优势?

运行环境的一致性:Docker 的镜像提供了除了内核之外完整的运行环境,确保了应用运行的一致性;
更快速地启动部署:可以做到秒级,甚至毫秒级的的启动时间。大大节约了开发、测试、部署的时间;
更好的隔离性:每个服务器都是独立运行的、完全隔离的。避免公用的服务器,资源会容易受到其他用户的影响;
弹性伸缩、快速扩展:能够更好的处理集中爆发式的服务器使用压力;
迁移更加方便:“带环境安装”;
持续交付和部署:使用 Docker 可以通过定制镜像来实现持续集成,交付,部署;


Docker 的组成?

​Docker 是一个 C/S 架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。

在这里插入图片描述在这里插入图片描述

  1. 镜像:类似虚拟机镜像 , 是一个特殊的文件系统
    操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。
    Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  2. 容器:类似linux系统环境,运行和隔离应用。是镜像运行时的实体
    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
  3. 仓库:集中存放镜像文件的地方。
    镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中存储、分发镜像的地方,比如后面我们要学的,Docker Registry就是这样的服务。

Docker 的安装(CentOS7)?

ubuntu 安装 docker 看这篇:Ubuntu下安装docker和docker-compose
CentOS7 自动安装 docker 看这篇:CentOS下安装docker和docker-compose
以下是 docker 手动安装:

Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。​ 由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。

注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多补丁不支持更新。

  1. 确定你是不是 CentOS7及以上的版本:cat /etc/redhat-release
  2. yum 安装 gcc
    检查是否安装了gcc、g++:gcc -vg++ -v
    安装gcc、g++:yum -y install gccyum -y install gcc-c++
  3. 安装需要的软件包:yum install -y yum-utils device-mapper-persistent-data lvm2
  4. 设置镜像仓库
    推荐阿里云:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. 更新 yum 软件包索引:yum makecache fast
  6. 安装 docker-ce(社区版),企业版收费:yum -y install docker-ce
  7. 启动 docker
    手动启动:systemctl start docker
    开机自启:systemctl enable docker
  8. 测试
    检查版本:docker version
    下载运行HelloWorld:docker run hello-world
  9. 配置镜像加速:推荐阿里云
    mkdir -p /etc/docker
    vim /etc/docker/daemon.json

{
“registry-mirrors”: [“https://8y2y8njn.mirror.aliyuncs.com”]
}

重新记载daemon,重启docker
systemctl daemon-reload
systemctl restart docker

  1. 卸载
    systemctl stop docker
    yum -y remove docker-ce
    rm -rf /var/lib/docker

常用的镜像加速器地址:

  1. 官方镜像:https://registry.docker-cn.com
  2. 网易镜像:http://hub-mirror.c.163.com
  3. 清华大学:https://mirrors.tuna.tsinghua.edu.cn/
  4. 搜狐镜像:http://mirrors.sohu.com/
  5. 阿里镜像:阿里镜像需要登录阿里云控制台获取,每个账号有唯一镜像加速地址。在控制台—>镜像容器服务---->镜像中心:镜像加速服务 下获取。

Docker 的常用命令?

Docker Hub 类似与 Maven 仓库,是 Docker 的远程仓库
国内的 Docker 网站 https://www.docker.com

1.启动与停止命令

命令解释
systemctl start docker启动 Docker
systemctl stop docker停止docker
systemctl restart docker查看docker状态
systemctl status docker开机启动
systemctl enable docker开机启动
docker info查看docker概要信息
docker --help查看docker帮助文档

2.镜像相关命令

命令解释
docker images查看本地存在的镜像
这些镜像都存储在 Docker 的 /var/lib/docker目录下
docker search 镜像名称从网络中查找需要的镜像
docker pull 镜像名称将远程镜像拉取到本地
docker rmi [-f] 镜像ID(强制)删除本地镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG删除多个镜像
docker rmi -f $(docker images -qa)删除所有镜像

使用:
docker images
在这里插入图片描述
docker search 镜像名字
在这里插入图片描述docker pull 镜像名字
在这里插入图片描述

3.容器相关命令

1. 查看容器

命令解释
docker ps查看正在运行的容器
docker ps -a查看所有容器
docker ps -l查看最后一次运行的容器
docker ps -f status=exited查看停止的容器

2. 创建与启动容器

docker run

-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
–name:为创建的容器命名。

2.1.以交互的方式创建容器

以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。可以理解成交互式容器是前台容器。

docker run -it --name=容器名称 镜像名称:标签 /bin/bash

比如:docker run -it --name=mycentos centos:7 /bin/bash
docker run:表示创建容器
-it:表示运行容器并进入它的命令行
–name=mycentos:给当前的容器命名
centos:7:使用该镜像创建
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

在这里插入图片描述2.2.创建后台容器

创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。

创建守护式容器:docker run -id --name=容器名字 centos:7
登录守护式容器:docker exec -it 容器名称 (或者容器ID) /bin/bash

在这里插入图片描述
2.3.停止与启动容器
docker stop 容器名称(或者容器ID)
docker start 容器名称(或者容器ID)
在这里插入图片描述

3. 文件拷贝

将宿主机的文件拷贝的容器的指定目录下
宿主机向容器拷贝:docker cp 需要拷贝的文件或目录 容器名称:容器目录
容器向宿主机拷贝:docker cp 容器名称:容器目录 需要拷贝的文件或目录
例如: docker cp /opt/tomcat8080/conf/web.xml mycentos7_2:/usr/local/

在这里插入图片描述

4. 目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器并挂载:docker run -id --name=mycentos1 -v 宿主机的目录:容器的目录 centos:7

创建容器并挂载 linux 中的 /usr/local/myhtml 到,容器的 /usr/local/myhtml 目录
docker run -id --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7
在这里插入图片描述如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数
--privileged=true 来解决挂载的目录没有权限的问题
docker run -id --privileged=true --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7

5. 查看容器 IP 地址

我们可以通过 docker inspect 容器名称 来查看容器运行时的各种数据

当然我们也可以通过 docker inspect --format='{{属性的键}}' 容器名称 来查看单独某个属性

例如我们单独查看 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos1

在这里插入图片描述

6. 删除容器

docker rm 容器名称

当我们在删除一个正在运行的容器时,会报错;需要先关闭这个容器才可删除

当然我们也可以用 docker rm -f 容器名称 来强制删除一个容器


Docker 的应用容器部署

我们不能直接访问在 Docker 上部署的应用(包括 MySQL),如果我们想要访问我们部署在 Docker 上的应用,那么我们只需要访问 Docker 上部署的应用在宿主机上的映射端口即可,例如:我们在 Docker 上部署了一个 MySQL应用(3306),在宿主机上的映射端口为 33306,我们只需要访问 33306 端口,即可访问 Docker 上的 MySQL;

1.MySQL 部署

在这里插入图片描述

  1. 拉取镜像
    docker pull centos/mysql-57-centos7

  2. 创建容器
    docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7

选项解释
-p 宿主机端口:容器端口指定端口映射
-e …传递环境变量,这里表示 MySQL 的密码为 123456,账户默认为 root
  1. 远程链接 MySQL
    在这里插入图片描述

2.Tomcat 部署

  1. 拉取镜像
    docker pull tomcat:7-jre7

  2. 创建容器
    docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

  3. 找一个 web 项目,部署到宿主机的 /usr/local/webapps 目录下,然后进入 docker 容器查看项目有没有成功部署,最后在浏览器中测试看看能不能成功访问

在这里插入图片描述输入默认的用户名之后,我们成功登录,说明项目已经部署成功了

在这里插入图片描述

3.Nginx 部署

  1. 拉取镜像
    docker pull nginx

  2. 创建 Nginx 容器
    docker run -di --name=mynginx -p 80:80 nginx

  3. 测试

在这里插入图片描述

4.Redis 部署

  1. 拉取镜像
    docker pull redis

  2. 创建容器
    docker run -di --name=myredis -p 6379:6379 redis

  3. 用 redis 客户端工具链接测试

在这里插入图片描述


迁移与备份

保存容器为镜像:docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i

保存镜像为 tar 文件:docker save –o tar文件名 镜像名
docker save -o mynginx.tar mynginx_i

加载 tar 文件为镜像:docker load -i tar文件名
docker load -i mynginx.tar


Dockerfile 制作镜像

前面已经知道了,想要获得一个镜像可以从 Docker 中心仓库拉取,但是如果我们想要自己制作一个镜像,这时就需要 Dockerfile 了;

Docker 实际上就是一个文本文件,我们可以在这个文本文件里输入一些命令或参数,来定制我们需要的镜像,之后 Docker 可以通过读取 Dockerfile 文件的描述来构建镜像;

  1. 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  2. 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
  3. 对于运维人员:在部署时,可以实现应用的无缝移植。

Dockerfile 常用的命令:

命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条)
RUN 后面输入 linux 命令
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录(进入容器之后默认的工作路径)

下面我们以创建一个具有 jdk1.8 的 centos7 系统为例制作一个镜像

  1. 创建目录
    mkdir –p /usr/local/dockerjdk8

  2. 下载 jdk-8u144-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录

在这里插入图片描述

  1. 创建 Dockerfile 文件(名字固定为Dockerfile)

#依赖的镜像的名称和版本
FROM centos:7
#指定镜像创建者信息
MAINTAINER ayi
#设置工作目录,进入容器之后默认的工作目录,即进入 centos7 应用容器之后默认的工作目录为 /usr
WORKDIR /usr
#RUN yum install -y glibc.i686 制作完镜像之后,用镜像安装的centos7可能会有问题,缺少 glibc.i686,所以这里我们可以安装一下,也可以稍后安装
#RUN 后面是我们在构建镜像时需要执行的命令,下面是创建一个文件夹
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

  1. 执行命令构建镜像
    docker build -t='jdk1.8' .
    注意:这里的 . 不要拉下了,“.” 的意思是指定相对目录为当前目录
    -t:指定构建的镜像的名称

在这里插入图片描述

  1. 查看镜像是否构建成功
    docker images

在这里插入图片描述

  1. 最后,运行容器进行测试

在这里插入图片描述执行 java -version 发现报错,那么我们需要安装一下 glibc
yum install -y glibc.i686
在这里插入图片描述安装完成之后,就可以了
在这里插入图片描述


Docker 私有仓库

Docker 中心仓库中维护着私有仓库的镜像,我们需要将其拉取下来,才能搭建我们自己的私有仓库

  1. 拉取私有仓库
    docker pull registry

  2. 启动私有仓库容器
    docker run -di --name=registry -p 5000:5000 registry

  3. 这里我们就可以访问我们的私有仓库了
    http://192.168.211.144:5000/v2/_catalog,IP 改为你们自己的宿主机 IP 即可

  4. 修改 daemon.json,
    Docker 默认我们的私有仓库是不安全的,所以我们要配置一下,就和之前配置镜像加速一样
    vi /etc/docker/daemon.json
    "insecure-registries":["192.168.211.144:5000"] IP,改为你们自己的宿主机 IP

  5. 重启docker 服务
    systemctl restart docker

成功访问私有仓库

将镜像上传到私有仓库

  1. 先将镜像标记为私有仓库的镜像

docker tag 自己的镜像名称 宿主机IP:私有服务容器的端口/jdk1.8
docker tag jdk1.8 192.168.17.132:5000/jdk1.8
5000:是我们之前创建 registry 的时候映射的端口,是宿主机的端口

在这里插入图片描述

  1. 再次启动私服容器
    docker start registry

  2. 上传标记的镜像
    docker push 192.168.211.144:5000/jdk1.8

在这里插入图片描述

从私有仓库拉取镜像

docker pull 192.168.211.144:5000/jdk1.8

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/215085
推荐阅读
相关标签
  

闽ICP备14008679号