Docker快速入门(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 本文主要在讲述docker的入门使用

[toc]

docker介绍与安装

介绍

Docker 是一个开源的应用容器引擎,你可以将其理解为一个轻量级的虚拟机,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。

docker的优势或者特点

1. 更高效的利用系统资源
2. 更快速的启动时间
3. 一致的运行环境
4. 持续交付和部署
5. 更轻松的迁移
6. 更轻松的维护和扩展

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟即
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Docker的主要用途,目前有三大类

1. 提供一次性的环境.比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境.
2. 提供弹性的云服务.因为 Docker 容器可以随开随关,很适合动态扩容和缩容.
3. 组建微服务架构.通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构.

docker的扩容与缩容

对于我们的系统来说在项目运行过程中会存在这最高峰值,和最低峰值;

整个项目运行过程中并不是一直是平稳的访问,对于这种时候如果说一次性就部署N个机器但是实际上只有在某几个时候有高峰期其余时间没有就会显得比较浪费,

这个时候如果说通过docker虚拟多个机器,然后通过多docker进行控制启动与停止实现扩容和缩容

1. 加速本地开发。通过Docker能够快速搭建好开发和运行环境,并且该环境可以直接传递
2. 给测试和产品部署。
3. 自动打包和部署应用。
4. 创建轻量、私有的PaaS环境。
5. 自动化测试和持续集成/部署。
6. 部署并扩展Web应用、数据库和后端服务器。
7. 创建安全沙盒

docker的应用范围

安装

本次安装的docker版本为docker-ce-18.03.1.ce,系统版本centos7

#1、更新update到最新的版本
yum update
#2、卸载老版本docker
yum remove docker docker-common docker-selinux docker-engine
#3、安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#4、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#5、查看docker版本
yum list docker-ce --showduplicates|sort -r
#6、安装docker
yum install docker-ce-18.03.1.ce -y
#7、启动docker
systemctl start docker
#8、加入开机自启
systemctl enable docker
#9、配置国内镜像
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://cr.console.aliyun.com/"]
}
#10、重启docker
systemctl start docker.service
#11.查询docker运行状态
ps -aux | grep docker

docker运行状态

docker常用的基本命令介绍

查询docker镜像信息

命令: docker images

运行结果:

名称 含义
REPOSITORY 镜像名称
TAG 镜像标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小

拉取镜像

命令 docker pull 镜像名(如:centos,ubuntu),例子:docker pull ubuntu

运行结果:

删除镜像

删除指定镜像

命令: docker rmi 镜像id(image id) 如: docker rmi ff0fea8310f3

运行结果:

强制删除指定镜像

命令: docker rmi -f 镜像id(image id) 如: docker rmi -f ff0fea8310f3

运行结果:

删除docker全部镜像

命令: docker rmi $(docker images -q)

运行结果:

运行镜像文件

命令 docker run --itd --name 容器名称,可以自定义(如:ubuntu_base) 镜像名:标签(如 ubuntu:latest)

docker run命令详解

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    --name="nginx-lb": 为容器指定一个名称;
    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    -h "mars": 指定容器的hostname;
    -e username="ritchie": 设置环境变量;
    --env-file=[]: 从指定文件读入环境变量;
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    -m :设置容器使用内存最大值;
    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    --link=[]: 添加链接到另一个容器;
    --expose=[]: 开放一个端口或一组端口;

运行结果

查询容器

命令: docker ps

docker ps命令详解

OPTIONS说明:
  -a :显示所有的容器,包括未运行的。
  -f :根据条件过滤显示的内容。
  --format :指定返回值的模板文件。
  -l :显示最近创建的容器。
  -n :列出最近创建的n个容器。
  --no-trunc :不截断输出。
  -q :静默模式,只显示容器编号。
  -s :显示总的文件大小。

运行结果

进入docker容器命令

命令:docker exec -it 容器名称(如:ubuntu_base) 执行类型,这个可以从docker ps容器列表中的COMMAND看到(bash/sh) 例子: docker exec -it ubuntu_base bash

OPTIONS说明:
  -d :分离模式: 在后台运行
  -i :即使没有附加也保持STDIN 打开
  -t :分配一个伪终端

运行结果:

容器的启动和关闭

启动命令: docker start 容器名称(如:ubuntu_base)

启动命令运行结果:

关闭命令: docker stop 容器名称(如:ubuntu_base)

关闭命令运行结果 :

删除容器(指定容器)

命令 : docker rm 容器名称(如:ubuntu_base)

运行结果

删除容器(全部容器)

命令 : docker rm $(docker ps -a -q)

导出容器

命令: docker export 容器名称(如:ubuntu_base) > 容器名称.tar 例子: docker export redis5 > redis5.tar

运行结果:

导入容器

命令 : docker import 容器文件(redis5.tar) redis5:v1

运行结果:

导出镜像

命令 : docker save 镜像名称(ubuntu) > 文件名.tar 例子 : docker save ubuntu > ubuntu_base.tar

运行结果 :

导入镜像

命令 : docker load < 文件名.tar 例子: docker load < ubuntu_base.tar

运行结果 :

save-load和import-export对比

类型 导出的对象 导出文件大小 是否可回滚到历史层
export & import 将容器导出
save & load 用来将一个或多个image打包

相对于文件大小来说,save方式导出的文件比export方式导出的文件大

正是因为save方式保存了镜像的历史和层(layer),使其可以层回滚,即回滚到之前的历史层,

所以save方式导出的文件稍微大一些反观export方式,在导出过程中丢失所有的历史,导致其不可以层回滚,导出的文件会小一些可以通过 docker history 镜像名看到层关系

登录docker hub

命令 : docker login

发布

发布镜像的前提是必须要登录

执行命令结果:

第一个dockerfile的文件创建

dockerfile介绍

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

dockerfile常用指令介绍

FROM 指定基础镜像

指定待扩展的父级镜像。除了注释外,在文件开头必须是一一个FROM指令, 接下来白指令便在这个父级镜像的环境中运行,直到遇到下一一个FROM指令。

通过添加多个FROM命令可以在同一个Dockerfile文件中创建多个镜像。

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。

就像我们之前运行了一个redis镜像的容器,再进行修改一样,基础镜像是必须指定的。

而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;

如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如ubuntu 、 debian 、 centos、 alpine 等这些操作系统的软件库

一般会以alpine为主,因为节约的资源比较少

RUN 执行命令

RUN 指令是用来执行命令行命令的。

格式:

RUN \<command\> (类似/bin/sh -cshell格式)
RUN ["executable", "param1", "param2"] (exec格式)

类似shell脚本风格的:

FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
RUN mkdir -p /usr/src/redis
RUN cd /usr/src/redis
RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install

MAINTAINER

用来声明创建的镜像的作者信息。在上述代码中,xxh是用户名,xxh@qq.co .是邮箱。这个命令并不是必需的。

EXPOSE

用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。

运行容器通过参数-p(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器或主机就可以通过映射后的端口与此容器通信。

同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。

ADD

向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件, 也可以是一个文件夹

ENV

设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量

编写dockerfile注意事项

注:Dockerfile 中每一个指令都会建立一层, RUN 也不例外。

每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,

执行结束后, commit这一层的修改,构成新的镜像。

使用 Dockerfile 定制镜像而上面的这种写法,创建了很多层镜像。

这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。

结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。

这是很多初学Docker 的人常犯的一个错误。Union FS是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。

第一个dockerfile文件(构建redis5)

构建redis5-docker前的软件准备,如下图所示

dockerfile文件

#设置镜像
FROM centos:centos7
#复制文件
COPY ./Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
#更新镜像源
RUN yum clean all && yum makecache && yum -y update
#创建redis用户组和用户
RUN groupadd -r redis && useradd -r -g redis redis
#安装redis前环境准备
RUN yum -y install epel-release wget gcc automake autoconf libtool make gcc gcc-c++
#创建data目录和新文件
RUN mkdir /data && touch /data/redis-5.0.7.tar.gz
#共享data文件夹
VOLUME /data
#复制redis5的压缩包
COPY ./redis-5.0.7.tar.gz /data/redis-5.0.7.tar.gz
#解压redis5
RUN tar -zxvf /data/redis-5.0.7.tar.gz 
#进入解压好的redis5并编译
RUN cd /redis-5.0.7 && make && make PREFIX=/data/redis-5.0.7 install
#开放端口
EXPOSE 6379

构建命令: docker build -t 镜像名称,可以自定义(redis5) .

执行结果

构建redis6镜像(dockerfile文件),未执行过,需要尝试

FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y && yum install epel-release -y
RUN yum install wget -y && yum -y install bzip2
RUN wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.gz
RUN mkdir -p /usr/src/gcc
RUN tar -xvf gcc-7.1.0.tar.gz -C /usr/src/gcc
RUN cd /usr/src/gcc/gcc-7.1.0 && ./contrib/download_prerequisites
RUN mkdir /usr/src/gcc/gcc-7.1.0/build
RUN cd /usr/src/gcc/gcc-7.1.0/build && ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
RUN cd /usr/src/gcc/gcc-7.1.0/build && make && make install
RUN wget https://github.com/antirez/redis/archive/6.0-rc2.tar.gz
RUN mkdir -p /usr/src/redis
RUN tar -zxvf 6.0-rc2.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-6.0-rc2/ && CC=/usr/local/bin/gcc make && make install

docker的镜像结构

镜像

Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。

例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Mysql或用户需要的其它应用程序。

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统被称为UnionFS。 镜像可以基于Dockerfile构建,Dockerfile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。

Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

容器

Docker利用容器来运行应用。

Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机, 可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库

如果你使用过git和github就很容易理解Docker的仓库概念。Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

Docker仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register) 来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。 Docker运行中使用的默认仓库是Docker Hub公共仓库。

仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

镜像结构

如下图展示了Docker镜像的系统结构。镜像的最底层必须是一个称为启动文件系统( bootfs )的镜像,用户不会与这一层直接打交道。bootfs的上层镜像叫作根镜像 ( rootfs ),它在通常情况下是一个操作系统,如Ubuntu、 Debian 和CentOS等。

用户的镜像必须构建于根镜像之上。

图中所示的镜像1是通过在根镜像ubuntu上安装 MySQL来创建的。

在镜像1的基础上再安装一个redis,就又创建了镜像2。

利用镜像2启动的容器里面运行的是一个已 经安装好了MySQL和Nginx的centos系统。

参考资料

  1. docker入门到实践
相关文章
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
87 5
|
1月前
|
Linux 持续交付 Docker
掌握Docker:从入门到实践
Docker 是一个开源容器引擎,允许开发者将应用及其依赖打包成可移植的容器,在任意 Linux 机器上运行。本文从基本概念入手,详细介绍 Docker 的安装、基本操作、镜像构建及 Docker Compose 的使用,并通过实战案例展示如何部署 Web 应用、构建微服务架构及实现 CI/CD。通过学习,你将掌握 Docker 的核心功能,提升应用开发和部署效率。
|
7天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
15天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
21天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
57 2
|
28天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
42 3
|
1月前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
46 2
|
1月前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
1月前
|
Kubernetes Cloud Native Docker
云原生入门:Kubernetes和Docker的协同之旅
【10月更文挑战第4天】在这篇文章中,我们将通过一次虚拟的旅行来探索云原生技术的核心——Kubernetes和Docker。就像乘坐一艘由Docker驱动的小船启航,随着波浪(代码示例)起伏,最终抵达由Kubernetes指挥的宏伟舰队。这不仅是一段技术上的旅程,也是理解现代云架构如何支撑数字世界的冒险。让我们扬帆起航,一探究竟!
下一篇
无影云桌面