docker
常见容器
web容器/web中间件: nginx apache html php java tomcat python
nginx+tomcat+jdk (weblogic)
nginx+php-fpm
nginx+uwsgi+django
mycat mysql-proxy
容器:应用封装和交付
Cgroups(Ccontrol Groups)-资源管理 NameSpace-进程隔离 SELinux安全
docker ---轻量级虚拟机,共享宿主机内核,秒级启动,基于进程隔离
rd开发产品(在docker容器里配置开发环境)
把容器打包成镜像,运维上线
docker支持将应用打包进一个可以移植的容器中,核心理念:Build once ,Run anywhere
> 标准化应用发布,docker容器包含了运行环境和可执行程序,可跨平台主机使用
> 节约时间,快速部署和启动,VM启动是分钟级别,docker容器是秒级
> 节约成本,一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到M级
> 方便持续集成,通过与代码进行关联是持续集成非常方便
> 可以作为集群系统的清量主机或节点
> 方便构建基于SOQ架构或微服务架构的系统,通过服务编排,更好的松耦合
CI/CD 持续集成/持续发布
rd(开发功能代码--git)--->git主库--->jenkins服务器(git)--->maven(编译打包测试)--->sshpush(发布代码到线上服务器--->远程执行线上服务器的发布脚本
docker优势
>交付标准化
>一次构建,多次交付
>应用隔离
docker3大核心组件
Docker镜像(images):类似于虚拟机的镜像,是一个面向Docker引擎的只读模板,包含了文件系统。
Docker容器(repository):通过Docker镜像实例化的一个可运行的简易版的Linux系统环境。
Docker仓库(containers):是Docker集中存放镜像文件的场所。
公有库:docker.io
私有库:
docker国内仓库:
- aliyun
-daocloud.io
.quay.io
hub.docker.com
docker镜像加速:
vim /etc/docker/daemon.json { 'registry-mirror': ['https://registry.docker-cn.com'] }
下载镜像
[root@docker ~]# docker pull daocloud.io/library/centos:7 [root@docker ~]# docker pull daocloud.io/library/nginx:latest [root@docker ~]# docker images # 查看已有的docker镜像
centos:7(父镜像)----run容器---安装nginx---打包成镜像(子镜像)---run容器
Dcoker镜像的构建
Docker镜像构建的意义:
构建镜像,可以保存对容器的设置、修改,并可移植化的使用;提供了自定义镜像的能力,以软件的形式打包并奋发服务及运行环境
构建镜像的方法:
docker commit:通过容器构建
docker build:通过Dockerfile文件构建
docker四种网络模式
1 host模式 Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 2 container模式 在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。 3 none模式 这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 4 bridge模式 bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。host模式 使用Docker run时使用–net=host指定 Docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。
基本使用
docker info # 产看docker基本信息
docker images # 查看镜像
docker ps -q # 只查看镜像id
docker ps-l # 列出最近一次启动的容器 docker search centos # 查找镜像 docker help search # 查找帮助 man docker-search # 帮助 docker inspect # 查看底层信息 docker push img # 上传镜像 docker pull img # 下载镜像 docker history img # 查看镜像历史 docker tag # 修改镜像名称和标签(实际上类似于软连接)
镜像的备份与恢复
[root@docker02 ~]# docker save busybox:latest >busybox.tar # 备份 名称:标签==唯一
[root@docker01 ~]# docker load < busybox.tar # 恢复
[root@docker01 ~]# docker rmi busybox:latest # 删除镜像
启动镜像生成容器
#[root@docker01 docker_images]# docker run -it img_name:img_tag cmd # cmd 为容器内命令 [root@docker01 docker_images]# docker run -it centos:latest /bin/bash [root@e00f4e1276ff /]# [root@docker01 ~]# docker run -it busybox # 没写命令则运行默认命令,没写标签则使用默认标签latest / #
查看正在运行中的容器
[root@docker01 ~]# docker ps # docker ps -a #显示所有容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 070016611b64 nginx "/bin/bash" 7 seconds ago Up 4 seconds 80/tcp, 443/tcp modest_curie
docker start | stop | restart # 启动/关闭/重启动容器
docker run
-i 交互
-t 终端
-d 后台进程
docker attach|exec # 进入容器
docker top # 查看容器进程列表
docker rm # 删除容器
docker ps -aq # 只显示id
docker rm $(docker ps -aq) # 批量删除 (将docker ps -aq的结果做为docker rm 的参数
docker cp localpath contaniner:path # 将本地的文件拷贝到docker容器中
docker cp containner:path localpath
[root@docker01 ~]# docker run -itd nginx [root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5d4c08e376a9 nginx "nginx -g 'daemon off" 17 seconds ago Up 14 seconds 80/tcp, 443/tcp small_mirzakhani [root@docker01 ~]# docker inspect 5d4c08e376a9 [root@docker01 ~]# curl 172.17.0.2
[root@docker01 ~]# docker top 5d4c08e376a9 ★ --虚拟机--★ UID PID PPID C STIME TTY TIME CMD root 4575 4562 0 16:46 pts/2 00:00:00 nginx: master process nginx -g daemon off; 104 4591 4575 0 16:46 pts/2 00:00:00 nginx: worker process
docker exec # 进入容器
[root@docker01 ~]# docker run -itd centos 9129436603f4a513c0a798820305457981d002096ff0921dee7feb57364a393f [root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9129436603f4 centos "/bin/bash" 8 seconds ago Up 6 seconds gigantic_leakey 5d4c08e376a9 nginx "nginx -g 'daemon off" 23 minutes ago Up 23 minutes 80/tcp, 443/tcp small_mirzakhani [root@docker01 ~]# docker exec -it 9129436603f4 /bin/bash [root@9129436603f4 /]# ps -efww UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:09 ? 00:00:00 /bin/bash root 14 0 0 09:10 ? 00:00:00 /bin/bash root 26 14 0 09:11 ? 00:00:00 ps -efww
docker attach # 进入容器 ,退出会关闭容器
ctrl+PQ # 退出