Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

Docker基础

W-D 2019-02-25 11:12:00 阅读数:224 评论数:0 点赞数:0 收藏数:0

一、简介

Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的CGroup、Namespace、Union FS等技术实现的一种系统级虚拟化技术。

特性

  • 更高效的利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
  • 更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 一致的运行环境:开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」这类问题。
  • 持续交付和部署:Docker是build once,run everywhere. 使用Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile 来进行镜像构建,并结合持续集成(CI) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(CD) 系统进行自动部署。
  • 更轻松的迁移:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。使用Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

组件

镜像(Image)

镜像,可以理解为一个模板,这个模版提供了器运行时所需的程序、库、资源、配置等必要文件。只要有了这个模版,我们可以在任何装有docker的系统上运行容器,也就是所谓的Docker是build once,run everywhere。 

容器(Container)容器,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

 仓库(Repository)

仓库,故名思义就是存放东西的,这里的“东西”就是Image。用户可以通过仓库拉取镜像运行容器,也可以构建镜像存放在仓库中。仓库可分为为公共仓库和私有仓库,所有用户都能使用的仓库称为公共仓库,而私有仓库则是个人或者团队自己搭建,只供个人或者团队使用。 

一个直观图说明其各个组件运行关系:

 

版本

Docker 从v17.03开始划分为CE 和EE。CE 即社区版,EE 即企业版,强调安全,付费使用。Docker在1.13 版本之后,从2017年的3月1日开始,版本命名规则变为如下:

  

Docker CE 每月发布一个Edge 版本(17.03, 17.04, 17.05…),每三个月发布一个Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本号保持一致,但每个版本提供一年维护。

二、安装部署

安装说明

安装需求:

  •  Linux kernel(内核) 3.10+
  •  Linux kernel cgroups and namespaces 

由于Docker是建立在linux中两种核心技术之上:namespace与Cgroup,而User namespace出现的版本是3.8,所以安装docker需要内核版本大于3.10,centos6内核版本是2.6所以无法在其上使用docker。 namespace 系统调用参数  隔离内容  内核版本  UTS  CLONENEWUTS  主机名和域名  2.6.19 IPC   CLONENEWIPC 信号量、消息队列和共享内存   2.6.19 PID   CLONENEWPID 进程编号   2.6.24 Network   CLONENEWNET 网络设备、网络栈、端口等   2.6.29 Mount   CLONENEWNS 挂载点(文件系统)   2.4.19 User   CLONENEWUSER 用户和用户组   3.8

centos7安装

  1. 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2

2.添加仓库

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  1. 查看docker版本列表

yum list docker-ce --showduplicates | sort -r

  1.  安装指定版本的docker(可忽略,直接安装最新版)

yum install docker-ce-STRING> docker-ce-cli-STRING> containerd.io

5.安装最新版docker

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

Debian&Ubuntu

  1. 更新包管理
    sudo apt-get update
  2.  添加https包信任

sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

  1. 添加docker官方GPG 证书

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

  1. 写入软件信息

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable”

  1.  更新并安装docker

sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io

5.若安装指定版本采用如下方式

/#列出版本 $ apt-cache madison docker-ce docker-ce | 5:18.09.1~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages docker-ce | 5:18.09.0~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages docker-ce | 18.06.1~ce~3-0~debian | https://download.docker.com/linux/debian stretch/stable amd64 Packages docker-ce | 18.06.0~ce~3-0~debian | https://download.docker.com/linux/debian stretch/stable amd64 Packages/#安装 sudo apt-get install docker-ce=STRING> docker-ce-cli=STRING> containerd.io

运行docker

停止防火墙、关闭selinuxsystemctl stop firewalld && systemctl disable firewalld && setenforce 0

配置镜像加速

默认docker从DockerHUB上拉取镜像,由于国内网络原因下载镜像速度会变慢,所以可以配置国内镜像加速地址https://registry.docker-cn.com,当有多个镜像加速地址时候可在列表中以逗号分割。

mkdir /etc/docker cat> /etc/docker/daemon.json <

运行docker

/#重新装载systemd服务 systemctl daemon-reload/#启动docker systemctl start docker/#开机自动docker/#systemctl enable docker/#查看docker版本 [root@app51 ~]/#docker version Client: Version:18.09.2API version:1.39Go version: go1.10.6Git commit:6247962Built: Sun Feb10 04:13:27 2019OS/Arch: linux/amd64 Experimental: false Server: Docker Engine-Community Engine: Version:18.09.2API version:1.39 (minimum version 1.12) Go version: go1.10.6Git commit:6247962Built: Sun Feb10 03:47:25 2019OS/Arch: linux/amd64

 

三、docker基本操作

容器操作

docker 命令采用了分组管理的思想,已经纳入管理的docker命令如下(版本18.09.2): 

其中docker container 则是管理容器命令,老的版本中是使用docker进行容器管理,新版本兼容老版本docker命令,所以对容器管理既可用docker也可以用docker container。

1.启动容器 

方式1:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

常用OPTIONS:

  • -i:--interactive,交互式启动
  • -t:--tty,分配终端
  • -v:--volume,挂在数据卷
  • -d:--detach,后台运行
  •  --name:容器名字
  •  --network:指定网络
  •  --rm:容器停止自动删除容器
  • -P:自动暴露所有容器内端口,宿主随机分配端口
  • -p:指定端口映射,将容器内服务的端口映射到宿主机的指定端口,可以使用多个-p
    可以使用如下三种方式:

:随机分配宿主机的一个端口作为映射端口:指明主机的端口映射为容器端口

::指定主机ip和端口 

示例:运行一个名字为nginx-container的容器,使用镜像nginx,并将宿主机的8080映射到容器内部80端口,然后进入交互模式。 [root@app51 ~]/#docker run -it --name nginx-container -p 8080:80 nginx /bin/bash root@fd92290433da://#ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

2.查看容器

docker ps [OPTIONS]

常用选项:

  • -a:--all ,查看所有容器,包括退出和其他状态的
  • -n::--last int,显示最后n个创建的容器
  • -l, :--latest ,显示最近的容器
    示例 :

root@app51 ~]/#docker ps -n 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d51a1cdf4b4 busybox"/bin/sh" 11 seconds ago Up 9seconds busybox 383f31ff8f01 nginx"nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp nginx-container [root@app51~]/#docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d51a1cdf4b4 busybox"/bin/sh" 41 seconds ago Up 39seconds busybox [root@app51~]/#

3.查看容器具体信息

docker inspect [OPTIONS] NAME|ID [NAME|ID…]

示例:[root@app51 ~]/#docker inspect busybox [ {"Id": "4d51a1cdf4b4e06831faa6e54a32f1f8eb544e349028083b12f5b3f87af075c9","Created": "2019-02-23T09:10:20.907074902Z","Path": "/bin/sh","Args": [],

4.停止容器

方式一:docker stop [OPTIONS] CONTAINER [CONTAINER…]

方式二: docker kill [OPTIONS] CONTAINER [CONTAINER…] 区别:docker stop 相当于发送15停止信号,而kill是强制终止对应信号9

示例:[root@app51 ~]/#docker stop nginx-container nginx-container

5.启动已停止的容器

docker start [OPTIONS] CONTAINER [CONTAINER…]

常用选项:

  • -a:--attach 附加终端
  • -I:--interactive 交互式 
    [root@app51 ~]/#docker start -ia busybox / /#ls bin dev etc home proc root sys tmp usr var/ /#ps PID USER TIME COMMAND1 root 0:00 /bin/sh7 root 0:00 ps

6.删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER…] 或者docker container rm

如果删除的容器正在运行则需要指定-f进行强制删除常用选项:

  • -f: --force 强制删除
    示例: 

docker rm nginx-container

Ps:删除所有容器

docker rm -f docker ps -a -q docker ps-a |awk -F ' ' '{print $1}' |xargs docker rm -f

7. 暂停某个容器

docker pause CONTAINER [CONTAINER…]

示例:[root@app51 ~]/#docker pause nginx-container nginx-container

8.恢复暂停的容器

docker unpause CONTAINER [CONTAINER…]

[root@app51 ~]/#docker pause nginx-container nginx-container

9.查看容器日志

docker logs [OPTIONS] CONTAINER

常用选项:

  • -t, --timestamps :显示日志时间
    root@app51 ~]/#docker logs nginx-container 10.1.201.30 - - [23/Feb/2019:10:55:33 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36" "-"

10.在已运行的容器中运行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

常用选项:

  •   -d:--detach ,后台运行命令
  •   -e, --env list             设置env
  •   -i, --interactive         启用交互式
  •   -t, --tty                     启用终端
  •   -u, --user string        指定用户 (格式: [:])
  •   -w, --workdir string       指定工作目录 

示例:[root@app51 ~]/#docker exec -it -u nginx nginx-container /bin/sh $ id uid=101(nginx) gid=101(nginx) groups=101(nginx) $

11.容器导出

docker export [OPTIONS] CONTAINER

容器导出类似于容器快照,导出的是容器的在宿主机上的文件系统压缩包,导出的文件系统可使用docker import进行导入,在其他机器导入时候会以镜像的方式存在。常用参数

  • -o, --output  导出的文件名称
    示例 :

[root@app51 ~]/#docker export nginx-container -o nginx.tar [root@app51 ~]/#ls -lh ningx.tar -rw------- 1 root root 107M 2月 23 19:18 ningx.tar

12.将导出的容器导入为镜像

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]容器导入可以是文件、文件url、镜像仓库

示例: [root@app51 ~]/#docker import nginx.tar nginx:v154 sha256:fd4931710d35765edb9bbd0ea84a886e0901aa7a2de03ab2eefd9aedea0e8646 [root@app51~]/#docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v154 fd4931710d3510seconds ago 108MB 940cdf68f69d 7minutes ago 108MB busybox latest d8233ab899d48 days ago 1.2MB nginx latest f09fe80eb0e72 weeks ago 109MB

其他导入示例

docker import http://example.com/image.tar.gz repository:tag

12.将容器提交为镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

常用选项:

  • -a,--author     指定作者
  • -m, --message 本次提交的信息
  •  -p, --pause      提交为镜像时候暂停容器
  • -c, --change list 修改镜像某些属性,列如启动命令
    示例: 

[root@app51 ~]/#docker commit -p -m 'build nginx image' nginx-container nginx:test sha256:6c68885804ca69970d747cc6cc8050ed7a1b6c24838695ec11b18348318809a6 [root@app51~]/#docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx test 6c68885804ca6seconds ago 109MB nginx v154 fd4931710d352 hours ago 108MB

镜像操作

在老版本中镜像操作也是使用的docker命令,新版本进行了分组,可使用docker image 来进行镜像操作。

1.搜索镜像

docker search [OPTIONS] TERM

常用选项:

  • --limit 限制搜索的结果条目数量,默认显示25条 
    [root@app51 ~]/#docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS.5179[OK] ansible/centos7-ansible Ansible on Centos7 120[OK] jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86… 106[OK] consol/centos-xfce-vnc Centos container with "headless" VNC session… 80 [OK]

结果字段含义:

NAME:镜像名称DESCRIPTION :镜像描述

STARS :获赞数量OFFICIAL :是否为官方镜像

AUTOMATED:是否为自动构建 

2.下载镜像 

docker image pull  :  或者docker pull

TAG不写默认为最新版本latest

[root@app51 ~]/#docker pull centos Using default tag: latest latest: Pullingfrom library/centos a02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Status: Downloaded newer imagefor centos:latest

3.查看镜像

docker image ls 或者docker images

常用选项:

  • -a: 查看所有已下载的镜像
  • -f: --filter,过滤某些镜像 
    [root@app51 ~]/#docker image ls -a REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c2 months ago 202MB

4.删除镜像

 docker image rm [OPTIONS] IMAGE [IMAGE...]  或者docker rmi IMAGE[root@app51 ~]/#docker image rm centos Untagged: centos:latest Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956

5. 镜像导出

docker save [OPTIONS] IMAGE [IMAGE...]

将镜像打包为压缩包,可在其他docker主机进行导入,一次可打包多个

常用选项:

  • -o,--output   输出到文件

示例:[root@app51 ~]/#docker save -o nginx-bus.tar.gz busybox:latest nginx:latest

6.镜像导入

docker load [OPTIONS]

将已经导出的镜像压缩文件导入为镜像

常用选项:

  • -i, --input 指定文件来源 
    [root@app51 ~]/#docker load -i nginx-bus.tar.gz Loaded image: nginx:latest Loaded image: busybox:latest

7.查看镜像信息

docker image inspect [OPTIONS] IMAGE [IMAGE...][root@app51 ~]/#docker image inspect nginx [ {"Id": "sha256:f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80","RepoTags": ["nginx:latest"],"RepoDigests": ["nginx@sha256:dd2d0ac3fff2f007d99e033b64854be0941e19a2ad51f174d9240dda20d9f534"],

其他

运行信息查看docker info[root@app51 ~]/#docker info Containers: 1Running:1Paused: 0 Stopped: 0 Images:4Server Version:18.09.2Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true

版本信息查看 docker version

root@app51 ~]/#docker version Client: Version:18.09.2API version:1.39Go version: go1.10.6Git commit:6247962Built: Sun Feb10 04:13:27 2019OS/Arch: linux/amd64 Experimental: false

 

版权声明
本文为[W-D]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/wdliu/p/10429819.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领