首页 > 其他 > 详细

docker-基础

时间:2021-01-16 21:56:24      阅读:24      评论:0      收藏:0      [点我收藏+]

一、Docker

1、概述


1.1、容器

  • 容器技术已经成为应用程序封装和交付的核心技术
  • 由于容器是在物理机上实施隔离的一个环境,启动一个容器,可以像启动一个进程一样快
  • 相比传统的虚拟化技术,容器更加简洁高效
  • 容器技术的核心有以下几个内核技术组成
    • Cgroups(Control Groups)————资源管理
    • NameSpace————进程隔离
    • SELinux————安全

容器的6大命名空间

  • 主机名
  • 文件系统filesystem:你的根不是我的根
  • 用户
  • 进程
  • 信号
  • 网络

1.2、Docker

  • Docker 是完整的一套容器管理系统
  • Docker 提供了一组命令,可以让用户更加方便的直接地使用容器技术,而不需要过多关心底层内核技术

docker 三大核心概念

  • 镜像
  • 容器
  • 仓库

Docker 的优点

  • 相比于传统的虚拟化技术,容器更加简洁高效
  • 容器可使用共享公共库和程序
  • 容器不需要安装操作系统(传统虚拟机需要给每个VM安装操作系统)

Docker 的缺点

  • 容器的隔离性没有虚拟化强
  • 共用LINUX内核,安全性有先天缺陷
  • SELinux 难以驾驭
  • 不支持跨平台
  • 监控容器和容器排错是挑战

云平台,总的来说分为两部分:私有云(openstack),弹性云(DOCKER)

Docker一般是结合私有云openstack放在一起用,是与openstack是互补的技术。一般是在云主机里面,部署docker。

Docker应用封装,是其弹性的本质。


2、部署Docker


安装前准备

  • 操作系统需要是 64 位
  • 至少RHEL6.5以上版本,强烈推荐RHEL7(或内核升级为3以上)
  • 关闭防火墙(非必须,但是在不精通前无法手动配置好)
  • docker 软件包位于光盘 RHEL7-extras.iso 中
]# yum -y install docker
]# systemctl start docker
]# systemctl enable docker
  • 帮助
]# docker                        # 直接回车查看全部命令
]# docker help search            # 查看search命令的简单使用
]# man docker-search             # 查看详细的

3、docker 镜像


3.1、镜像

  • 在Docker 中容器是基于镜像启动的
  • 镜像就是启动容器的模板
  • 镜像启动后的环境就是容器
  • 所以,镜像是启动容器的核心

启用容器,可以理解为将镜像当成一个后端盘,以镜像为模板创建一个前端盘,运行

  • 所有的镜像在docker中是只读的
  • 镜像采用的是分层设计(后端盘、前端盘)
  • 使用快照的COW(写时复制)技术,确保底层数据不丢失

3.2、Docker hub 镜像仓库

]# docker search contos                  # 在镜像仓库中搜索镜像
]# docker search nginx
]# docker search busybox

]# docker search contos	
INDEX      NAME                        DESCRIPTION            STARS     OFFICIAL
docker.io  docker.io/centos   The official build of CentOS.   5665      [OK]   

# 注意:搜索出来的镜像,在OFFICIAL显示[OK]的为官方镜像,否则为非官方。

4、Docker基本命令


4.1、镜像命令

docker  images                   # 查看镜像列表
docker  history                  # 查看镜像制作历史(主要是看落了几层后端盘)
docker  inspect                  # 查看镜像底层信息

docker  pull                  # 下载镜像
docker  push                  # 上传镜像
docker  rmi                   # 删除本地镜像

docker  save                  # 镜像另存为tar包
docker  load                  # 使用tar包导入镜像
docker	search                # 搜索镜像

docker	tag                  # 修改镜像名称和标签
  • images
]# docker images
REPOSITORY              TAG          IMAGE ID          CREATED            SIZE
docker.io/centos        latest       76d6bc25b8a5      13 months ago      199.7 MB
‘镜像仓库/名称           镜像标签      镜像ID            创建时间            大小
  • pull 、push
]# docker pull docker.io/busybox              # 下载镜像
]# docker images                              # 下载后即可查看到该镜像
REPOSITORY              TAG          IMAGE ID          CREATED            SIZE
docker.io/busybox       latest       020584afccce      12 days ago        1.22 MB


]# docker push  docker.io/busybox            # 上传本地镜像到仓库
  • save、load
]# docker save docker.io/busybox:latest -o busybox.tar      # 将已有镜像另存为tar包

]# docker load -i busybox.tar                              # 将tar包镜像导入
  • history
]# docker history docker.io/contos                  # 了解镜像的制作过程
IMAGE          CREATED          CREATED BY                                      SIZE       
76d6bc25b8a5   13 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B 
<missing>      13 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sch   0 B
<missing>      13 months ago    /bin/sh -c #(nop) ADD file:8f4b3be0c1427b158f   199.7 MB
  • inspect
]# docker inspect docker.io/centos
  • rmi
]# docker rmi docker.io/centos
  • tag
`镜像的唯一标识是:名称+标签
在表示镜像时的书写为:名称:标签			# 如:busybox:latest
‘latest:这是默认标签。‘
‘ID:就相当于名称+标签的hash值。(所以,ID也可作为标识)‘

]# docker tag 旧的 新的
]# docker tag  docker.io/centos:latest	cen:v1

]# docker images					# 查看镜像
REPOSITORY          TAG          IMAGE ID          CREATED            SIZE
cen                 v1	       020584afccce        12 days ago        1.22 MB


4.2、容器命令

docker	run                        # 运行容器
docker	attach | exec              # 进入容器
docker	rm                         # 删除容器

docker	ps	[-a|-q]            # 查看正在运行的容器列表。-a所有的,-q仅显示容器id
docker	top                        # 查看容器进程
docker	inspect                    # 查看容器底层信息

docker	start                      # 启动容器
docker	stop                       # 关闭容器
docker	restart                    # 重启容器
  • run
`run 命令包含了两个功能:create、start。即先创建,再启动。
-i                  # 交互式
-t                  # 表示终端
-it                 # 即启用交互式终端
-d                  # 在后台分离运行容器

-v /data:/data      # 映射卷。<宿主机卷>:<容器卷>

-p 80:80            # 将真机端口与容器端口绑定
-p 宿主机端口:容器端口

只要有提前封装好的镜像,就可以快速发布服务。这也就是docker弹性云的本质
---------------------------------------------------------------------------------

]# docker run  -it  docker.io/centos:latest  /bin/bash			# /bin/bash是容器内的命令
]# docker run  -it  docker.io/centos				
# 当标签是默认的latest时可省略,当不知道容器内命令时,也可不写,每个容器的镜像会有一个默认的启动命令。

]# docker run  -itd  docker.io/nginx
# 当启动的是一个服务时,一般默认启动命令是启动一个守护进程,无法直接交互,加-d 能放入后台,或者是选择一个容器内的其它命令进行启动容器。
  • start、stop、restart
`管理容器的唯一标识是ID,通过start、stop、restart 可以管理正在 运行中 的容器状态
]# docker start ID                  # 当容器在后台已经运行进,进入容器的命令。
]# docker stop ID
]# docker restart ID

  • rm
rm 支持参数回调,即将下一条命令参数返回给 rm 
用法:
]# docker rm $(docker ps -qa)                         # 将所有的容器ID输出作为参数,回传给 rm 命令
]# docker rm $(docker stop ID)                        # 当容器在运行时,无法删除,需要先停止,再删除
]# docker rm $(docker stop $(docker ps -qa) )
  • attach、exec
attach                  # 进入容器,exit会导致容器关闭  	Ctrl+p+q退出则不关闭
exec                    # 进入容器,退出时不会关闭容器

]# docker attach ID                   # 以上帝进程进入容器(一般不采用)
]# docker exec -it ID  /bin/bash      # 单独启动一个进程进入容器
  • top
‘常规情况下,由于容器相当于一个进程,是隔离的,当容器运行的数量多时,查看容器中运行的进程,是无法直接在真实机上运行命令:ps -ef 进行查看容器内的进行,这时,就需要用到:docker top 命令了。
top 可以让真实机环境下查看运行中容器的进程。‘

]# docker top ID


二、Docker 相关

1、自定义镜像


1.1、自定义镜像

  • 使用镜像启动容器,在该容器基础上修改
  • 然后将修改后的容器另存为一个新的镜像
‘格式:docker commit ID 新镜像名:标签‘

]# docker run -it docker.io/contos:latest /bin/bash		# 进入容器执行一些操作(增、删)
]# docker ps 
]# docker commit 8d20kdi3o  docker.io/myos:latest		# 创建新镜像

1.2、Dockerfile

  • Dockerfile 相当于编写一个自动创建新镜像的脚本。
‘Dockerfile 语法格式
FROM                              # 基础镜像
MAINTAINER                        # 镜像创建者信息
EXPOSE                           # 开放的端口
ENV                              # 设置变量
ADD                              # 复制本地文件到镜像
RUN                              # 制作镜像时在容器里面执行的命令,可以有多个
WORKDIR                          # 定义容器默认工具目录
CMD                              # 容器启动时默认执行的命令,仅可以有一条CMD
-----------------------------------------------------------------------------------
CMD  ["/bin/ls","-l","-a"]       # 假如启动命令为:~]# ls -l -a。要用引号,空格用逗号代替。不能有空格

Dockerfile 案例

]# docker build -t 新镜像名:标签	Df的路径            # 通过Dockerfile创建新镜像
-----------------------------------------------------------------------------------
]# cd /root/
]# vim Dockerfile
FROM      docker.io/centos:latest
RUN       rm -rf /etc/yum.repos.d/*
ADD       local.repo  /etc/yum.repos.d/local.repo
RUN       yum -y install  net-tools  vim  psmisc  bash-completion  iproute

]# docker build -t  myio:latest .		# 点为当前目录
]# vim Dockerfile                  # 名称必须为Dockerfile
FROM  docker.io/myos:latest
MAINTAINER shun s_linux@sina.com
RUN  yum -y install httpd
ENV  env
ADD  /root/index.html  /var/www/html/index.html       # 此命令等效下面两条命令
WORKDIR  /var/www/html/	                              # 相当于cd 到此目录下,再执行下面的命令
ADD      index.html index.html                        # 将当前目录下的文件,拷贝到,上一条命令指定的路径
EXPOSE      80
EXPOSE      443
CMD      ["http","-DFOREGROUND"]


`这是创建HTTP服务的镜像,由于镜像中一般是没有systemctl命令的,但是作为服务镜像,一般要求启动容器时默认命令是为启动服务的。所以,需要查看httpd.service这个文件中是怎么定义启动服务,然后通过该文件中的启动命令进行启动该服务。
]# rpm -ql httpd | grep httpd.service
/usr/lib/systemd/system/httpd.service

]# vim /usr/lib/systemd/system/httpd.service
EnvironmentFile=/etc/sysconfig/httpd                        # 参数文件
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND             # 启动命令

2、自定义仓库


2.1、仓库服务配置

  • 用于提供仓库服务
]# yum -y install docker-distribution
]# systemctl start docker-distribution
]# systemctl enable docker-distribution
]# ss -tunpl                  # 端口是:5000
Netid  State      Recv-Q Send-Q Local Address:Port
tcp    LISTEN     0      128             :::5000 


‘不需要修改配置。‘
/etc/docker-distribution/registry/config.yml	# 仓库配置文件
/var/lib/registry                               # 数据存储路径


2.2、客户端配置

]# vim /etc/sysconfig/docker				
 13 ADD_REGISTRY=‘--add-registry 192.168.1.30:5000‘                  # 改为指定的私有仓库
 24 INSECURE_REGISTRY=‘--insecure-registry 192.168.1.30:5000‘        # 不加密访问仓库。
`一般私有仓库是建立在内网的,是自用的,可不用加密

]# systemctl restart docker

2.3、上传镜像

上传步骤为:先打标签,再上传
‘格式:‘
]# dcoker tag  本地镜像名:标签  仓库IP:5000/镜像名:标签
]# docker push 仓库IP:5000/镜像名:标签


‘例‘
]# docker tag  myio:latest  192.168.1.30:5000/myio:latest
]# docker push  192.168.1.30:5000/myio:latest

2.4、直接用仓库镜像

格式:
]# docker run -it  仓库IP:5000/镜像名:标签


]# docker run -it 192.168.1.30:5000/myio:latest            # 第一次启动时会下载

2.5、查看仓库镜像

]# curl  http://仓库IP:5000/v2/_catalog                    # 查看仓库里的镜像
]# curl  http://仓库IP:5000/v2/镜像名/tags/list            # 查看镜像标签


]# curl  http://192.168.1.30:5000/v2/_catalog
  {"repositories":["docker.io/busybox","docker.io/myos"]}
]# curl  http://192.168.1.30:5000/v2/docker.io/busybox/tags/list 
  {"name":"docker.io/busybox","tags":["latest"]}
]# curl  http://192.168.1.30:5000/v2/docker.io/myos/tags/list 
  {"name":"docker.io/myos","tags":["http"]}

3、持久化存储


  • 在Docker 容器中是不保持任何数据的。一旦关闭则所有数据就会被清除
  • 所以,重要数据需要使用外部卷存储,以达到数据持久化
  • 容器可以挂载真实机目录或共享存储为卷

3.1、主机卷的映射

  • 将真实机的目录挂载到容器中
    • 目录不存在则自动创建
    • 目录存在则直接覆盖掉
]# docker run -v /data:/data  -it docker.io/contos  bash
# 将本机的目录/data 映射到容器中的目录/data 
-v  映射磁盘到容器中


3.2、共享存储的映射

  • 首先将外部共享存储挂载到容器所在的真机,再将真机的挂载目录映射到容器中
`NFS 服务器部署192.168.1.254
]# yum -y install nfs-utils
]# mkdir /content
]# chmod 777 /content
]# vim /etc/exports
/content		*(rw,no_root_squash)

]# systemctl start nfs-server
]# exports -rv                        # 查看共享情况
exporting 	 *:/content

  • 容器所在真机挂载
]# yum -y install nfs-utils
]# systemctl restart nfs-server
]# showmount -e  [NFS服务器IP]            # 查看NFS共享
Export list for 192.168.1.254:
/content *

]# mount -t nfs -o rw 192.168.1.254:/content  /mnt

]# mount -l                  # 查看挂载情况
  • 真机映射到容器
]# docker run -p 80:80  -v /mnt:/var/www/html/  -itd docker.io/myos:http

-p 80:80                  # 将真机端口与容器端口绑定
-p 宿主机端口:容器端口

4、创建网桥


4.1、网桥

  • docker 的默认网桥是docker0 ,相当于一个交换机。
    • bridge:桥接(大部分都使用这种)
    • host 寻主机
    • null 无网络
]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
f494d1a5631e        bridge              bridge              local               
212902dda0cf        host                host                local               
643aec0181a4        none                null                local  

]# ip a s docker0
]# brctl show docker0            # 启动容器会绑定该网桥

4.2、创建网桥

  • 当我们的容器运行多个时,可能需要更加复杂的容器网络环境
  • 这时就可以另外再创建多个自定义的网桥,以区分不同的网络需求
  • 如以下拓扑图
    • 容器1、2能通,容器3、4能通,但是,1、2与3、4不能通
      技术分享图片
]# docker network create --subnet=10.10.10.0/24  docker1	# 创建一个新的网桥docker1

4.3、分配网桥

  • 分配网桥:要在启用容器时指定
‘分配默认网桥docker0‘
]# docker run --network=docker0 -it myos:latest      # 一般如果是默认网桥是可以不写的。
]# docker run -it docker.io/centos:latest


‘分配网桥docker1
]# dcoker run --network=docker1 -it nginx:latest
]# docker run --network=docker1 -it httpd:latest

docker-基础

原文:https://www.cnblogs.com/SHUN-The-Unique-Soul/p/14287220.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!