快捷搜索:  汽车  科技

docker基础镜像怎么选(深入解析docker容器)

docker基础镜像怎么选(深入解析docker容器)4:docker核心概念容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。3:开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的linux发行版上,移植很方便由go语言编写,基于apache2.0协议发布,基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现 ,自2013年开始,近些年发展迅猛,docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09 参考http://blog.csdn.net/chenhaifeng2016/article/details/68062414docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然

深入解析Docker容器

Docker介绍与优势

docker介绍

1:docker官网 www.docker.com

2:github https://github.com/docker/docker.github.io

3:开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的linux发行版上,移植很方便由go语言编写,基于apache2.0协议发布,基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现 ,自2013年开始,近些年发展迅猛,docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09 参考http://blog.csdn.net/chenhaifeng2016/article/details/68062414

docker基础镜像怎么选(深入解析docker容器)(1)

docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。

docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。

4:docker核心概念

镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。

容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。

仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)

docker改变了什么

面向产品:产品交付

面向开发:简化环境配置

面向测试:多版本测试

面向运维:环境一致性

面向架构:自动化扩容(微服务)

docker和传统的虚拟化对比

docker基础镜像怎么选(深入解析docker容器)(2)

docker优势

docker基础镜像怎么选(深入解析docker容器)(3)

1:启动非常快,秒级实现

2:资源利用率高,一台高配置服务器可以跑上千个docker容器

3:更快的交付和部署,一次创建和配置后,可以在任意地方运行

4:内核级别的虚拟化,不需要额外的hypevisor支持,有更高的性能和效率

5:易迁移,平台依赖性不强

docker架构

1、总体架构

docker基础镜像怎么选(深入解析docker容器)(4)

distribution 负责与docker registry交互,上传洗澡镜像以及v2 registry 有关的源数据

registry负责docker registry有关的身份认证、镜像查找、镜像验证以及管理registry mirror等交互操作

image 负责与镜像源数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导入、导出操作

reference负责存储本地所有镜像的repository和tag名,并维护与镜像id之间的映射关系

layer模块负责与镜像层和容器层源数据有关的增删改查,并负责将镜像层的增删改查映射到实际存储镜像层文件的graphdriver模块

graghdriver是所有与容器镜像相关操作的执行者

2、docker架构2

如果觉得上面架构图比较乱可以看这个架构

docker基础镜像怎么选(深入解析docker容器)(5)

从上图不难看出,用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。

而Docker Daemon作为Docker架构中的主体部分,首先提供server的功能使其可以接受Docker Client的请求;而后Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。

而libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。

docker架构3

再来看看另外一个架构,这个个架构就简单清晰指明了server/client交互,容器和镜像、数据之间的一些联系

docker基础镜像怎么选(深入解析docker容器)(6)

这个架构图更加清晰了架构

docker daemon就是docker的守护进程即server端,可以是远程的,也可以是本地的,这个不是C/S架构吗,客户端Docker client 是通过rest api进行通信

docker cli 用来管理容器和镜像,客户端提供一个只读镜像,然后通过镜像可以创建多个容器,这些容器可以只是一个RFS(Root file system根文件系统),也可以ishi一个包含了用户应用的RFS,容器再docker client中只是要给进程,两个进程之间互不可见

用户不能与server直接交互,但可以通过与容器这个桥梁来交互,由于是操作系统级别的虚拟技术,中间的损耗几乎可以不技

docker安装

开始安装docker

1:YUM源安装方式,用curl去下载个docker的yum安装源

[root@localhost ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo

% Total % Received % Xferd Average Speed Time Time Time Current

Dload Upload Total Spent Left Speed

100 2424 100 2424 0 0 1532 0 0:00:01 0:00:01 --:--:-- 1534

[root@localhost ~]# ls /etc/yum.repos.d/

centos-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo CentOS-Vault.repo docker.repo

2:下载好docker的yum源后,直接Yum安装

[root@localhost ~]# yum install -y docker-ce

3:启动docker

[root@localhost ~]# systemctl start docker

说明:安装完成后出现以下错误

Redirecting to /bin/systemctl start docker.service

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

解决办法:yum update

4:ps查看docker进程是否启动起来

[root@localhost docker]# ps aux|grep docker

root 58532 2.2 3.2 591996 60028 ? Ssl 01:17 0:00 /usr/bin/dockerd

root 58536 0.3 1.1 289836 22140 ? Ssl 01:17 0:00 docker-containerd --config /var/run/docker/containerd/containerd.toml

root 58666 0.0 0.0 112724 984 pts/0 R 01:17 0:00 grep --color=auto docker

rpm包安装方式

##yum源下载过程可能速度比较慢,也可以直接下载rpm包

[root@localhost~]#https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

下载完,上传到linux下 也需要用yum安装,可以自动解决依赖关系

[root@localhost ~]# yum install -y 【docker的RPM包】

启动docker

[root@localhost ~]#systemctl start docker

镜像管理命令篇

下载、上传镜像

1:下载安装centos镜像

语法:docker 【参数】【镜像名称】

[root@host1 ~]# 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

说明:docker pull 下载centos镜像,速度很慢,可以通过配置docker加速器,加速下载镜像速度,可以自行到阿里云申请!!

配置完加速器,重启docker服务,再次docker pull centos会快很多

加速器下载地址:

(参考 http://blog.csdn.net/xlemonok/article/details/71403534)

vi /etc/docker/daemon.json//加入如下内容

{

"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]

}

2:上传本地打包镜像文件

语法:docker 【参数】【镜像名称】

说明:可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧

[root@host1 ~]# docker push image_name

查看镜像

1:查看本地的镜像

语法:docker 【参数】

说明:REPOSITORY:表示镜像的仓库源、TAG:镜像的标签、IMAGE ID:镜像ID、CREATED:镜像创建时间、SIZE:镜像大小!!

[root@host1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos latest 1e1148e4cc2c 2 months ago 202MB

搜索镜像

1:搜素git镜像

语法:docker 【参数】 【对象】

说明:NAME:镜像仓库源的名称 、DESCRIPTION:镜像的描述、OFFICIAL:是否docker官方发布

[root@host1 ~]# docker search git

NAME DESCRIPTION STARS OFFICIAL AUTOMATED

gitlab/gitlab-ce GitLab Community Edition docker image based … 2396 [OK]

sameersbn/gitlab Dockerized gitlab web server 1100 [OK]

gitlab/gitlab-runner GitLab CI Multi Runner used to fetch and run… 479 [OK]

gitea/gitea Gitea: Git with a cup of tea - A painless se… 163

gitlab/gitlab-ee GitLab Enterprise Edition docker image based… 134

镜像打标签

1:将centos镜像打成标签test1、TAG为1

语法:docker 【参数】【对象】 【镜像标签名称:镜像TAG】

说明:打标签时不加【镜像TAG】,Docker默认TAG是 latest

[root@host1 ~]# docker tag centos test1:1

[root@host1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

test1 1 1e1148e4cc2c 2 months ago 202MB

centos latest 1e1148e4cc2c 2 months ago 202MB

启动镜像容器

1:启动centos镜像容器

语法:docker 【参数】-itd【对象】

说明:-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名称前面

[root@host1 ~]# docker run -itd centos

d1f6aff44e7e35215822463f55e2a28429fc50858e8b165438e594efd04675e4

查看运行的容器

1:查看启动中的容器

语法:docker 【参数】

说明:加上-a选项后可以查看所有容器,包括未运行的

[root@host1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

d1f6aff44e7e centos "/bin/bash" 3 minutes ago Up 3 minutes optimistic_aryabhat

删除镜像

1:删除centos镜像

语法:docker 【参数】 【镜像名称:镜像TAG:镜像ID】

说明:其中后面的参数可以是tag,如果是tag时,实际上是删除该tag。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除

[root@host1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

ubuntu latest 47b19964fb50 10 days ago 88.1MB

centos latest 1e1148e4cc2c 2 months ago 202MB

test1 111222 1e1148e4cc2c 2 months ago 202MB

test2 2233 1e1148e4cc2c 2 months ago 202MB

[root@host1 ~]# docker rmi centos

Untagged: centos:latest

Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426

[root@host1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

ubuntu latest 47b19964fb50 10 days ago 88.1MB

test1 111222 1e1148e4cc2c 2 months ago 202MB

test2 2233 1e1148e4cc2c 2 months ago 202MB

docker仓库管理

下载私有仓库

1:下载官方registy镜像

说明:registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。

[root@host1 ~]# docker pull registry

Using default tag: latest

latest: Pulling from library/registry

169185f82c45: Pull complete

046e2d030894: Pull complete

188836fddeeb: Pull complete

832744537747: Pull complete

7ceea07e80be: Pull complete

Digest: sha256:870474507964d8e7d8c3b53bcfa738e3356d2747a42adad26d0d81ef4479eb1b

Status: Downloaded newer image for registry:latest

2:启动registry镜像为容器

说明:-p会把容器的端口映射到宿主机上,左边为宿主机监听端口,右边为容器监听端口

[root@host1 ~]# docker run -d -p 5000:5000 registry

f250f081e920a9d0a6ffb617df2d7e60302308583289081cc2a83ccceba74ecf

通过docker ps可以查看到 启动后该容器映射的PORTS信息

[root@host1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

f250f081e920 registry "/entrypoint.sh /etc…" 26 seconds ago Up 25 seconds 0.0.0.0:5000->5000/tcp festive_sanderson

上传镜像到私有仓库

docker tag aming_test 172.7.15.113:5000/centos //标记一下tag,必须要带有私有仓库的ip:port

三、查看私有仓库

1:通过curl命令查询本地私有仓库,由于没有上传镜像到私有镜像,所以显示是【】没有镜像

[root@host1 ~]# curl 127.0.0.1:5000/v2/_catalog

{"repositories":[]}

docker容器管理

一、进入容器

1:docker run启动容器后,可以通过下面命令进入容器

语法:docker exec -it【容器ID】 bash

说明:容器ID通过docker ps查看

[root@host1 ~]# docker exec -it f3355c71123c bash

[root@f3355c71123c /]#

二、导入、导出、恢复镜像

1:导入centos6镜像

语法:docker import【导入的镜像名称】

[root@host1 ~]# cat centos6.tar |docker import -

2:将centos_test2导出镜像为entos_test2.tar

语法:docker save -o 【导出的镜像名称】【镜像名称】

语法:docker export > 【导出的镜像名称】【镜像名称】

[root@host1 ~]# docker save -o centos_test2.tar centos_test2

[root@host1 ~]# ls

anaconda-ks.cfg centos_test2.tar

3:将本地centos_test2.tar镜像文件恢复

语法:docker load --input 【本地镜像文件】

说明:除了上面的用法,或者可以用docker load < 【镜像文件】恢复

[root@host1 ~]# docker load --input centos_test2.tar

6b0a3b3df6c7: Loading layer [==================================================>] 355.7MB/355.7MB

3433fdde7cb1: Loading layer [==================================================>] 136.2MB/136.2MB

Loaded image: centos_test2:latest

三、创建容器、启动容器

1:创建一个centos_test2容器,但该容器并没有启动,通过docker ps -a可以查看到,不加-a则无法查看

语法:docker create -it 【镜像ID】 bash

[root@host1 ~]# docker create -it centos_test2 bash

9718880bb8ba8238c5e3544e1f089123ed6eb467c87806fd5abeb8d9d88e831f

2:启动新创建的容器,参数可以有start 就有stop,和restart之前我们使用的docker run 相当于先create再start

语法:docker start 【镜像ID】

[root@host1 ~]# docker start 9718880bb8ba

9718880bb8ba

3:进入容器, 这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止,docker run -d 可以让容器在后台运行, 比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

语法:docker run -it 【镜像ID】 bash

[root@host1 ~]# docker run -it centos_test2 bash

[root@9d99b1ae28c3 /]#

四、定义启动容器名称

1:启动centos_test2定义名称为test2

语法:docker run -itd --name 【定义名称】 【镜像名称】 bash

[root@host1 ~]# docker run -itd --name test2 centos_test2 bash

bfba40dbb720662836be0e09b0de44a27c3ed26b03d93ef301b07c0974a34e94

[root@host1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bfba40dbb720 centos_test2 "bash" 7 seconds ago Up 6 seconds test2

9718880bb8ba centos_test2 "bash" About an hour ago Up About an hour nostalgic_cor

给容器定义名称后,下次进入容器可以直接使用名称方便进入

[root@host1 ~]# docker exec -it test2 bash

[root@bfba40dbb720 /]#

五、查看docker logs日志信息

1:查看test2容器日志信息

语法:docker logs 【容器ID】

[root@host1 ~]# docker logs test2

112233

docker数据管理

一、建立、挂载数据卷

1. 建立宿主机本地datat目录下的docker_test作为容器存放数据目录的路径,进行目录映射

语法:docker run -itd -v /【宿主机目录】/:/【容器目录】/ 【镜像名称】 bash

说明:-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建

[root@host1 ~]# docker run -tid -v /data/docker_data/:/data/ centos bash

904948dca04f3b4bbebc0fe1fc1160d17c9cef11e5f6bc4b23617b322d73f8d3

ps查看创建的容器,名称amazing_visvesvaraya

[root@host1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

904948dca04f centos "/bin/bash" 7 seconds ago Up 6 seconds amazing_visvesvaraya

进入创建的容器查询是否成功

[root@host1 ~]# docker exec -it 904948dca04f bash

[root@904948dca04f /]# ls data/

1.txt 3.txt test.txt

2:映射目录后,创建新的容器挂载数据卷

语法:docker run -itd --volumes-from 【映射了的容器名称】 【镜像名称】bash

说明:挂载目录的时候,可以指定容器name,如果不指定就随机定义了。上面没有指定,随机生成了一个名字为amazing_visvesvaraya,docker ps 查看看最右侧一列这样,使用镜像centos_test2创建了新的容器,并且使用了amazing_visvesvaraya容器的数据卷

[root@host1 ~]# docker run -itd --volumes-from amazing_visvesvaraya centos_test2 bash

810ff9bebe6dc767308aac49b9b61d0e113b441ee88002373899afbe468113bb

进入创建的容器查询是否成功

[root@host1 ~]# docker exec -it 810ff9beb bash

[root@810ff9bebe6d /]# ls data/

1.txt 3.txt test test.txt

3:建立容器中的NFS数据卷,共享其它容器使用

语法:docker run -itd -v /【容器的路径】/ -name 【定义容器名称】【镜像名称】 bash

说明:在众多容器中,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。注意-V后面的路径是容器的路径,并非宿主机的路径。

[root@host1 ~]# docker run -itd -v /data/ --name testvol centos bash

46f89904218d8c1a6f56ac167cef6c3b713c251b6c118532425f72da1f1c2c47

[root@host1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

46f89904218d centos "bash" 6 seconds ago Up 5 seconds testvol

810ff9bebe6d centos_test2 "bash" About an hour ago Up About an hour youthful_noyce

904948dca04f centos "/bin/bash" 5 hours ago Up 5 hours amazing_visvesvaraya

说明:以上操作完成后,然后让其他容器挂载该数据卷共享使用

[root@host1 ~]# docker run -itd --volumes-from testvol centos bash

docker数据备份与恢复

数据备份

备份示例如下:

docker基础镜像怎么选(深入解析docker容器)(7)

要求:备份nfs数据卷里的data目录里的test-nfs.txt文件到宿主机/data/backup目录下

语法:docker run --volumes -from 【数据卷名称】 -v /【宿主机路径】/:/【容器路径】 【镜像】

说明:首先我们需要使用nfs数据卷新开一个容器并挂载,同时我们还需要把本地的/data/backup目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,我们就可以直接在/data/backup/目录中看到了。然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面

1:查看nfs数据卷容器是否启动

[root@host1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

45c637895e7a centos "bash" 2 days ago Up 2 days nfs

2:执行备份nfs数据卷的data目录

[root@host1 ~]# docker run --volumes-from nfs -v /data/backup/:/backup centos tar cvf /backup/data.tar data

data/

data/test-nfs.txt

3:查看是否备份成功

[root@host1 ~]# cd /data/backup/

[root@host1 backup]# tar xvf data.tar

data/

data/test-nfs.txt

[root@host1 backup]# ls

data data.tar

[root@host1 backup]# cd data

[root@host1 data]# ls

test-nfs.txt

二、恢复数据

说明:先新建一个nfs2数据卷容器,再建一个新的容器并挂载nfs2数据卷容器,然后再把tar包解包,完成恢复数据操作!

1:新建nfs2数据卷容器

[root@host1 data]# docker run -itd -v /data/ --name nfs2 centos bash

7b09a70be336b60126c3dbc747a9689ce1bb224ef93f5c2e257dbd19771f3c18

[root@host1 data]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

7b09a70be336 centos "bash" 4 seconds ago Up 3 seconds nfs2

45c637895e7a centos "bash" 2 days ago Up 2 days nfs

2:恢复数据到nfs2容器

[root@host1 data]# docker run --volumes-from nfs2 -v /data/backup/:/backup centos tar xf /backup/data.tar

3:查看是否恢复成功

[root@host1 data]# docker exec -it 7b09a7 bash

[root@7b09a70be336 ~]# ls /data/

test-nfs.txt

猜您喜欢: