Docker初识

Stella981
• 阅读 654

原文地址(欢迎访问):
https://www.jianshu.com/p/6a6eee0d9ea5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1. 学习步骤
  1. Docker简介
  2. Docker中的基本概念
  3. Docker安装
  4. 设置Docker
  5. Docker的应用操作
  6. Docker搭建PHP开发环境
2. Docker介绍

2.1. Docker 是什么

Docker是一个开源的应用容器引擎,基于Go 语言开发实现,属于操作系统层面的虚拟化技术。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何安装有Docker的电脑(windowsLinux)上。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhoneapp),更重要的是容器性能开销极低。

Docker初识

f703738da977391281957edbf0198618377ae2dd.jpg

2.2. Docker 能够做什么

Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于电脑资源要求过高而无法解决的问题。
虚拟机和Docker虚拟化的不同之处:

docker.jpg

2.3. 为什么使用 Docker

1、更快速的交付和部署:
对开发和运维员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
节约安装各种开发环境的软件的时间。
解决开发环境和生产环境不一致的问题。
2、更轻松的迁移和扩展:
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
3、更高的资源利用率:
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用容器即可。
总结:
Docker背后的想法是创建软件程序可移植的轻量级容器,让其可以在任何安装了Docker的机器上运行,并不用关心底层操作系统,就像野心勃勃的造船者们成功创建了集装箱而不需要考虑装在哪种船舶上一样。
只有一个共同目标:简化部署流程,提高生产力!

2.4. Docker 项目架构

Docker使用C/S架构,通过docker客户端连接到Docker服务器上从而管理Docker服务器里面的镜像和容器,类似于git的架构。

docker.jpg

2.5. Docker 的基本概念

2.5.1. 镜像( Image
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

2.5.2. 容器(Container
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
文件系统隔离技术使得Docker成为了一个非常有潜力的虚拟化技术。在容器中可以对文件进行修改、删除、创建。

2.5.3. 仓库(Registry
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

3. Windows 10 下安装 Docker

3.1. 系统要求

一、64bit Windows 10 Build 10586 以上专业版或者企业版本,电脑支持虚拟化。
二、开启Hyper-V。
三、win7、win8 等需要利用 docker toolbox 来安装。

3.1.1. 查看系统版本和版本号

查看系统信息:

docker.jpg

查看版本号:
win+R 输入 cmd 进入 dos 系统就可以看到

docker.jpg

3.1.2. 电脑支持虚拟化

对于windows10系统来说,你可以在 任务管理器->性能 中查看到你的电脑是否开启了虚拟化

docker.jpg

在BIOS下开启虚拟化虚拟化:

docker.jpg

3.1.3. 开启Hyper-V

windows设置 -> 应用 -> 应用和功能 -> 程序和功能 -> 启用和关闭Windows功能 -> 选中Hyber-V -> 重启
选中Hyper-V后确定重启电脑

docker.jpg

注意:Hyper-V 是与 VMware 是冲突的,两者不能并存,只能择其一,如果你必须要使用虚拟机的话,比如 Vagrant 之类的工具,亦可在虚拟机内运行一个 Linux 系统,然后根据 Linux 系统 的安装流程处理,在虚拟机内运行 Docker 作为开发环境。

3.2. 安装Docker for Windows
3.2.1. 下载Docker for Windows

https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

3.2.2. 安装

双击下载的Docker for Windows Installer.exe安装完毕即可。

3.2.3. 启动

启动之后会在电脑的右下角查看到docker的图标

docker.jpg

4. 简单使用 Docker

4.1. 使用Docker的前提

必须通过 dos命令 行来操作Docker。win+R 输入 cmd 进入 dos 系统

4.2. Docker命令初体验

docker info #查看docker信息
docker version #查看docker版本
docker run hello-world #运行第一个容器

5. 设置Docker

5.1. 切换到Linux容器下

docker for windows 默认使用linxu容器。如有需要可切换到win容器下。
右键点击docker图标:

docker.jpg

5.2. 镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 国内镜像加速。

5.2.1. 获取阿里云加速器地址

  1. 进入 http://dev.aliyun.com
  1. 登录阿里云进入后台

docker.jpg

5.2.2. 配置docker加速器

对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registry mirrors 一栏中填写加速器地址你的专属加速器地址,之后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。

docker.jpg

5.2.3. 检查加速器是否生效

手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。

docker.jpg

6. Docker 镜像操作

6.1. 获取镜像(下载镜像到本地)
Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。

Docker 镜像仓库获取镜像的命令是docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址 [:端口号] /] 镜像名 [:标签]

具体的选项可以通过 docker pull --help

Docker 镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是 Docker Hub,但我们已经将其修改为阿里云的加速器。

例如:

docker pull training/webapp
docker pull busybox
docker pull centos
备注:↓
training/webapp : pythonapp
busybox:是一个集成了三百多个最常用Linux命令和工具的软件,简化的Linux系统
centos: centos系统容器

6.2. 列出本地镜像

要想列出已经下载下来的镜像,可以使用 docker image ls 命令。

docker.jpg

列表包含了 镜像名、版本、镜像 ID、创建时间 以及所占用的空间。

6.3. 删除本地镜像

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:
docker image rm [选项] <镜像1> [<镜像2> ...]
备注:
用 ID、镜像名、摘要删除镜像
其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
我们可以用镜像的完整 ID,也称为 长 ID,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID 来删除镜像。docker image ls 默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。
例如:
docker image rm training/webapp

7. Docker 容器操作

7.1. 说在前面

/bin/bashlinux的命令行工具,类似于windowcmd进入dos系统

7.2. 查看容器

docker ps #查看启动的容器
docker ps -a #查看所有容器,包含没有启动的容器

7.3. 启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
COMMAND: 容器启动后进入容器中要执行的命令.
OPTIONS(常用选项)
-d:让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下
-t:选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i:则让容器的标准输入保持打开。
--name:为容器命名
-v:创建数据卷
-p:绑定端口

7.3.1. 基于镜像新建一个容器并启动

docker run

例如:
docker run -p 8000:5000 –-name web training/webapp

实际操作举例:

启动pythonapptraining/webapp,并绑定本机端口8000映射到容器5000端口

docker.jpg

访问本机

docker.jpg

7.3.2. 后台运行

更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。
docker run -d CONTAINER [CONTAINER...]

例如:
docker run –d –p 8000:5000 training/webapp

7.3.3. 交互运行

启动一个 bash 终端,允许用户进行交互。
docker run -t -i CONTAINER [CONTAINER...] /bin/bash

-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的 标准输入 上
-i则让容器的 标准输入 保持打开。

在交互模式下,用户可以通过所创建的终端来输入linux命令
例如:

docker run -i -t centos /bin/bash
创建centos容器并且进入centos容器中

docker.jpg

7.4. 终止容器
docker stop CONTAINER [CONTAINER...]

例:

docker.jpg

7.5. 启动一个停止的容器
docker start CONTAINER [CONTAINER...]

例:

docker.jpg

7.6. 重启容器
docker restart CONTAINER [CONTAINER...]

例:

docker.jpg

7.7. 删除容器
docker rm CONTAINER [CONTAINER...]
注意:删除容器前 先关闭容器

例:

docker.jpg

7.8. 获取容器的输出信息
docker logs [OPTIONS] CONTAINER

options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

例:

docker.jpg

查看指定时间后的日志,只显示最后100行:

docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID

查看最近30分钟的日志:

docker logs --since 30m CONTAINER_ID

查看某时间之后的日志:

docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID

查看某时间段日志:

docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

7.9. 进入容器
docker exec –i –t CONTAINER /bin/bash

例:

docker.jpg

7.10. 主机和容器间拷贝文件
7.10.1. 容器拷贝到主机
docker cp CONTAINER:/opt/webapp/app.py d:/www

备注:
/opt/webapp/app.py: 容器中的文件
d:/www: 主机文件夹

例:

docker.jpg

docker.jpg

7.10.2. 主机拷贝到容器
docker cp f:/docker_test/文件 CONTAINER:/目标路径

例:

docker.jpg

docker.jpg

8. 数据卷

8.1. 什么是数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  1. 数据卷 可以在容器之间共享和重用
  2. 对 数据卷 的修改会立马生效
  3. 对 数据卷 的更新,不会影响镜像
  4. 数据卷 默认会一直存在,即使容器被删除

理解:
1.数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
2.相当于将容器中的目录 和 本机目录映射起来,在本机目录中修改代码,增加文件等,会实时反映在容器目录中

8.2. 为什么要使用数据卷

方便将本地主机中的代码运行在docker容器中

8.3. 挂载数据卷的前提

授权本地磁盘

docker.jpg

注意:点击Apply的时候,会验证本机账户,没有设置密码的话,去设置一个吧。

8.4. 挂载一个主机目录作为数据卷
docker run -d -P 8000:5000 --name web -v f:/docker:/opt/webapp training/webapp

9. Docker应用-搭建PHP开发环境

9.1. 下载阿里云的lamp镜像

docker pull registry.cn-hangzhou.aliyuncs.com/itsource/centos-lamp:[镜像版本号]
镜像版本号就是TAG的值

9.2. 创建lamp容器并且运行
docker run -itd -p 80:80 -p 3306:3306 --name lamp --privileged=true -v D:/www/default:/data/wwwroot/default ec258725b54b /usr/sbin/init

-i选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-t 则让容器的标准输入保持打开。
-d 则让容器在后台运行。
--name lamp为容器起名为lamp
--privileged=true 让container内的root拥有真正的root权限。
-v 创建数据卷,将本地主机目录挂着到容器的指定目录中

10. 制作阿里云镜像

10.1. 制作本地镜像
docker commit -a "itsource.com" -m "this is image" 容器ID 镜像名字:版本

OPTIONS说明:
· **-a :**提交的镜像作者;
· **-m :**提交时的说明文字;
· **-p :**在commit时,将容器暂停。

10.2. 上传阿里云

进入阿里云演示

10.3. 导出镜像到本地

docker save d2b9f203546d -o d:/www/centos-lamp-v2.tar

10.4. 加载本地镜像文件

docker load -i d:/www/centos-lamp-v2.tar

安装wget

yum install wget –y

备份yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

阿里云yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo [<u>http://mirrors.aliyun.com/repo/Centos-7.repo</u>](http://mirrors.aliyun.com/repo/Centos-7.repo)

解决bash: service: command not found

yum install initscripts.x86_64 –y

yum install net-tools

docker run -it -p 80:80 --name lamp2 --privileged=true itsource/centos-lamp /usr/sbin/init

docker run -itd -p 80:80 --name lamp3 --privileged=true -v /data/wwwroot/[www.baidu.com:/data/wwwroot/www.baidu.com](http://www.baidu.com:/data/wwwroot/www.baidu.com) itsource/centos-lamp /usr/sbin/init

docker rm $(docker ps -a -q)

本文同步分享在 博客“吟风者”(JianShu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这