您的位置:首页 > 运维架构 > Docker

Docker容器技术基础篇

2017-10-13 14:08 696 查看

简介

1、定义

Docker是通过内核(linux内核)虚拟化技术(namespaces及cgroup等)来提供容器的资源隔离和安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。

2、Docker组成部分

客户端和服务端

3、Docker组件

镜像(image)、容器(container)、仓库(repository)

4、Docker的用途

①简化配置(simplifying configuration)

②代码流水线管理(code pipeline management)

③开发效率(developer productivity)

④应用隔离(app lsolation)

⑤服务器整合(server consolidation)

⑥调试能力(debugging capabilities)

⑦多租户(multi-tenacy)

⑧快速部署(rapid deployment)

5、使用Docker的理由

①技术储备

②无技术栈和技术债 (主要是创业公司,没钱,宕机了可能承受)

③跟上节奏,提升自身技术

④符合当前业务需求

⑤快

6、docker改变了什么

面向产品:产品交付

面向开发:简化环境配置

面向测试:多版本测试(多分支测试)

面向运维:环境一致性(saltstack保证不了,环境回退)

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

镜像(image)

1、安装并启动docker

[root@liunx-node1 ~]# yum -y install docker
[root@liunx-node1 ~]# systemctl start docker




2、下载docker镜像

[root@liunx-node1 ~]# docker pull centos    #获取docker的centos镜像,更多docker镜像请参照docker官网
[root@liunx-node1 ~]# docker save centos(镜像名称或者id) > /opt/centos.tag.gz  (自定义名称)
[root@liunx-node1 ~]# docker load < /opt/centos.tag.gz    #导入镜像


3、查看docker镜像

[root@liunx-node1 ~]# docker images     #每一个镜像都有一个唯一的image id


4、查看帮助

[root@liunx-node1 ~]# docker run --help
[root@liunx-node1 ~]# docker images --help


5、删除docker镜像

[root@liunx-node1 ~]# docker rmi 196e0ce0c9fb    #后面是docker 的id


6、查看启动的docker

[root@liunx-node1 ~]# docker ps -a


7、创建并启动容器,但是这个就立刻就退出了

[root@liunx-node1 ~]# docker run centos(这个是镜像的名称) /bin/echo 'hehe'   (后面这个是命令)


总结:

搜索镜像:docker search 镜像名称

获取镜像:docker pull 镜像名称

查看镜像:docker images

删除镜像:docker rmi 镜像id

容器(container)

1、创建容器,并进行操作(下面的命令就是进入到docker里面了)

[root@liunx-node1 ~]# docker run --name mydocker -t -i centos /bin/bash


备注:

–name:指定名称,自定义的

-t:分配一个伪终端tty

-i:让容器的标准输入保持打开状态,和 -t 一定要连用

centos:镜像的名称

/bin/bash:执行的命令,这个是启动容器的时候,让它执行的

启动的时候所做的事情:首先检查centos这个镜像本地有没有,如果没有,它自己就会从dockerhub下载,然后再启动–>利用centos镜像启动容器

2、在docker内部的基本操作

[root@8884f791ef60 /]# ps aux    #查看,进程和主机名一样的
[root@8884f791ef60 /]# exit      #退出


3、重新启动docker

[root@liunx-node1 ~]# docker ps -a             #查看所有的容器,包括运行和不运行
[root@liunx-node1 ~]# docker start docker_id #重新启动docker
[root@liunx-node1 ~]# docker attach docker_id #进入容器,但是这个操作是同步的,如果执行exit,容器就退出了,所以它适合单进程的


4、进入docker后,执行exit,容器还在运行

命令:nsenter(yum -y install util-linux)   #通过这个命令也可以进入,但是这个需要docker的pid,建议采用这种方式
[root@liunx-node1 ~]# docker inspect --format "{{.State.Pid}}" docker_id     #获取容器的pid
[root@liunx-node1 ~]# nsenter -t pid -u -i -n -p        #这样就进去了,如果执行exit,容器也在与运行




5、删除[正在运行的]容器

[root@liunx-node1 ~]# docker rm [-f] docker_id
[root@liunx-node1 ~]# docker run --rm centos /bin/echo 'hehe'    #容器停止后自动删除
[root@liunx-node1 ~]# docker kill $(docker ps -a -q)            #杀掉所有的docker进程


总结

启动容器:docker run –name -h hostname | docker start

停止容器:docker stop docker_id

查看容器:docker ps -a -l

进入容器:docker exec | docker attach | nsenter

删除容器:docker rm docker_id

网络访问(network)

1、启动容器

[root@liunx-node1 ~]# docker pull nginx     #导入nginx镜像
[root@liunx-node1 ~]# docker run -d -P nginx(镜像名称)

[root@liunx-node1 ~]# docker ps                      #查看 http://192.168.88.134:32768/   #浏览器访问
[root@liunx-node1 ~]# docker logs docker_id          #查看日志




2、自定义映射端口

[root@liunx-node1 ~]# docker run -d -p 81:80 nginx   #指定端口映射(物理机端口:容器端口) http://192.168.88.134:81/      #访问
备注:如果不指定ip,就是所有的ip


总结

随机映射:docker run -P 镜像名称

指定映射:

-p hostPort:containPort

-p ip:hostPort:containPort

-p ip::containPort

-p hostPort:containPort:udp

存储

1、创建数据卷

[root@linux-node1 ~]# docker run -d -it –name volume-test1 -v /data centos #后台启动

[root@linux-node1 ~]# docker inspect docker_id #查看data在物理机上的哪一个位置

[root@linux-node1 ~]# cd /var/lib/docker/volumes/d35a4fe0949ae604f675241bd45ed35e74fe3259fba43522840da18b9f47914d/_data #如果在这个目录下写入任何东西,在容器的/data目录下都会显示



2、制定目录创建数据卷(将物理机的/home/wwwroot/phpmyadmin挂载到容器的/mnt目录下),一般用于开发,并设置只读权限

[root@linux-node1 ~]# docker run -it --name volume-test2 -v /home/wwwroot/phpmyadmin:/mnt :ro centos


3、挂载文件

[root@linux-node1 ~]# docker run -it -v ~/.bash_history:/.bash_history centos    #这样docker容器就可以记录历史命令


4、数据卷容器(让一个容器访问另一个容器的卷,相当于nfs)

[root@linux-node1 ~]# docker run -d -it –name nfs -v /data centos #先启动一个容器,后台运行

[root@linux-node1 ~]# docker run -it –name test1 –volumes-from nfs centos #这个test1的容器的/data目录实际上是挂在的nfs的/data目录,如果在nfs容器的data目录下写东西,test1的data目录是可以看到的

总结

数据卷:类似于nfs

-v /data (/data是容器里面目录)

-v src:dst (指定目录,将物理机的目录,挂在到容器中的哪一个目录)

数据卷容器(让一个容器访问另一个容器的卷)

–volumes-from
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: