文章目录
一、 docker概述
Docker 是一个开源的应用容器引擎:让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。是一个轻量级的“虚拟机”,容器是完全使用沙箱机制,相互之间不会有任何接口。
1.1 Docker中基本概念(三大核心)
镜像(Image)
镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)
容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
仓库(Repository)
仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
1.2 Docker 与虚拟机
相同点
- 可在不同的主机之间迁移;
- 都具备 root 权限;
- 都可以远程控制;
- 都有备份、回滚操作。
docker的优点
- 更高效的利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
- 更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
- 一致的运行环境:开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」这类问题。
- 持续交付和部署:Docker是build once,run everywhere. 使用Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
- 更轻松的迁移:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。使用Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
docker和虚拟机的不足
- docker:对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统。
- 虚拟机:每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限。
1.3 Docker引擎(Docker Engine)
docker之所以可以跨系统,就是因为有 Docker引擎(Docker Engine)的存在,只要你能在你的服务上装上 Docker引擎(Docker Engine),你就可以使用Docker镜像进行部署。
Docker Engine是具有以下主要组件的客户端-服务器应用程序:
- 服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
- REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
- 命令行界面(CLI)客户端(docker命令)。
1.4 docker的分层存储
因为镜像包含操作系统完整的root 文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
二、 安装docker及docker的基本命令
2.1 安装docker
1. 安装依赖包
yum install yum-utils device-mapper-persistent-data lvm2 -y
#yum-utils提供了yum-config-manager
#device mapper存储驱动程序需要device-mapper-persistent-data和Ivm2
#Device Mapper是 Linux2.6内核中支持逻辑卷管理的通用设备映射机制,
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
2. 设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装Docker-CE
yum install docker-ce -y
4. 开启docker服务,设为开机自启动
systemctl start docker.service
systemctl enable docker.service
5. 配置镜像加速
登录阿里云官网(一定要登录),在官网首页搜索”镜像加速“
搜索的第一个,点进去
网页的下面有一个容器镜像服务,点进去
进去以后点击管理控制台
找到镜像加速器,选择centos
复制以下的内容到自己的终端直接运行,就可以了
ee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xda9renm.mirror.aliyuncs.com"]
}
EOF
注意:每个人都有自己的专属加速,用别人的就是会很慢,所以不要嫌麻烦
2.2 docker 常用命令
2.2.1 关于镜像的操作
docker version 查看版本信息
docker search nginx 搜索nginx镜像(共有仓库)
下载nginx镜像
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
d121f8d1c412: Pull complete
ebd81fc8c071: Pull complete
655316c160af: Pull complete
d15953c0e0f8: Pull complete
2ee525c5c3cc: Pull complete
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
查看下载的镜像列表
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
下载的镜像存放位置
[root@localhost ~]# cd /var/lib/docker/image/overlay2/
[root@localhost overlay2]# ls
distribution imagedb layerdb repositories.json
[root@localhost overlay2]# vim repositories.json ##存放着镜像文件
{"Repositories":{"nginx":{"nginx:latest":"sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d","nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0":"sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d"}}}
查看下载镜像的详细信息,两种方式
docker inspect nginx:latest 后面跟镜像名称
docker inspect 7e4d58f0e5f3 后面跟镜像ID
添加镜像的标签,相当于创建了一个别名
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
删除镜像,如果镜像添加了新的标签,则无法删除,只有镜像只存在一个标签时才可以删除镜像,不管这个标签是新添加的,还是原来的
[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
[root@localhost overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (must be forced) - image is referenced in multiple repositories
重新为nginx添加标签
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Untagged: nginx:latest
Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720d4376c
Deleted: sha256:4f052ddd517f6dc5b74d2f7d881838b8ec6a5e67ec7a1da8bbbe91e1e068ad3a
Deleted: sha256:5f78154d356577280e4ac0d9bf0d021d488828e57f953b011dcbadaecd539ce4
Deleted: sha256:db5783668220e16186080f3e9d69ad748aab8c72abb8e457f6fc45369461634b
Deleted: sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868
[root@localhost overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
重新下载nginx镜像进行导出到指定目录
[root@localhost overlay2]# docker pull nginx ##下载nginx镜像
[root@localhost overlay2]# docker save -o /opt/nginx nginx:latest ##将nginx:latest导出到/opt目录下,命名为nginx
[root@localhost overlay2]# ll -h /opt
总用量 131M
drwx--x--x. 4 root root 28 9月 18 15:40 containerd
-rw-------. 1 root root 131M 9月 19 21:37 nginx
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
镜像的重新载入,如果不小心做了误删镜像的操作,可以通过到处的文件进行重新载入
[root@localhost opt]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720d4376c
Deleted: sha256:4f052ddd517f6dc5b74d2f7d881838b8ec6a5e67ec7a1da8bbbe91e1e068ad3a
Deleted: sha256:5f78154d356577280e4ac0d9bf0d021d488828e57f953b011dcbadaecd539ce4
Deleted: sha256:db5783668220e16186080f3e9d69ad748aab8c72abb8e457f6fc45369461634b
Deleted: sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868
[root@localhost opt]# docker load < /opt/nginx ##重新载入镜像
07cab4339852: Loading layer 72.49MB/72.49MB
f431d0917d41: Loading layer 64.31MB/64.31MB
60c688e8765e: Loading layer 3.072kB/3.072kB
eabfa4cd2d12: Loading layer 4.096kB/4.096kB
908cf8238301: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
2.2.2 关于容器的操作
查看容器
docker ps -a
-a 列出所有的容器,包括未运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器的ID 来源于哪一个镜像 执行的指令 创建时间 容器状态 端口 名字
容器的创建
[root@localhost opt]# docker create -it nginx:latest /bin/bash ##创建容器,并同时创建一个子bash环境
-i 让容器的便准输入保持打开
-t 让Docker分配一个伪终端
6e198a8c25d9d38f130a1e569857986d7a84ae0d177540e4017a6b1e9451fe0c
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" About a minute ago Created quirky_greider
开启容器
[root@localhost opt]# docker start 6e198a8c25d9 ##开启容器
6e198a8c25d9
[root@localhost opt]# docker ps -a ##这时候容器的状态变成了up,端口为80/tcp,这里的端口是对容器内部的端口,同样的容器对外也会有一个端口,连个端口做映射才可以实现对外的通信
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 14 seconds 80/tcp quirky_greider
这时候我们查看网卡配置信息,多了一个B类的私有地址作为docker的网关,一旦docker这个网关挂了,服务的状态会仍然保持原有状态,排错时候需要注意。
[root@localhost ~]# docker pull centos:7 ##下载centos7的镜像
7: Pulling from library/centos
75f829a71a1c: Pull complete
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost ~]# docker create -it centos:7 /bin/bash ##为centos7镜像创建容器
9dd5e445e513a6c64372b9e33a81f40f0494fdf87478739e25ca308fc8dec330
[root@localhost ~]# docker ps -a ##查看容器列表
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dd5e445e513 centos:7 "/bin/bash" 50 seconds ago Created funny_grothendieck
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 10 hours ago Up 10 hours 80/tcp quirky_greider
[root@localhost ~]# docker start 9dd5e445e513 ##开启容器
9dd5e445e513
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dd5e445e513 centos:7 "/bin/bash" About a minute ago Up 7 seconds funny_grothendieck
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 10 hours ago Up 10 hours 80/tcp quirky_greider
停止容器
[root@localhost ~]# docker stop 9dd5e445e513 ##停止容器服务
9dd5e445e513
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dd5e445e513 centos:7 "/bin/bash" 4 minutes ago Exited (137) 12 seconds ago funny_grothendieck
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 10 hours ago Up 10 hours 80/tcp quirky_greider
删除容器
[root@localhost ~]# docker rm 9dd5e445e513 ##删除容器,删除镜像为rmi
9dd5e445e513
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 10 hours ago Up 10 hours 80/tcp quirky_greider
启动执行命令查看系统/opt目录,这种方式使用容器,会在使用完成后自动停止,并释放资源
[root@localhost ~]# docker run centos:7 /bin/bash -c ls / ##启动centos:7容器,并加载一个子bash环境,使用命令ls查看根目录,执行完就关闭,状态是 Exited
Unable to find image 'centos:7' locally
7: Pulling from library/centos
75f829a71a1c: Pull complete
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43957539a471 centos:7 "/bin/bash -c ls /" 25 minutes ago Exited (0) 25 minutes ago trusting_sanderson
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 11 hours ago Up 11 hours 80/tcp quirky_greider
持续在后台执行
[root@localhost ~]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done" ##状态为up
587a0678365e6e687c3a3f47d4bec64d3e2c829e3a6996b508464830b6862892
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
587a0678365e centos:7 "/bin/bash -c 'while…" 13 seconds ago Up 13 seconds wizardly_sutherland
43957539a471 centos:7 "/bin/bash -c ls /" 35 minutes ago Exited (0) 35 minutes ago trusting_sanderson
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 11 hours ago Up 11 hours 80/tcp quirky_greider
进入容器,进入容器之前必须保持容器是up状态
[root@localhost ~]# docker create -it centos:7 /bin/bash
eec9262be812c3e70d99cc12e1245cd3298ff2c30a14ccb3fea5ebfcefb81126
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eec9262be812 centos:7 "/bin/bash" 13 seconds ago Created nostalgic_goldberg
587a0678365e centos:7 "/bin/bash -c 'while…" 30 minutes ago Up 30 minutes wizardly_sutherland
43957539a471 centos:7 "/bin/bash -c ls /" About an hour ago Exited (0) About an hour ago trusting_sanderson
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 12 hours ago Up 11 hours 80/tcp quirky_greider
[root@localhost ~]# docker start ee
ee
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eec9262be812 centos:7 "/bin/bash" 35 seconds ago Up 7 seconds nostalgic_goldberg
587a0678365e centos:7 "/bin/bash -c 'while…" 31 minutes ago Up 31 minutes wizardly_sutherland
43957539a471 centos:7 "/bin/bash -c ls /" About an hour ago Exited (0) About an hour ago trusting_sanderson
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 12 hours ago Up 11 hours 80/tcp quirky_greider
[root@localhost ~]# docker exec -it eec9262be812 /bin/bash ##进容器
[root@eec9262be812 /]#
[root@eec9262be812 ~]# exit ##退出容器
exit
进入容器后我们可以使用部分命令,也有一部分命令不能使用,因为容器毕竟不是虚拟机,而且现在没有建立内外端口映射。以后再进行演示。
容器的导出
[root@localhost ~]# docker export 6e198a8c25d9 > /opt/nginx_container
[root@localhost ~]# cd /opt
[root@localhost opt]# ls
containerd nginx nginx_container rh
容器只要存在就不能删除容器的镜像,只有先将容器删除,才可以删除镜像。
容器的批量清理,不加bash就删除不了,运行中的容器不能删除
[root@localhost opt]# docker ps -a | awk '{print "docker rm "$1}'
docker rm CONTAINER
docker rm 4bedfe57a907
docker rm 691f58d21035
docker rm 6e198a8c25d9
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bedfe57a907 centos:7 "/bin/bash -c ls /opt" 22 seconds ago Exited (0) 22 seconds ago bold_euler
691f58d21035 centos:7 "/bin/bash -c ls /" 27 seconds ago Exited (0) 27 seconds ago sweet_goldstine
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 12 hours ago Up 12 hours 80/tcp quirky_greider
[root@localhost opt]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
4bedfe57a907
691f58d21035
Error response from daemon: You cannot remove a running container 6e198a8c25d9d38f130a1e569857986d7a84ae0d177540e4017a6b1e9451fe0c. Stop the container before attempting removal or force remove
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e198a8c25d9 nginx:latest "/docker-entrypoint.…" 12 hours ago Up 12 hours 80/tcp quirky_greider