当前位置: 移动技术网 > 科技>操作系统>Linux > Docker基础

Docker基础

2019年02月26日  | 移动技术网科技  | 我要评论

一、简介

  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  clone_newuts  主机名和域名  2.6.19
ipc   clone_newipc 信号量、消息队列和共享内存   2.6.19
pid   clone_newpid 进程编号   2.6.24
network   clone_newnet 网络设备、网络栈、端口等   2.6.29
mount   clone_newns 挂载点(文件系统)   2.4.19
user   clone_newuser 用户和用户组   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

3. 查看docker版本列表

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

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

yum install docker-ce-<version_string> docker-ce-cli-<version_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

3. 添加docker官方gpg 证书

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

4. 写入软件信息

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

4. 更新并安装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=<version_string> docker-ce-cli=<version_string> containerd.io

运行docker

停止防火墙、关闭selinux

systemctl stop firewalld && systemctl disable firewalld && setenforce 0

配置镜像加速

默认docker从dockerhub上拉取镜像,由于国内网络原因下载镜像速度会变慢,所以可以配置国内镜像加速地址https://registry.docker-cn.com,当有多个镜像加速地址时候可在列表中以逗号分割。
mkdir  /etc/docker
cat > /etc/docker/daemon.json <<eof
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

eof

运行docker

#重新装载systemd服务
systemctl daemon-reload
#启动docker
systemctl start docker
#开机自动docker
#systemctl enable docker
#查看docker版本
[root@app51 ~]# docker version
client:
version:           18.09.2
api version:       1.39
go version:        go1.10.6
git commit:        6247962
built:             sun feb 10 04:13:27 2019
os/arch:           linux/amd64
experimental:      false

server: docker engine - community
engine:
  version:          18.09.2
  api version:      1.39 (minimum version 1.12)
  go version:       go1.10.6
  git commit:       6247962
  built:            sun feb 10 03:47:25 2019
  os/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
    可以使用如下三种方式:
    <container port>:随机分配宿主机的一个端口作为映射端口
    <hostport>:<container port>指明主机的端口映射为容器端口
    <hostip>:<hostport>:<container port>指定主机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 9 seconds                               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 39 seconds                           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  command
    1 root      0:00 /bin/sh
    7 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        指定用户 (格式: <name|uid>[:<group|gid>])
  •   -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                fd4931710d35        10 seconds ago      108mb
<none>              <none>              940cdf68f69d        7 minutes ago       108mb
busybox             latest              d8233ab899d4        8 days ago          1.2mb
nginx               latest              f09fe80eb0e7        2 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                6c68885804ca        6 seconds ago       109mb
nginx               v154                fd4931710d35        2 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  <image_name>:<tag>  或者docker pull

tag不写默认为最新版本latest

[root@app51 ~]# docker pull centos
using default tag: latest
latest: pulling from library/centos
a02a4930cb5d: pull complete
digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
status: downloaded newer image for 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              1e1148e4cc2c        2 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: 1
 running: 1
 paused: 0
 stopped: 0
images: 4
server version: 18.09.2
storage driver: overlay2
 backing filesystem: xfs
 supports d_type: true
 native overlay diff: true

版本信息查看 docker version

root@app51 ~]# docker  version
client:
version:           18.09.2
api version:       1.39
go version:        go1.10.6
git commit:        6247962
built:             sun feb 10 04:13:27 2019
os/arch:           linux/amd64
experimental:      false

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网