lyl801013 发表于 2018-5-28 09:01:00

CentOS7系统下docker的安装配置及使用详解

   Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器。它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致 dotCloud 把它重命名到 Docker Inc。它最初是用 Go 语言编写的,它就相当于是加在 LXC(LinuX Containers,linux 容器)上的管道,允许开发者在更高层次的概念上工作。
    Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC, cgroups 和 Linux 自己的内核。和传统的虚拟机不同的是,一个 Docker 容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。
    Docker类似虚拟机的概念,但是与虚拟化技术的不同点在于下面几点:
    1.虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,利用操作系统的containerization技术,所以docker甚至可以在虚拟机上运行。
    2.虚拟化系统一般都是指操作系统镜像,比较复杂,称为“系统”;而docker开源而且轻量,称为“容器”,单个容器适合部署少量应用,比如部署一个redis、一个memcached。
    3.传统的虚拟化技术使用快照来保存状态;而docker在保存状态上不仅更为轻便和低成本,而且引入了类似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。
    4.传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力;而docker可以通过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile可以手动编写,这样应用程序开发人员可以通过发布Dockfile来指导系统环境和依赖,这样对于持续交付十分有利。
    5.Dockerfile可以基于已经构建好的容器镜像,创建新容器。Dockerfile可以通过社区分享和下载,有利于该技术的推广。
    Docker 会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种 Linux 服务器上。这大大地提高了程序运行的灵活性和可移植性,无论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。
    Docker也是一个云计算平台,它利用Linux的LXC、AUFU、Go语言、cgroup实现了资源的独立,可以很轻松的实现文件、资源、网络等隔离,其最终的目标是实现类似PaaS平台的应用隔离。
    Docker 由下面这些组成:
    1. Docker 服务器守护程序(server daemon),用于管理所有的容器。
    2. Docker 命令行客户端,用于控制服务器守护程序。
    3. Docker 镜像:查找和浏览 docker 容器镜像。
2 docker特性
    文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
    资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
    网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
    写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
    日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
    变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
    交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
3 两个基础概念images与container
    Container和Image 在Docker的世界里,Image是指一个只读的层(Layer),这里的层是AUFS里的概念
    Docker使用了一种叫AUFS的文件系统,这种文件系统可以让你一层一层地叠加修改你的文件,最底下的文件系统是只读的,如果需要修改文件,AUFS会增加一个可写的层(Layer),这样有很多好处,例如不同的Container可以共享底层的只读文件系统(同一个Kernel),使得你可以跑N多个Container而不至于你的硬盘被挤爆了!这个只读的层就是Image!而如你所看到的,一个可写的层就是Container。
    那Image和Container的区别是什么?很简单,他们的区别仅仅是一个是只读的层,一个是可写的层,你可以使用docker commit 命令,将你的Container变成一个Image,也就是提交你所运行的Container的修改内容,变成一个新的只读的Image,这非常类似于git commit命令。
4 docker安装与启动


  CentOS 操作系统安装 Docker
  系统要求
  Docker 最低支持 CentOS 7。
  Docker 需要安装在 64 位的平台,并且内核版本不低于 3.10。 CentOS 7 满足最低
  内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无
  法使用,并且部分功能可能不太稳定。
  使用脚本自动安装
  Docker 官方为了简化安装流程,提供了一套安装脚本,CentOS 系统上可以使用这
  套脚本安装:
  curl -sSL https://get.docker.com/ | sh
  执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 安装在系
  统中。
  不过,由于伟大的墙的原因,在国内使用这个脚本可能会出现某些下载出现错误的
  情况。国内的一些云服务商提供了这个脚本的修改版本,使其使用国内的 Docker
  软件源镜像安装,这样就避免了墙的干扰。
  阿里云的安装脚本
  curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
  DaoCloud 的安装脚本
  curl -sSL https://get.daocloud.io/docker | sh
  手动安装
  CentOS
  添加内核参数
  默认配置下,在 CentOS 使用 Docker 可能会碰到下面的这些警告信息:
  WARNING: bridge-nf-call-iptables is disabled
  WARNING: bridge-nf-call-ip6tables is disabled
  添加内核配置参数以启用这些功能。
  $ sudo tee -a /etc/sysctl.conf <<-EOF
  net.bridge.bridge-nf-call-ip6tables = 1
  net.bridge.bridge-nf-call-iptables = 1
  EOF
  然后重新加载 sysctl.conf 即可
  $ sudo sysctl -p
  添加 yum 源
  虽然 CentOS 软件源 Extras 中有 Docker,名为 docker ,但是不建议使用系
  统源中的这个版本,它的版本相对比较陈旧,而且并非 Docker 官方维护的版本。
  因此,我们需要使用 Docker 官方提供的 CentOS 软件源。
  执行下面的命令添加 yum 软件源。
  $ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
  
  name=Docker Repository
  baseurl=https://yum.dockerproject.org/repo/main/centos/7/
  enabled=1
  gpgcheck=1
  gpgkey=https://yum.dockerproject.org/gpg
  EOF
  安装 Docker
  更新 yum 软件源缓存,并安装 docker-engine 。
  $ sudo yum update
  $ sudo yum install docker-engine
  开启并设置开机启动
  #systemctl start docker
  #systemctl enable docker
  
  5.镜像加速器
  国内访问 Docker Hub 有时会遇到困难,此时可以配置镜像加速器
  
  对于使用 systemd 的系统,用 systemctl enable docker 启用服务后,编辑
  /etc/systemd/system/multi-user.target.wants/docker.service 文件,找
  到 ExecStart= 这一行,在这行最后添加加速器地址 --registry-mirror=<加速器地址> ,如:
  ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com
  注:对于 1.12 以前的版本, dockerd 换成 docker daemon 。
  重新加载配置并且重新启动。
  $ sudo systemctl daemon-reload
  $ sudo systemctl restart docker
  

  基本信息查看
  docker version:查看docker的版本号,包括客户端、服务端、依赖的Go等
  
# docker version
Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.2
Git commit (client): 63fe64c/1.0.0
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.2
Git commit (server): 63fe64c/1.0.0

    docker info :查看系统(docker)层面信息,包括管理的images, containers数等
# docker info
Containers: 16
Images: 40
Storage Driver: devicemapper
Pool Name: docker-253:0-1183580-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 2180.4 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 3.4 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: lxc-0.9.0
Kernel Version: 2.6.32-431.el6.x86_64


5 镜像的获取与容器的使用
    镜像可以看作是包含有某些软件的容器系统,比如ubuntu就是一个官方的基础镜像,很多镜像都是基于这个镜像“衍生”,该镜像包含基本的ubuntu系统。再比如,hipache是一个官方的镜像容器,运行后可以支持http和websocket的代理服务,而这个镜像本身又基于ubuntu。
搜索镜像
    docker search <image>:在docker index中搜索image
  
# docker search ubuntu12.10
NAME                        DESCRIPTION                                     STARS   OFFICIAL   AUTOMATED
mirolin/ubuntu12.10                                                         0
marcgibbons/ubuntu12.10                                                   0
mirolin/ubuntu12.10_redis                                                   0
chug/ubuntu12.10x32         Ubuntu Quantal Quetzal 12.10 32bitbase i...   0
chug/ubuntu12.10x64         Ubuntu Quantal Quetzal 12.10 64bitbase i...   0


下载镜像
    docker pull <image> :从docker registry server 中下拉image
  
# docker pull chug/ubuntu12.10x64
dockerpull时候报错:
Error pulling image (latest) from docker.io/library/registry
原因:
由于国内防火墙屏蔽了docker的服务器,没办法,我们只能翻墙进行下载!
需要做以下几个步骤
1.搭建自己的代理服务器,我这里用的是美国的VPS搭建了一个apache的代理
2.在运行docker时候,需要通过代理进行下载

搭建apache代理服务器
#vim /etc/httpd/conf/httpd.conf
Listen 81
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Deny from all
Allow from all
</Proxy>
</IfModule>
#service httpd restart

通过apache代理docker
#systemctl stopdocker
#HTTP_PROXY=http://proxy_server:ip docker -d

通过上面代理就能正常访问docker服务器了
查看镜像
    docker images: 列出images
    docker images -a :列出所有的images(包含历史)
    docker images --tree :显示镜像的所有层(layer)
    docker rmi<image ID>: 删除一个或多个image
  
# docker images
REPOSITORY            TAG               IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64   latest            0b96c14dafcd      4 months ago      270.3 MB
# docker images -a
REPOSITORY            TAG               IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64   latest            0b96c14dafcd      4 months ago      270.3 MB
<none>                <none>            31edfed3bb88      4 months ago      175.8 MB
# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
└─31edfed3bb88 Virtual Size: 175.8 MB
└─0b96c14dafcd Virtual Size: 270.3 MB Tags: chug/ubuntu12.10x64:latest
# docker rmi <image ID> ....


使用镜像创建容器
  
# docker run chug/ubuntu12.10x64/bin/echo hello world
hello world

    交互式运行
# docker run -i -t chug/ubuntu12.10x64/bin/bash
root@2161509ff65e:/#
注意 有时候打开有个问题,命令行不显示当前用户和路径。
只显示:
-bash-4.1#11简单,配置文件不全而已。
下面对其重新设置,需要设置两个文件:~/.bashrc和~/.bash_profile
bashrc
在当前目录下新建.bashrc文件:
  bash-4.2$ touch ~/.bashrc
  bash-4.2$ vi ~/.bashrc
  并输入以下数据

  # .bashrc
  # Source global definitions
  if [ -f /etc/bashrc ]; then
  . /etc/bashrc
  fi
  # User specific aliases and functions
source以下使得其生效:
# source ~/.bashrc
bash_profile
在当前目录下新建.bash_profile文件:
  $ touch ~/.bash_profile
  $ vi ~/.bash_profile
并输入以下数据
  # .bssh_profile
  # Get the aliases and functions
  if [ -f ~/.bashrc ]; then
  . ~/.bashrc
  fi
source以下使得其生效:
# source ~/.bash_profile
可以看到已经能成功显示当前用户和路径了
查看容器
    docker ps :列出当前所有正在运行的container
    docker ps -l :列出最近一次启动的container
    docker ps -a :列出所有的container(包含历史,即运行过的container)
    docker ps -q :列出最近一次运行的container ID
  
# docker ps
CONTAINER ID      IMAGE                        COMMAND             CREATED             STATUS            PORTS               NAMES
ccf3de663dc9      chug/ubuntu12.10x64:latest   /bin/bash         22 hours ago      Up 22 hours                           sharp_hypatia
# docker ps -l
CONTAINER ID      IMAGE                        COMMAND             CREATED             STATUS                     PORTS               NAMES
f145f184647b      chug/ubuntu12.10x64:latest   /bin/bash         6 seconds ago       Exited (0) 3 seconds ago                     compassionate_galileo
# docker ps -a
CONTAINER ID      IMAGE                        COMMAND             CREATED             STATUS                        PORTS               NAMES
f145f184647b      chug/ubuntu12.10x64:latest   /bin/bash         30 seconds ago      Exited (0) 26 seconds ago                         compassionate_galileo
f4624b42fe7e      chug/ubuntu12.10x64:latest   /bin/bash         2 minutes ago       Exited (0) 2 minutes ago                        sharp_wilson
ccf3de663dc9      chug/ubuntu12.10x64:latest   /bin/bash         22 hours ago      Up 22 hours                                       sharp_hypatia
9cbaa79b9703      chug/ubuntu12.10x64:latest   /bin/bash         22 hours ago      Exited (127) 36 minutes ago                     berserk_mcclintock
2161509ff65e      chug/ubuntu12.10x64:latest   /bin/bash         22 hours ago      Exited (0) 22 hours ago                           backstabbing_mclean
# docker ps -q
ccf3de663dc9


再次启动容器
    docker start/stop/restart <container> :开启/停止/重启container
    docker start :再次运行某个container (包括历史container)
    docker attach :连接一个正在运行的container实例(即实例必须为start状态,可以多个窗口同时attach 一个container实例)
    docker start -i <container> :启动一个container并进入交互模式(相当于先start,在attach)
    docker run -i -t <image> /bin/bash :使用image创建container并进入交互模式, login shell是/bin/bash
    docker run -i -t -p <host_port:contain_port> :映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。
    注:使用start是启动已经创建过得container,使用run则通过image开启一个新的container。
删除容器
    docker rm <container...> :删除一个或多个container
    docker rm `docker ps -a -q` :删除所有的container
    docker ps -a -q | xargs docker rm :同上, 删除所有的container
6 持久化容器与镜像
6.1 通过容器生成新的镜像
    运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit <container-id> <image-name>命令可以把一个正在运行的容器变成一个新的镜像。
    docker commit <container> 将一个container固化为一个新的image,后面的repo:tag可选。
  
# docker images
REPOSITORY            TAG               IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64   latest            0b96c14dafcd      4 months ago      270.3 MB
# docker commit d0fd23b8d3ac chug/ubuntu12.10x64_2
daa11948e23d970c18ad89c9e5d8972157fb6f0733f4742db04219b9bb6d063b
# docker images
REPOSITORY            TAG               IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64_2   latest            daa11948e23d      6 seconds ago       270.3 MB
chug/ubuntu12.10x64   latest            0b96c14dafcd      4 months ago      270.3 MB


6.2 持久化容器
    export命令用于持久化容器
    docker export <CONTAINER ID> > /tmp/export.tar
6.3 持久化镜像

    Save命令用于持久化镜像
    docker save 镜像ID > /tmp/save.tar
6.4 导入持久化container

    删除container 2161509ff65e
    导入export.tar文件

  
# cat /tmp/export.tar | docker import - export:latest
af19a55ff0745fb0a68655392d6d7653c29460d22d916814208bbb9626183aaa
# docker images
REPOSITORY            TAG               IMAGE ID            CREATED             VIRTUAL SIZE
export                  latest            af19a55ff074      34 seconds ago      270.3 MB
chug/ubuntu12.10x64_2   latest            daa11948e23d      20 minutes ago      270.3 MB
chug/ubuntu12.10x64   latest            0b96c14dafcd      4 months ago      270.3 MB


6.5 导入持久化image
    删除image daa11948e23d
    导入save.tar文件

  
# docker load < /tmp/save.tar

    对image打tag
# docker tag daa11948e23d load:tag



6.6 export-import与save-load的区别
    导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag <LAYER ID> <IMAGE NAME>来回滚之前的层)。


    6.7 一些其它命令
    docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行
    docker inspect $CONTAINER_ID #docker inspect <image|container> 查看image或container的底层信息
    docker build <path> 寻找path路径下名为的Dockerfile的配置文件,使用此配置生成新的image
    docker build -t repo[:tag] 同上,可以指定repo和可选的tag
    docker build - < <dockerfile> 使用指定的dockerfile配置文件,docker以stdin方式获取内容,使用此配置生成新的image
    docker port <container> <container port> 查看本地哪个端口映射到container的指定端口,其实用docker ps 也可以看到
7 一些使用技巧
7.1 docker文件存放目录
    Docker实际上把所有东西都放到/var/lib/docker路径下了。
  
# ls -F
containers/devicemapper/execdriver/graph/init/linkgraph.dbrepositories-devicemappervolumes/

    containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。
7.2查看root密码
    docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root用户的密码了。
  
docker logs 5817938c3f6e 2>&1 | grep 'User: ' | tail -n1
  
页: [1]
查看完整版本: CentOS7系统下docker的安装配置及使用详解