#Docker简介与使用(一)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,
然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。
Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker工作流程:
Client向Docker Daemon发起一个run指令附带指定即将容器化的镜像名称,Docker Daemon首先会在本地查找指定的镜像名,
如查找不到,会在官方仓库查找镜像下载到本地后实例化为一个容器。
Docker组件:
物理:
Client <--> Daemon <--> Registry Server
逻辑:
Containers:容器
Images:镜像、映像
Registry:Image Repositories
容器的状态:
安装:
依赖的基础环境:
1、64 bits CPU
2、Linux Kernel 3.10以上
3、Linux Kernel cgroups and namespaces
宿主机环境为CentOS 7.3.1611,需要配置yum源:extras
安装后启动Docker Daemon查看:
[root@webhost ~]# systemctl start docker.service
[root@webhost ~]# docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
Go version: go1.7.4
Git commit: 88a4867/1.12.6
Built: Mon Jul 3 16:02:02 2017
OS/Arch: linux/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
Go version: go1.7.4
Git commit: 88a4867/1.12.6
Built: Mon Jul 3 16:02:02 2017
OS/Arch: linux/amd64
[root@webhost ~]#
也可使用docker info查看详细信息。
容器操作:
创建:
基于镜像文件,镜像文件要有默认运行的程序,否则启动后会马上退出
Create:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
Exp:docker create --name c2 centos:latest
启动:
使用create创建的容器处于停止状态,可使用start启动
Start:docker start c2
Run:创建并启动容器
Docker run –name c3 –it centos:latest
--name CT_NAME
--it : 交互式启动容器
--rm:容器运行终止即自行删除
--network BRIDGE:让容器加入的网络;默认为docker0;
启动后操作完成,可从终端拆除回到宿主UI:ctrl+p, ctrl+q
如果想再进入容器内使用attach:docker attach c3
docker 1.3.x版本后提供了exec进入容器:docker exec -it container_id /bin/bash(常用)
如果让运行中的容器运行一个额外的程序使用exec:docker exec c1/container_id "/usr/sbin/ifconfig"
查看:
logs:容器内部程序运行时输出到终端的信息;
ps:容器列表
-a, --all:列出所有容器;
--filter, -f:过滤器条件显示
name=
status={stopped|running|paused}
stats:动态方式显示容器的资源占用状态:
top:显示正在运行的进程
停止:
分为两种kill与stop
Kill:docker kill/stop centos #kill相当于直接断电,stop比较’优雅’
重启:resart
暂停和继续:pause/unpause
删除容器:rm
详细操作请查看官方文档https://docs.docker.com/engine/reference/commandline/docker/
镜像:
使用docker search centos 搜索镜像,
使用docker pull docker.io/user/repo:tag 获取顶层仓库的镜像,标签与顶层仓库可缺省(默认),
使用docker inspect centos查看镜像的详细信息,
使用docker rmi centos:latest 删除镜像,
创建镜像:
三种方法,
1基于已有容器创建,
2基于本地模版导入,
3基于dockerfile创建,
这里介绍前两种方法,dockerfile在后面详细介绍。
1、 基于已有容器
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
exp:docker commit -a "wangye" -m "test" -p c1 wycentos:v0.1#基于容器c1创建镜像
--author, -a 作者
--pause, -p 提交时暂停容器
--message, -m 注释信息
--change, -c 默认运行的进程
可以在容器内安装好需要运行的进程及相关的设置,在制作镜像时使用-c指明进程,再次使用此镜像便可直接使用进程。
2、 基于本地模版导入
获取镜像模版,可从https://download.openvz.org/template/precreated/ 下载,这里下载了centos-7-x86_64.tar.gz
wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
导入:
cat centos-7-x86_64.tar.gz | docker import - centoswy:v0.1 导入镜像
docker save -o centoswy.tar centoswy:v0.1 存出镜像
docker load --input centoswy.tar或docker load < centoswy.tar 载入镜像
打标签上传到hub.docker.com,需要有账号,且使用docker login 登录成功
docker tag centoswy:v0.1 docker.io/smartwy/centoswy:v0.1,
出错提示信息:Please rename your repository to docker.io/<user>/<repo> (ex: docker.io/smartwy/centoswy)
centoswy:v0.1不符合上传规则需重新改名添加URL前缀再进行上传,将要上传的镜像名为 docker.io/smartwy/centoswy:v0.1
上传:docker push docker.io/smartwy/centoswy:v0.1
数据管理:
容器在使用中会产生数据,如果其它容器也需要这里的数据,那么就需要把容器内的数据进行备份,共享给其它容器,这必然涉及容器的数据管理操作。
1、 数据卷
2、 数据卷容器
数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
数据卷可在容器间共享和重用
对数据卷的修改会马上生效
对数据卷的更新,不会影响镜像
卷会一直存在,直到没有容器使用
数据卷的使用,类似于linux下的mount操作
docker run -it --name dv1 -v /docs docker.io/centos_copy:v0.1
运行一个容器dv1镜像为docker.io/centos_copy:v0.1,创建一个数据卷/docs,创建完成后可使用df –TH查看,标识为一块磁盘sda2,文件系统和镜像文件一致:
/dev/sda2 xfs 108G 3.6G 104G 4% /docs
使用-v也可以指定挂载一个本地的已有目录到容器中作为数据卷,如下:
docker run --privileged=true --rm -it --name dv1 -v /data:/docs docker.io/centos_copy:v0.1
如果selinux开启需要使用--privileged=true为容器加特权,将本地/data挂载到/docs做为数据卷。
也可以多个容器挂载到同一个主机目录,如下:
docker run --rm -it --name dv1 -v /dockerdbs:/docs docker.io/centos_copy:v0.1
docker run --rm -it --name dv2 -v /dockerdbs:/docs docker.io/centos_copy:v0.1
两个容器dv1,dv2的/docs挂载同一个/dockerdbs主机目录。
数据卷容器:
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器,数据卷容器就是一个普通的容器,专门用它提供数据卷供其它容器挂载使用。
首先,创建一个数据卷容器dbdata,并在容器内创建一个数据卷挂载到/dbdata
docker run --rm -it --name dbdata -v /dbdata docker.io/centos_copy:v0.1
其次,使用—volumes-from来挂载dbdata容器中的数据卷
docker run --rm -it --name db1 --volumes-from dbdata docker.io/centos_copy:v0.1
docker run --rm -it --name db2 --volumes-from dbdata docker.io/centos_copy:v0.1
此时, db1和db2的数据卷都挂载到dbdata容器的/dbdata下,无论那个容器修改其内容,其它容器都可以看到。也可以多次使用—volumes-from参数挂载多个数据卷,还可以从其它已经挂载了容器卷的容器来挂载数据卷。
如果删除了挂载的容器(dbdata,db1,db2),数据卷并不会被自动删除,如要删除数据卷,必须在删除最后挂载它的容器时,使用docker rm –v 来指定同时删除关联的容器。
利用数据卷容器迁移数据:
利用数据卷容器对其中的数据卷进行备份,恢复,以实现数据的迁移。
备份:
Docker run –name worker –volumes-from dbdata –v /dbbackup:/backup docker.io/centos_copy:v0.1 tar cvf /backup/backup.tar /dbdata/*
以docker.io/centos_copy:v0.1镜像实例化一个容器worker,使用dbdata容器的数据卷/dbdata为数据卷,
使用-v挂载本地/dbbackup目录至worker容器的/backup目录,worker容器启动后,
会执行tar cvf /backup/backup.tar /dbdata/*命令将/dbdata目录下的数据归档为/backup/backup.tar,
即属主机的/dbbackup目录下backup.tar,备份完成。
恢复:
首先,创建一个带有数据卷的容器test1:
Docker run –rm –it –name test1 –v /dbdata docker.io/centos_copy:v0.1
随后,创建另一个test2容器:
Docker run –rm –it –name test2 –volumes-from test1 –v /path/to/BACKUP_DIRNAME:/backup docker.io/centos_copy:v0.1 tar xvf /backup/backup.tar –C /dbdata
以docker.io/centos_copy:v0.1镜像实例化一个容器test2,挂载test1的容器数据卷,这为一个共享容器数据卷,
再将宿主机的备份数据目录挂载到/backup目录,这为一个共享数据卷,容器test2运行后,
会将共享数据卷内的备份归档文件解压到共享容器数据卷目录下,从而实现恢复数据,容器共享数据。
注意:/path/to/BACKUP_DIRNAME为宿主机的归档文件所在目录,否则解压归档会报错。
网络基础配置:
Docker 安装完成后,会自动创建三个网络,可使用docker network ls来查看
[root@webhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
dae292121a80 bridge bridge local
9465cb63e11e host host local
bff6832e26b0 none null local
bridge:
docker daemon启动时默认会创建一个名为docker0的网络桥,并且创建的容器为桥接式容器,其以太网接口桥接至docker0。
创建容器时,可使用—network选择要加入的网络,没有指明网络,默认加入docker0网桥。
Docker0为NAT桥,所以桥接式容器可通过此桥接口访问外部网络,但防火墙阻止了一切外部网络访问桥接式容器的请求。
同一个宿主机上的不同容器之间就可以通过网桥的转发功能进行通信,但是位于不同宿主机器上的容器无法直接进行通信,
他们可以通过iptables SNAT/DNAT和容器外网络进行通信。
效果图:
示意图:
Host:
Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,
是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,
故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。
Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。
需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突。
实例化一个host网络模式的容器t1,执行ifconfig命令
docker run -it --rm --name t1 --network host docker.io/smartwy/centos_net:v0.1 /usr/sbin/ifconfig
注意:实例化依赖的镜像要已安装net-tools包,才可执行ifconfig命令。
示意图:
Container:
Container 网络模式是 Docker 中一种较为特别的网络的模式。
处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,
而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
实例化第一个容器
docker run -d --name hostcs1 docker.io/smartwy/centos_net:v0.1
实例化第二个容器
docker run -d --name hostcs2 –network container:hostcs1 docker.io/smartwy/centos_net:v0.1
注意:因为此时两个容器要共享一个 network namespace,因此需要注意端口冲突情况,否则第二个容器将无法被启动。
示意图:
None:
none网络模式,该模式下的容器内部就只能使用loopback网络设备,不会再有其他的网络资源。容器只能使用127.0.0.1的本机网络
实例化一个容器t1,
docker run -it --rm --name t1 --network none docker.io/smartwy/centos_net:v0.1 /usr/sbin/ifconfig
检查其网络设备,除了 loopback 设备外没有其它设备
Run时指定网络相关参数:
--hostname HOSTNAME:指定容器主机名
--dns DNS_SERVER_IP:指定容器DNS服务地址\
--add-host HOSTNAME:IP:指定本地主机名解析项
Exp:docker run --rm --name t1 --hostname ti.test.com --dns 172.17.0.1 --add-host "www.abc.com:172.17.0.1" docker.io/smartwy/centos_net:v0.1 ping www.abc.com
端口映射实现访问容器
当容器中需要运行一些网络应用时,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射,-p可多次标记使用
-p使用格式
-p <containerPort>
将指定的容器端口映射至宿主机所有地址的一个动态端口
-p <hostPort>:<containerPort>
将容器端口<containerPort>映射到宿主机指定端口<hostPort>
-p <ip>::<containerPort>
将指定的容器端口映射之宿主机指定<ip>的动态端口
-p <ip>:<hostPort>:<containerPort>
将指定的容器端口映射之宿主机指定<ip>的指定<hostPort>
动态端口指随机端口,可是使用docker port CONTAINER_NAME查看端口映射结果
docker run --name t2 -it -p 80:80 docker.io/smartwy/centos_httpd:v0.1
将宿主机的80端口映射到容器的80端口
docker run --name t2 -it -p 172.17.0.3:80:80 docker.io/smartwy/centos_httpd:v0.1
将宿主机172.17.0.3的80端口映射到容器的80端口
这样访问172.17.0.3的web服务会直接映射到容器t2的web服务上

本文介绍了Docker的基本概念,包括其架构、安装步骤、核心组件等,并详细讲解了容器、镜像的操作方法以及数据卷的使用技巧。
1933

被折叠的 条评论
为什么被折叠?



