什么是docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。 Docker 使用 Google 公司推出的 Go 语言 进行开发实现。 docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。 docker的接口相当简单,用户可以方便的创建、销毁容器。 docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。 程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了。 而且docker有一个特点,就是秒级别启动,非常快
docker VS 传统虚拟机
特性 |
容器 |
虚拟机 |
启动 |
秒级 |
分钟级 |
硬盘使用 |
一般为 MB |
一般为 GB |
性能 |
接近原生 |
弱 |
系统支持量 |
单机支持上千个容器 |
一般几十个 |
docker三大概念
容器三大基本概念
镜像 image
容器 container
仓库 repository
docker整个生命周期就是这三个概念。
docker镜像
Docker镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
image的分层存储
因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。
docker容器(container)
image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。 容器可以被创建、启动、停止、删除、暂停 Docker利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
docker仓库(repository)
仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。
注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
docker Registry(docker注冊)
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。
除此以外,还有 CoreOS 的 Quay.io,CoreOS 相 关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像 使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。
国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。
使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后 面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓 库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。
CentOS安装docker
官方安裝版
1.卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 2.设置存储库 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 3.安装docker社区版 sudo yum install docker-ce 4.启动关闭docker systemctl start docker
yum源 安裝版
yum install -y docker
rpm -qi docker # 查看docker版本
docker基础命令注释
docker search hello-docker # 搜索docker镜像 ,就是去 docker hub搜索 hello-docker而已 docker pull hello-world # 下载公网的,docker镜像 docker image ls # 查看本地的镜像有哪些 docker images # 这两条命令一样的,docker进行了很多的命令升级,不用慌 docker run hello-world # 运行一个docker镜像,产生一个容器实例 docker container ls # 列出所有正在运行的容器 docker ps -a # 列出所有曾经运行过的容器记录,以及正在运行的容器记录 docker pull centos # 下载cnetos镜像 # 容器是运行应用程序的,所以必须要先有一个操作系统为基础 # 运行一个在后台的任务 docker run -d centos /bin/sh -c "while true;do echo 爱滴魔力转圈圈; sleep 1;done" -d # 后台运行容器 /bin/sh # 指定使用centos的bash解释器 -c # 运行一段shell命令 "while true;do echo 爱滴魔力转圈圈; sleep 1;done" # 在linux后台,每秒中打印一个 爱滴魔力转圈圈 docker logs -f 容器id # 不间断打印容器的日志信息 # 容器是有自己的微型操作系统的。微型linux docker exec -it 5f6 /bin/bash exec # 进入容器的参数 -i # 交互式的操作容器 -t # 开启一个terminel终端,用于和linux交互 5f6 # docker容器的id /bin/bash # 指定docker容器,用shell解释器交互 docker run -it centos /bin/bash # 交互式的运行一个容器,且进入容器(也就是开启并进入一个新的容器)
注意: docker容器必须要有后台进程在运行,如果没有,容器就会退出
搜索docker镜像
[root@docker ~]# docker search centos # 搜索所有centos的docker镜像
获取docker镜像
[root@docker ~]# docker pull centos # 获取centos镜像
[root@docker ~]# docker run -it centos /bin/bash # 完成后可以使用该镜像创建一个容器
查看docker镜像
# 镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。 # TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息。 [root@docker ~]# docker images # 查看docker镜像
删除Docker镜像
如果要移除本地的镜像,可以使用docker rmi命令(在删除镜像之前先用docker rm删除依赖于这个镜像的所有容器)。注意docker rm 命令是移除容器。 [root@docker ~]# docker rmi imageID # 删除docker镜像
导出docker镜像
如果要导出镜像到本地文件,可以使用docker save命令。 [root@docker ~]# docker save centos > /opt/centos.tar.gz # 导出docker镜像至本地 [root@docker ~]# ll /opt/ -rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz
导入docker镜像
# 可以使用docker load从本地文件中导入到本地docker镜像库 [root@docker ~]# docker load < /opt/centos.tar.gz # 导入本地镜像到docker镜像库 [root@docker~]# docker images # 查看镜像导入情况 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB
提交创建自定义的镜像(docker container commit)
1.我们进入交互式的centos容器中,发现没有vim命令 docker run -it centos 2.在当前容器中,安装一个vim yum install -y vim 3.安装好vim之后,exit退出容器 exit 4.查看刚才安装好vim的容器记录 docker container ls -a 5.提交这个容器,创建新的image docker commit 059fdea031ba tiger/centos-vim 6.查看镜像文件 [root@master /home]docker images REPOSITORY TAG IMAGE ID CREATED SIZE tiger/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
新建容器并且启动
所需要的命令主要为docker run 例如,下面的命令输出一个hehe,之后终止容器。 [root@docker ~]# docker run centos /bin/echo "hehe" # 这跟在本地直接执行 /bin/echo'hehe' hehe [root@docker ~]# docker run --name mydocker -it centos /bin/bash # 启动一个bash终端,允许用户进行交互。 [root@1c6c3f38ea07 /]# pwd / [root@1c6c3f38ea07 /]# ls anaconda-post.log bindev etc homelib lib64 lost+foundmedia mnt optproc root runsbin srv systmp usr var --name:给容器定义一个名称 -i:则让容器的标准输入保持打开。 -t:让Docker分配一个伪终端,并绑定到容器的标准输入上 /bin/bash:执行一个命令
后台模式启动docker
[root@oldboy_python ~ 15:58:14]#docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done" c0283f1077d16a2bf2597e269d51a02815334f7390f18a62ed7a4ba07f351b65 #检查容器进程 [root@oldboy_python ~ 15:58:22]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0283f1077d1 centos "/bin/sh -c 'while..." 6 seconds ago Up 5 seconds fervent_turing [root@oldboy_python ~ 15:58:28]#
查看容器内的标准输出
docker logs c02
停止容器
docker stop c02
#此时容器进程不存在
docker ps
启动容器
docker start c02
#检查容器进程
docker ps
删除容器 docker rm c02
Docker镜像常用命令
docker images #列出所有本级镜像 docker pull centos #获取新的centos镜像 docker search nginx #搜索nginx镜像
构建镜像
1.通过commit修改镜像 2.编写dockerfile
进入容器
使用-d参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach命令或nsenter工具等。
docker exec -it 容器id docker attach 容器id
外部访问容器
容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。
[root@oldboy_python ~ 16:31:37]#docker run -d -P training/webapp python app.py -P 参数会随机映射端口到容器开放的网络端口 # 如果本地没有这个镜像,docker run会自动为我们下载镜像
检查映射的端口
docker ps -l
查看容器日志信息
# 不间断显示log docker logs -f cfd
也可以通过-p参数指定映射端口
# 指定服务器的9000端口,映射到容器内的5000端口 [root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e
# 从浏览器访问192.168.1.250:9000 # 会显示一个hello world
发布docker image到仓库
docker login
注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag centos-vim shionzs/centos-vim
语法是: docker tag 仓库名 lxh661314/仓库名
(3).推送docker image到dockerhub
docker push shionzs/centos-vim
(4).在dockerhub中检查镜像 https://hub.docker.com/ (5).删除本地镜像,测试下载pull 镜像文件
docker rmi -f d69
docker pull lxh661314/centos-entrypoint-exec
删除镜像和下载镜像不用多说了,大家试一下
私有仓库搭建
1.官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/repository/registry.html 2.一条命令下载registry镜像并且启动私有仓库容器
私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到本地的/opt/data/registry下 端口映射容器中的5000端口到宿主机的5000端口
docker run -d -p 5000:5000 --privileged=true -v /opt/data/registry:/var/lib/registry registry
参数说明: -v /opt/registry:/tmp/registry :默认情况下,会将仓库存放于容器内的/tmp/registry目录下,指定本地目录挂载到容器 –privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)错误 --------------------- 作者:凌_风 来源:CSDN 原文:https://blog.csdn.net/fgf00/article/details/52040492 版权声明:本文为博主原创文章,转载请附上博文链接!
3.检查启动的registry容器
docker ps
4.测试连接容器 telnet 192.168.119.10 5000
5.修改镜像tag,以docker registry的地址端口开头
docker tag hello-world:latest 192.168.1.250:5000/hello-world:latest
6.查看docker镜像,找到registry的镜像 docker images 7.Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,这里必须写正确json数据
[root@master /]# cat /etc/docker/daemon.json { "registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.119.10:5000"] }
写入到docker服务中,写入到[Service]配置块中,加载此配置文件
vim /lib/systemd/system/docker.service
添加一行配置
EnvironmentFile=-/etc/docker/daemon.json
8.修改了docker配置文件,重新加载docker systemctl daemon-reload 9.重启docker systemctl restart docker
注意,重启docker服务,所有的容器都会挂掉
注意,重启docker服务,所有的容器都会挂掉
注意,重启docker服务,所有的容器都会挂掉
10.重启了docker,刚才的registry容器进程挂掉了,因此重新启动它
docker ps -a
docker start 容器id
11.推送本地镜像
docker push 192.168.119.10:5000/hello-world
12.由于docker registry没有web节目,但是提供了API数据
要想查看已经上传的镜像, 通过以下链接访问即可查看
官网教程:https://docs.docker.com/registry/spec/api/#listing-repositories curl http://192.168.119.10:5000/v2/_catalog 或者浏览器访问http://192.168.119.10:5000/v2/_catalog
13.删除本地镜像,从私有仓库中下载
docker rmi -f docker images -aq
docker pull 192.168.119.10:5000/hello-world