一、简介
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
Feb10 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
fd4931710d3510 seconds ago 108MB <none> <none> 940cdf68f69d 7 minutes ago 108MB
busybox latest d8233ab899d48 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
6c68885804ca6 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 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: 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
热门工具 换一换