1、项目1 Docker容器安装和使用通过本章了解Docker的安装,镜像Image、镜像仓库Registry和容器Container的使用和管理。目录任务2.1 Docker安装 任务1.2 Docker 镜像任务1.3 Docker 容器任务2.1 Docker安装2.1.1 CentOS 操作系统安装 Docker系统要求Docker最低支持CentOS 7,Docker 需要安装在 64 位的平台,并且内核版本不低于 3.10。CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。手动安装(1)添加内核参
2、数编辑配置文件/etc/sysctl.conf,将以下内容添加rootclient#vi/etc/sysctl.confnet.ipv4.ip_forward=1net.ipv4.conf.default.rp_filter=0net.ipv4.conf.all.rp_filter=0任务2.1 Docker安装(2)重新加载 sysctl.conf rootlocalhost#sysctl-pnet.ipv4.ip_forward=1net.ipv4.conf.default.rp_filter=0net.ipv4.conf.all.rp_filter=0(3)删除iptables防火墙规则
3、并保存$iptables F$iptables X$iptables Z$/usr/sbin/iptables-save任务2.1 Docker安装2.12添加 yum 源rootregistry#cat/etc/yum.repos.d/yum.repo centosname=centosbaseurl=ftp:/10.0.0.254/file/cr/2017/centos7.2/gpgcheck=0enabled=1iaasname=iaasbaseurl=ftp:/10.0.0.254/file/cr/2017/iaas/iaas-repo/gpgcheck=0enabled=1任务2.1
4、 Docker安装配置DNS服务器地址rootclient#vi/etc/resolv.conf generated by/usr/sbin/dhclient-scriptsearch openstacklocalnameserver 114.114.114.114nameserver 223.5.5.5配置仓库地址所有节点配置/etc/sysconfig/docker文件修改如下配置(配置仓库地址)ADD_REGISTRY=-add-registry 10.0.6.83:5000INSECURE_REGISTRY=-insecure-registry 10.0.6.83:5000 任务2.1
5、 Docker安装使用DaoCloud 加速器rootclient#curl-sSL https:/get.daocloud.io/daotools/set_mirror.sh|sh-s http:/ef0cb1d0.m.daocloud.ioSuccess.You need to restart docker to take effect:sudo systemctl restart docker rootclient#sudo systemctl restart docker 任务2.1 Docker安装更新系统$yum update安装docker-iorootregistry#yum-
6、y install docker-ioLoaded plugins:fastestmirrorbase|3.6 kB 00:00:00 centos|3.6 kB 00:00:00 extras|3.4 kB 00:00:00 iaas|2.9 kB 00:00:00 .systemd-libs.x86_64 0:219-30.el7_3.6 systemd-sysv.x86_64 0:219-30.el7_3.6 Complete!任务2.1 Docker安装任务2.1 Docker安装启动docker并设置为开机自启 rootlocalhost yum.repos.d#systemctl
7、start docker.servicerootlocalhost yum.repos.d#systemctl enable docker.service检查Docker是否正确安装rootlocalhost yum.repos.d#docker infoContainers:0 Running:0 Paused:0 Stopped:0Images:0Server Version:1.10.3在windows中安装Docker Toolbox2.13.在windows中安装Docker 首先需要从网上下载Docker Toolbox.setup,然后next一键安装Docker Toolbox
8、 安装完成,并运行start.sh任务2.2 Docker 镜像Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载,默认是 Docker Hub 公共注册服务器中的仓库。本章将介绍更多关于镜像的内容,包括:从仓库获取镜像,管理本地主机上的镜像,介绍镜像实现的基本原理。Docker Hub 上有大量的高质量的镜像可以用,从 Docker Registry 获取镜像的命令是 docker pull。其命令格式为:docker pull 选项 Docker Registry地址:具体的选项可以通过 docker pull-help 命令看到,这里说一下
9、镜像名称的格式。任务2.2 Docker 镜像2.21 获取镜像从docker hub拉取ubuntu镜像$docker pull ubuntu:14.0414.04:Pulling from library/ubuntubf5d46315322:Pull complete9f13e0ac480c:Pull completee8988b5b3097:Pull complete40af181810e7:Pull completee6f7c7e5c03e:Pull completeDigest:sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b4
10、92983ae97c3d643fbbeStatus:Downloaded newer image for ubuntu:14.04任务2.2 Docker 镜像从私有库拉取ubuntu镜像rootclient/#docker pull 192.168.200.11:5000/ubuntu/14.04.3.tar:latestTrying to pull repository 192.168.200.11:5000/ubuntu/14.04.3.tar.latest:Pulling from 192.168.200.11:5000/ubuntu/14.04.3.tar任务2.2 Docker 镜
11、像查看ubuntu镜像是否下载到本地rootclient/#docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE192.168.200.11:5000/rancher/agent-instance v0.8.3.tar 6dccaa66a75d 6 months ago 330.9 MB192.168.200.11:5000/rancher/agent v1.0.2.tar deb5c6987c83 6 months ago 454.3 MB192.168.200.11:5000/ubuntu/14.04.3.tar latest ebdc8e29
12、5a2e 11 months ago 187.9 MB任务2.2 Docker 镜像4.从镜像启动一个容器rootclient/#docker run-t-i-name next_container ubuntu/14.04.3.tar:latest/bin/bashroot917b059d9f30:/#任务2.2 Docker 镜像2.22 运行有了镜像后,就可以以这个镜像为基础启动一个容器来运行。以上面的 ubuntu:14.04 为例,如果打算启动ubuntu里面的bash 并且进行交互式操作的话,可以执行下面的命令。rootclient/#docker run-t-i-name nex
13、t_container ubuntu/14.04.3.tar:latest/bin/bashroot917b059d9f30:/#任务2.2 Docker 镜像2.23 列出镜像要想列出已经下载下来的镜像,可以使用 docker images 命令。$docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEredis latest 5f515359c7f8 5 days ago 183 MBnginx latest 05a60462f8ba 5 days ago 181 MBmongo 3.2 fe9198c04d62 5 days ago 342 M
14、B任务2.2 Docker 镜像镜像体积 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。任务2.2 Docker 镜像虚悬镜像镜像既没有仓库名,也没有标签,均为:这类无标签镜像也被称为虚悬镜像(dangling image),可以用下面的命令专门显示这类镜像:$docker images-f dangling=trueREPOSITORY
15、TAG IMAGE ID CREATED SIZE 00285df0df87 5 days ago 342 MB可以用下面的命令删除。$docker rmi$(docker images-q-f dangling=true)任务2.2 Docker 镜像中间层镜像默认的 docker images 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加-a 参数。$docker images-a任务2.2 Docker 镜像2.24 列出部分镜像根据仓库名列出镜像$docker images ubuntuREPOSITORY TAG IMAGE ID CREATED SI
16、ZEubuntu 16.04 f753707788c5 4 weeks ago 127 MBubuntu latest f753707788c5 4 weeks ago 127 MBubuntu 14.04 1e0c3dd64ccd 4 weeks ago 188 MB列出特定的某个镜像,也就是说指定仓库名和标签$docker images ubuntu:16.04REPOSITORY TAG IMAGE ID CREATED SIZEubuntu 16.04 f753707788c5 4 weeks ago 127 MB任务2.2 Docker 镜像以特定格式显示Docker images
17、q 只显示镜像ID$docker images-q5f515359c7f805a60462f8ba下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:$docker images-format.ID:.Repository5f515359c7f8:redis05a60462f8ba:nginx任务2.2 Docker 镜像以表格等距显示,并且有标题行,和默认一样,不过自己定义列:$docker images-format table.IDt.Repositoryt.TagIMAGE ID REPOSITORY TAG5f515359c7f8 redis latest05a60462f8b
18、a nginx latestfe9198c04d62 mongo 3.200285df0df87 f753707788c5 ubuntu 16.04f753707788c5 ubuntu latest1e0c3dd64ccd ubuntu 14.04任务2.2 Docker 镜像2.25 查找镜像通过docker search来查找镜像,首先查找本地,然后本地库,然后docker hub库。rootclient#docker search ubuntu INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/ubun
19、tu Ubuntu is a Debian-based Linux operating s.5280 OK docker.io docker.io/ubuntu-upstart Upstart is an event-based replacement for.69 OK 任务2.2 Docker 镜像2.26 利用 commit 理解镜像构成现在以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。docker run-name webserver-d-p 80:80 nginx这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样可以用浏览
20、器去访问这个 nginx 服务器。直接用浏览器访问的话,会看到默认的 Nginx 欢迎页面。任务2.2 Docker 镜像现在,假设非常不喜欢这个欢迎页面,希望改成欢迎 Docker 的文字,可以使用 docker exec命令进入容器,修改其内容。$docker exec-it webserver bashroot3729b97e8226:/#echo Hello,Docker!/usr/share/nginx/html/index.htmlroot3729b97e8226:/#exit现在再刷新浏览器的话,会发现内容被改变了。任务2.2 Docker 镜像修改了容器的文件,也就是改动了容器
21、的存储层。可以通过 docker diff 命令看到具体的改动。$docker diff webserverC/rootA/root/.bash_historyC/runC/usrC/usr/shareC/usr/share/nginxC/usr/share/nginx/htmlC/usr/share/nginx/html/index.html任务2.2 Docker 镜像Docker commit(将容器保存为镜像)$docker commit -author Tao Wang -message 修改了默认网页 webserver nginx:v2sha256:07e33465974800c
22、e65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214任务2.2 Docker 镜像可以在 docker images 中看到这个新定制的镜像$docker images nginxREPOSITORY TAG IMAGE ID CREATED SIZEnginx v2 07e334659748 9 seconds ago 181.5 MB任务2.2 Docker 镜像用 docker history 具体查看镜像内的历史记录,如果比较 nginx:latest 的历史记录,会发现新增了刚刚提交的这一层。$docker history nginxIM
23、AGE CREATED CREATED BY SIZE COMMENT07e334659748 54 seconds ago nginx-g daemon off;95 B 修改了默认网页新的镜像定制好后,可以来运行这个镜像。docker run-name web2-d-p 81:80 nginx任务2.2 Docker 镜像2.27使用 Dockerfile 定制镜像(1)创建镜像目录rootclient/#mkdir static_webrootclient/#cd static_web/rootclient static_web#touch Dockerfilerootclient st
24、atic_web#lltotal 0-rw-r-r-.1 root root 0 Dec 25 13:59 Dockerfile任务2.2 Docker 镜像(2)编辑新镜像内容rootclient static_web#vi Dockerfile#Version:0.0.1FROM ubuntu/14.04.3.tarMAINTAINER James Turnbull RUN apt-get updateRUN apt-get install-y nginxRUN echo Hi,I am in your container /var/www/html/index.htmlEXPOSE 80
25、任务2.2 Docker 镜像(3)执行命令来构建新镜像 rootclient static_web#sudo docker build-t=jamtur01/static_web.-t:构建一个名称Sending build context to Docker daemon 2.048 kBStep 1:FROM ubuntu/14.04.3.tar-8e1acf623cb6Step 2:MAINTAINER James Turnbull -Running in 99c1fff85acf-bc46e1a77642Removing intermediate container 99c1fff8
26、5acfStep 3:RUN apt-get update&apt-get install-y nginx-Running in 7a3788bdfef1Err http:/ trusty InRelease任务2.2 Docker 镜像2.29 删除本地镜像如果要删除本地的镜像,可以使用 docker rmi 命令,其格式为:docker rmi 选项 .-f:强制删除;-no-prune:不移除该镜像的过程镜像,默认移除;任务2.3 Docker 容器2.3.1 启动容器 docker run-d 后台运行-i 交换式运行-name 添加名字-t 添加标签-v 添加数据卷-rm 容器删除后
27、清除缓存任务2.3 Docker 容器2.3.2 终止容器 docker stop此外,当Docker容器中指定的应用终结时,容器也自动终止。2.3.3 进入容器 docker attach$docker attach nostalgic_hypatiaroot243c32535da7:/#但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。任务2.3 Docker 容器2.3.4 容器内部操作检查容器主机名root1cec78443028:/#hostname1cec784430
28、28检查容器接口root1cec78443028:/#ip a检查容器的进程root1cec78443028:/#ps-auxUSER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 18164 2016?Ss 05:25 0:00/bin/bashroot 18 0.0 0.0 15564 1148?R+05:35 0:00 ps aux任务2.3 Docker 容器2.3.5 查看容器日志及相关操作获取守护式容器的日志rootl-client#docker logs ubuntu_containerhello wo
29、rld跟踪守护式容器的日志rootl-client#docker logs-f ubuntu_containerhello world在容器级别启动syslogrootl-client#docker run-log-driver=syslog-name ubuntu_container-d ubuntu:14.04.3/bin/sh-c while true;do echo hello world;sleep 1;done441c3de8dbcbfb09d9586c456d47417150dc7cdaf9cfb26597945b27a68bb310任务2.3 Docker 容器查看守护式容器的
30、进程rootl-client#docker top ubuntu_containerUID PID PPID C STIME TTY TIME CMDroot 7356 965 0 06:26?00:00:00 /bin/sh-c 查看容器占用系统资源情况rootl-client#docker statsCONTAINER CPU%MEM USAGE/LIMIT MEM%NET I/O BLOCK I/O441c3de8dbcb 0.10%2.372 MB/4.145 GB 0.06%648 B/648 B 2.385 MB/0 B任务2.3 Docker 容器在容器中运行后台任务rootl-
31、client#docker exec-d ubuntu_container touch/etc/new_config_file查看容器rootl-client#docker inspect ubuntu_container Id:441c3de8dbcbfb09d9586c456d47417150dc7cdaf9cfb26597945b27a68bb310,任务2.3 Docker 容器2.3.6 导出和导入容器docker export/import 导出容器查看所有容器$sudo docker ps-aCONTAINER ID IMAGE COMMAND CREATED STATUS PO
32、RTS NAMES7691a814370e ubuntu:14.04 /bin/bash 36 hours ago Exited(0)21 hours ago test导出容器$sudo docker export 7691a814370e ubuntu.tar任务2.3 Docker 容器导入容器可以使用 docker import 从容器快照文件中再导入为镜像,例如$cat ubuntu.tar|sudo docker import-test/ubuntu:v1.0$sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEtest/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB此外,也可以通过指定 URL 或者某个目录来导入,例如$sudo docker import http:/ example/imagerepo任务2.3 Docker 容器2.3.7 删除容器可以使用 docker rm 来删除一个处于终止状态的容器。例如$sudo docker rm trusting_newtontrusting_newton-f:通过SIGKILL信号强制删除一个运行中的容器-l:移除容器间的网络连接,而非容器本身-v:-v 删除与容器关联的卷