zoukankan      html  css  js  c++  java
  • Docker入门

    作者:cao.dingzheng; cai.ruiying [ZSK]

    1     初识Docker

    1.1  是什么?

             Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口,它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就像在真实的物理机上运行一样。这样一来,就不用担心环境问题。

    1.2  为什么使用它?

           为什么要使用Docker呢?我们来看看它的几大优势。第一,快速交付和部署,解决环境配置难题;第二,高效虚拟化,内核级的虚拟化,使得它占用资源少、启动快、体积小,能够带来更高的性能和使用效率;第三,灵活应用,它几乎可以在任意的平台上运行,包括物理机、虚拟机、云服务器等,因此它的迁移、扩展更轻松;第四,简单易用,它的修改以增量的方式被分发和更新,从而实现自动化并且高效的管理。

           下面我们对比一下Docker与常用的Linux虚拟机的关键点,就可以一目了然的了解到Docker的优势。

    1.3  Docker VS VM

           VM(Virtual Machine,虚拟机)是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。       

             Docker只包含应用程序以及依赖库,基于libcontainer运行在宿主机上(libcontainer 是Docker中用于容器管理的包),并处于隔离环境,因此Docker更加轻量高效,

             至此,我们可以了解到,我们可以把Docker当作轻量级的虚拟机,它同样能够能够提供虚拟化的环境,但是成本却小得多,一台主机上可以同时运行数千个 Docker 容器。       当然,它目前仍然存在不足,例如:隔离效果不如VM;网络配置功能相对简单,主要以桥接方式为主等。通过这些了解,我们可以根据自己的需要,选择使用。

    2     安装与使用

           (备注:本文以CentOS为例。)

    2.1  安装

           Docker支持CentOS及以上64位版本,我们根据自己Linux机器的具体版本,来选择安装。

    (1) 查看Linux版本

    命令:uname -r

     

     解析:

    (2)    查询可安装版本

    命令:yum list docker-ce  --showduplicates | sort -r

     

    (3)    安装

    命令:yum install docker-ce-<版本号> docker-ce-cli-<版本号> containerd.io

    例如:yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io

    注意:这里的版本,要从我们刚才查询到的列表中选择。

    2.2  使用

    (1)    启动

    命令:systemctl start docker

    (2)    验证

    命令:docker --help,或者:docker run hello-world

    (3)    在容器内运行一个应用程序

    命令:docker run ubuntu:15.10 /bin/echo "Hello world"

    解析:

           ubuntu:15.10 格式是docker镜像名称:tag标签,指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

           以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

           运行效果如下:

     

    2.3  运行交互式容器

    2.3.1   前台模式

    命令:docker run -i -t ubuntu:15.10 /bin/bash

    参数解释:

           -i: 交互式操作。

           -t: 终端

           /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

     

    2.3.2   后台模式

    (1)    启动

    命令:docker run -it -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

    参数解释:

           -d:后台运行

    在输出中,我们没有看到期望的 "hello world",而是一串长字符:0ecf61b8208b8d87bce7f6472e4c934b3001ec825457a2c43221dd84ec38fb58

     

           这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。

           首先,我们需要确认容器有在运行,可以查看进行:docker ps

     

    解析:

    CONTAINER ID: 容器 ID。

    IMAGE: 使用的镜像。

    COMMAND: 启动容器时运行的命令。

    CREATED: 容器的创建时间。

    STATUS: 容器状态。

    PORTS: 容器的端口信息和使用的连接类型(tcpudp)。

    NAMES: 自动分配的容器名称。

    容器状态如下:

    (2)    查看运行日志

    在宿主主机内使用 docker logs 命令,查看容器内的标准输出:

    命令:docker logs ID号 或者docker logs 容器名称(NAMES)

      

    (3)    停止容器运行

    命令:docker kill ID号/容器名称(NAMES)或者docker stop ID号/容器名称(NAMES)

     

    2.4  常用命令

    2.4.1   查看所有的容器

    命令:docker ps -a

     

    2.4.2   启动已停止的容器

    命令:docker start ID号 或者docker start  容器名称(NAMES)或者docker restart ID号/容器名称(NAMES)来进行重启(已有容器)

     

    2.4.3   后台启动容器

    后台启动容器命令:docker run -itd --name centos7-test centos:centos7 /bin/bash

    参数解释:

    --name:为启动的容器命名

    在使用 -d 参数时,容器启动后会后台运行。

    2.4.4   进入后台运行的容器

    (1)    进入后台运行的容器:docker attach ID号或者names

    说明:退出容器终端会导致容器停止。

    (2)    进入后台运行的容器:docker exec -it ID号或者names /bin/bash

    说明:推荐大家使用 docker exec 命令,此命令进入容器后,退出容器终端时,不会导致容器的停止。

    2.4.5   退出容器

    命令:exit

    2.4.6   导出容器/镜像

    (1)    导出容器:docker export ID号或者names > 导出路径

    如:docker export 1e560fca3906 > ubuntu.tar

    docker export ubuntu-test > /home/qc/cdz/docker/ubuntu.tar

    (2)    导出镜像:

    docker save image > 路径

    如:docker save cdz/centos7.v2 > /home/qc/cdz/docker/centos/centos7.v2.tar

    2.4.7   导入镜像

    命令:cat /home/qc/cdz/docker/centos7.tar | docker import – cdz/ centos7.v1: centos7

    可以通过docker images查看镜像库

    2.4.8   删除容器

    命令:docker rm -f ID号或者names

    2.4.9   删除镜像

    命令:docker image rm -f IMAGE ID 或者RESPOSITORY:TAG

    3     实战演示-docker部署LuckyFrame服务端

    3.1  docker安装centOS

    访问 CentOS 镜像库地址:

    https://hub.docker.com/_/centos?tab=tags&page=1

    拉取指定版本的centOS镜像:docker pull centos:centos7

    运行容器:docker run -itd --name centos-test centos:centos7

    3.2  docker安装MySQL

    访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags

    运行MySQL:

    docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31

    参数说明:

    -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。

    MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。

    3.3  docker安装Python

    访问 Python 镜像库地址:

    https://hub.docker.com/_/python?tab=tags&page=5

    运行Python:

    docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld.py

    参数解释:

    -v $PWD/myapp:/usr/src/myapp: 将主机中当前目录下的 myapp 挂载到容器的 /usr/src/myapp。

    -w /usr/src/myapp: 指定容器的 /usr/src/myapp 目录为工作目录。

    python helloworld.py: 使用容器的 python 命令来执行工作目录中的 helloworld.py 文件。

    3.4  将本地文件拷贝到docker容器中

    命令:docker cp 拷贝文件 容器id/names:拷贝到的容器目录

    如:

    3.5  防火墙配置

    直接pull下载的centos7镜像存在防火墙未关闭无法访问的问题,这里提供解决方法。

    首先运行centos7镜像后进入容器。

    然后下载firewalld systemd:yum install firewalld systemd -y

    查看放火墙状态:systemctl status firewalld

    彻底关闭防火墙,两个命令均需执行:

    systemctl disable firewalld.service

    systemctl stop firewalld

    最后将运行的容器导出为tar包再导入到imags里,这时防火墙问题已经解决了。

    3.6  构建LuckyFrame平台服务端镜像

    3.6.1   创建Dockerfile

    (备注:这里LuckyFrame平台服务端运行需要java环境)

    首先将jdk的压缩包jdk-8u261-linux-x64.tar.gz、luckyframe的Web端LuckyFrameWeb.jar放到同一路径下,在该路径下建一个Dockerfile文件。

    如:

    # 拉取基本镜像
    FROM cdz/centos7.v2:centos7
    # 维护者信息
    MAINTAINER caodingzheng
    # 加载jdk安装包
    ADD jdk-8u261-linux-x64.tar.gz /usr/local
    # 环境变量设置
    ENV JAVA_HOME /usr/local/jdk1.8.0_261
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH $PATH:$JAVA_HOME/bin
    # 设置语言
    ENV LANG="en_US.UTF-8"
    # 导入jar包
    ADD LuckyFrameWeb.jar /LuckyFrameWeb.jar
    # 执行jar包
    ENTRYPOINT ["java","-jar","/LuckyFrameWeb.jar"]

    说明:

    这里不需要设置对外端口

    LuckyFrameWeb.jar已经是配置好的,包括数据库和端口,配置的端口号为8018。

    3.6.2   构建镜像

    使用docker build创建镜像,命令为:

    docker build -f Dockerfile -t 镜像名称:tag标签 .

    如:docker build -f luckyframeDockerfile -t luckyframe3.2:centos7 .

    注意:最后的“.”不要遗漏,这里表示当前路径。

    3.7  创建容器(运行LuckyFrame服务端)

    命令:docker run -itd --name luckyframe -p 8018:8018 luckyframe3.2:centos7 /bin/bash

    这样我们的LuckyFrameWeb.jar包就启动好了,我们可以通过设置的端口进行访问。

    访问地址:http://ip:port/login

    4     常见问题

    4.1  安装报错

    问题:

    Package: 3:docker-ce-18.09.9-3.el7.x86_64 (docker-ce-stable) Requires: container-selinux >= 2.9

    原因:

    container-selinux版本低或者是没安装。yum 安装container-selinux 一般的yum源又找不到这个包。需要安装epel源才能yum安装container-selinux。

    解决方法:

    直接用yum安装container-selinux可能会报错,可以进行如下步骤:

    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    yum install epel-release

    yum install container-selinux

    yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io

    这时docker镜像就完成了安装。

    4.2  直接pull下载的centos7镜像存在防火墙未关闭无法访问

    解决方法:

    首先运行centos7镜像后进入容器。

    然后下载firewalld systemd:yum install firewalld systemd -y

    查看放火墙状态:systemctl status firewalld

    彻底关闭防火墙,两个命令均需执行:

    systemctl disable firewalld.service

    systemctl stop firewalld

    最后将运行的容器导出为tar包再导入到imags里,这时防火墙问题已经解决了。

  • 相关阅读:
    alpha冲刺—Day5
    alpha冲刺—Day4
    alpha冲刺—Day3
    alpha冲刺—Day2
    alpha冲刺—Day1
    团队作业第五次—alpha冲刺博客汇总
    团队作业第四次—项目系统设计与数据库设计
    团队作业第三次—项目需求分析
    团队作业第二次—团队Github实战训练
    win10配置java环境变量,解决javac不是内部或外部命令等问题
  • 原文地址:https://www.cnblogs.com/ustcinfo-qc/p/13879258.html
Copyright © 2011-2022 走看看