Linux虚拟化技术—Centos7.4下Docker容器安装配置与基本操作
Docker容器基本操作目录
第一部分实验环境
第二部分安装配置Docker软件
第三部分Docker镜像操作
第四部分Docker容器操作
第五部分制作镜像
第六部分数据卷管理
第七部分网络通信
第八部分构建nginx镜像
第一部分实验环境
Linux服务器一台
系统:CentOS 7.4
IP地址:192.168.80.10
https://s1.运维网.com/images/blog/201804/13/c430697a799a877b5ab9a16014087f0c.png
注意:需要该服务器能上公网
第二部分安装配置docker软件
一:配置yum源,加入docker源
# vi /etc/yum.repos.d/CentOS-Base.repo
https://s1.运维网.com/images/blog/201804/13/52517c644ce53ade008f29af1e9d73ff.png
保存退出
二:安装docker软件
# yum install -y docker-engine
# systemctl enable docker //设置docker为开机自动启动
# systemctl start docker //开启docker服务
# docker version //查看docker服务版本
https://s1.运维网.com/images/blog/201804/13/bb3ded478bd5ff293ce47bfc09d4ab81.png
第三部分Docker镜像操作
Docker镜像是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向Docker容器引擎的只读模板,比如:一个镜像可以是一个完整CentOS操作系统环境,称为一个CentOS镜像;可以是一个安装了MySQL的应用程序,称之为一个MySQL镜像等等
Docker提供了简单的机制来创建和更新现有的镜像,用户也可以从网卡下载已经做好的应用镜像来直接使用
[*]搜索镜像
命令语法:docker search 关键字 //用来搜索远端官方仓库中的共享镜像
# docker search lamp //搜索关键字为lamp的镜像
https://s1.运维网.com/images/blog/201804/13/31969d14688a7c1199bb6546caeb3634.png
NAME:镜像名称
DESCRIPTION:描述
STARS:星级
OFFICIAL:是否官方创建
AUTOMATED:是否主动创建
# docker search lamp -f stars=10
https://s1.运维网.com/images/blog/201804/13/de6f07beabbd36c9a62c7e7102a59364.png
[*]获取镜像
命令语法:docker pull 名称
# docker pull nickistre/centos-lamp //下载镜像nickistre/centos-lamp
https://s1.运维网.com/images/blog/201804/13/13f8c6c09bb0ea8945e8a20f557e5eae.png
(等待时间有点漫长,不是网速的问题,是国外网站资源少,下载的都是最新的版本)
[*]查看镜像信息
命令语法:docker images
# docker images //查看本地所有镜像
https://s1.运维网.com/images/blog/201804/13/f8c3156d87a5909c5f3c9c6a2c7e5447.png
REPOSITORY:镜像属于的仓库(名称)
TAG:镜像的标签信息,标记同一个仓库中的不同镜像,默认为latest
IMAGE ID:镜像的唯一ID号,唯一标识了该镜像
CREATED:镜像创建时间
SIZE:镜像大小
//还可以根据镜像的唯一标识ID号,获取镜像详细信息
# docker inspect 7c85674b3b36
[*]为镜像添加多个名称和标签
命令语法:docker tag 名称:标签 新名称:新标签
# docker tag nickistre/centos-lamp:latest centos:lamp
# docker images //查看镜像
https://s1.运维网.com/images/blog/201804/13/7585fd724b8ffbd18be0ac7a24d9ffe2.png
//名称与标签可以添加多个,ID号是唯一的
[*]删除镜像
命令格式:docker rmi 名称:标签
//镜像没有使用才能删除成功,且只是删除一个镜像,同一个ID下的其它镜像不会被删除
或者:docker rmi 镜像ID号(以ID号删除,会删除同一个ID下全部的镜像)
Docker rmi –f ID //永久删除
docker rmi -f $(docker images | grep "" | awk "{print \$3}") //删除所有没有使用的镜像
# docker rmi centos:lamp
https://s1.运维网.com/images/blog/201804/13/3464434161f73ea7c57d03b21c8a2d99.png
https://s1.运维网.com/images/blog/201804/13/9dab89cf91f14463af0008655df3b2cb.png
[*]存出镜像和载入镜像
(1)存出镜像:将镜像保存成本地文件,这一过程叫作存出镜像,可以使用docker save命令进行操作。之后就可以拷贝该文件到其他机器。
命令格式:docker save –o 存储文件名 存储的镜像
# docker save -o lamp nickistre/centos-lamp //将本地的nickistre/centos-lamp镜像存出为文件lamp
https://s1.运维网.com/images/blog/201804/13/6e4df86898476ecdf7cf5d3915484b16.png
# docker rmi nickistre/centos-lamp //删除nickistre/centos-lamp镜像
https://s1.运维网.com/images/blog/201804/13/e95e697ef13aca9bfb173c02d325f78b.png
(2)载入镜像:将本地存出镜像文件导入到镜像库,这一过程叫作载入镜像。使用docker load或者docker –input进行载入操作
命令格式:docker load < 存出的文件
# docker load < lamp //将文件lamp载入镜像到本地镜像库中
https://s1.运维网.com/images/blog/201804/13/42463d00e23673ae5c9389a18554239e.png
https://s1.运维网.com/images/blog/201804/13/3a2ae6da265443e6faa1eb50c88a4b7d.png
[*]镜像上传
//本地存储的镜像越来越多,就需要指定一个专门的地方存放这些镜像—仓库
命令格式:docker push 名称:标签
第四部分Docker容器操作
Docker容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见的,可以保证平台的安全性。还可以把容器看作是一个简易版的Linux环境,Docker利用容器来运行和隔离应用。
容器是Docker的另一个核心概念。简单说,容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
[*]容器的创建与启动
(1)容器的创建就是将镜像加载到容器的过程
命令格式:docker create [选项] 镜像 运行的程序
常用选项:
-i:让容器的输入保持打开
-t:让Docker分配 一个伪终端
# docker create -it nickistre/centos-lamp /bin/bash //创建容器,默认是没有运行的
https://s1.运维网.com/images/blog/201804/13/23a6d9011f8a2ea6de93813ddfa9544d.png
# docker ps –a //查看容器的运行情况,关注ID(唯一的)
https://s1.运维网.com/images/blog/201804/13/234fbd0b7e0b05d3a0549fb4f305dcdf.png
CONTAINER ID:容器的ID号(唯一的)
IMAGE:加载的镜像
COMMAND:运行的程序
CREATED:创建时间
STATUS:目前所处的状态
PORTS:端口映射
# docker ps //查看运行中的容器
https://s1.运维网.com/images/blog/201804/13/7be91731be852f7b9353a888f09ca247.png
(2)启动
命令格式:docker start 容器的ID/名称
# docker start 45c927ad72d4 启动容器
# docker ps //查看运行的容器
https://s1.运维网.com/images/blog/201804/13/1f5c017ec8d1af42e8d7783a6125d4c3.png
(3)创建并启动
命令格式:docker run [选项] 镜像 运行的程序
等同于先执行docker create命令,再执行docker start命令。需要注意只要后面的命令运行结束,容器就会停止。
# docker run centos:lamp /bin/bash -c ls / //创建容器的并启动执行一条shell命令,命令完成容器就停止
https://s1.运维网.com/images/blog/201804/13/e0330a52a26a51db98b9bcdf38a1cd92.png
# docker ps –a
https://s1.运维网.com/images/blog/201804/13/c4954c87a446466dfefe36276c743253.png
(4)容器的暂停运行
命令格式:docker pasuse 容器的ID
# docker pause fb89549a2d31
https://s1.运维网.com/images/blog/201804/13/2622941b01fa8dd71b9505659eb8b4ff.png
# docker unpause fb89549a2d31 //继续运行
https://s1.运维网.com/images/blog/201804/13/d9471a9f1db3994e5b4fe5fd976e5195.png
[*]容器的运行终止
命令格式:docker stop 容器的ID/名称
https://s1.运维网.com/images/blog/201804/13/3dfa698aafd7c161922d6ba96e71f912.png
# docker stop 45c927ad72d4
https://s1.运维网.com/images/blog/201804/13/be04e40756afd0bf375e0ed6ee5df820.png
[*]容器的进入
命令格式:docker exec –it 容器ID/名称 /bin/bash
# docker exec -it 45c927ad72d4 /bin/bash //进入运行中的容器
https://s1.运维网.com/images/blog/201804/13/4f03c7f1ca4383970d7ad865aac1ed5c.png
[*]容器的导出与生成镜像
(1) 导出:将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。
命令格式:docker export 容器ID/名称 > 文件名
# docker export 6e22920fc447 > centostar
https://s1.运维网.com/images/blog/201804/13/0849de308af3217823cca38c56414521.png
(2) 将容器文件生成镜像
命令格式:cat 文件名 | docker import – 生成的镜像名称:标签
# cat centostar | docker import - centos1:latest
https://s1.运维网.com/images/blog/201804/13/619eff4ed2372f63b48f75f8fb966b1e.png
[*]容器的删除
命令格式:docker rm 容器ID/名称
Docker rm –f 容器ID/名称 //强制删除运行中的容器,不建议
https://s1.运维网.com/images/blog/201804/13/79fd997e92c8384c09381fbd34641fbf.png
# docker stop fb89549a2d31
https://s1.运维网.com/images/blog/201804/13/3475a315a30cc3f175e1f6bfb05b4487.png
# docker rm fb89549a2d31
https://s1.运维网.com/images/blog/201804/13/dad67de12c42e7ba49de056db710cd3d.png
# docker rm -f 6e22920fc447
https://s1.运维网.com/images/blog/201804/13/66096a2da5a5daa66af8fd73c6abf98a.png
第五部分制作镜像
[*]基于现有镜像制作
将原始镜像加入容器并运行-》在原始镜像中部署各种服务-》退出容器-》使用下面命令将容器生成新的镜像
实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像
命令格式: docker commit [选项] 容器ID/名称 仓库名称:[标签]
常用选项:
-m:说明信息
-a:作用信息
-p:生成过程中停止容器的运行
//首先启动一个容器
https://s1.运维网.com/images/blog/201804/13/4c6b22d149af4fed1254f3afe47fc50d.png
//创建镜像
# docker commit -m "new" -a "daoke" a777634d6997 centos2:latest
https://s1.运维网.com/images/blog/201804/13/7592b3a819d6190271264f7409926a85.png
[*]基于本地模板创建
参考上面第四部分的第四点
[*]基于dockerfile创建
(1)建立工作目录
# mkdir apache
# cd apache/
(3) 创建并编写dockerfile文件
# vi dockerfile
#基于的基础镜像为centos
FROM centos
#维护该镜像的用户信息
MAINTAINER The Centos Project
#镜像操作指令安装apache软件包
#RUN yum -y update //此处注意,由于我的centos镜像版本是最新的7.3,所以不需要更新,如果是7.3以下的版本,这里需要打开,自动更新到7.3,否则后面会有报错
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
保存退出
(3)编写执行脚本内容
# vi run.sh
#!/bin/bash
rm -rf /run/httpd/* //清理httpd的缓存
exec /usr/sbin/apachectl -D FOREGROUND //启动apache服务
保存退出
(4)创建测试页面
# vi index.html
This is test
保存退出
(5)使用dockerfile生成镜像
命令格式:docker build [选项] 路径
常用选项:-t //指定镜像的标签信息
# docker build -t httpd:centos . //”.”表示当前路径
https://s1.运维网.com/images/blog/201804/13/ff31d39ba026ff0da77873d34441754f.png
https://s1.运维网.com/images/blog/201804/13/3e95e996fc4a43addcb24ccf5785a188.png
(6)使用新的镜像运行容器
# docker run -d -p 9000:80 httpd:centos //用-p选项实现将本地端口9000映射到容器中的80端口
https://s1.运维网.com/images/blog/201804/13/57ac68e1b216778aa869be7a9e8b8337.png
//浏览器访问http://192.168.80.10:9000
https://s1.运维网.com/images/blog/201804/13/388abf45c9ff135c7717240dcaa1fce3.png
[*]Ssh公钥验证—基于dockerfile生成镜像
注意:需要联网
(1)建立工作目录,创建公钥
# mkdir sshd
# ssh-keygen -t rsa //创建公钥,一路回车,不要设置密码
# cat .ssh/id_rsa.pub > sshd/authorized_keys
# cd sshd/
(2)创建并编写Dockerfile文件
# vi Dockerfile
FROM centos1
MAINTAINER The Centos Project
RUN yum install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 775 /run.sh
EXPOSE 22
CMD [ "/usr/sbin/init"]
CMD ["/run.sh"]
保存退出
(3)编写执行脚本
# vi run.sh
#/bin/bash
/usr/sbin/sshd –D
保存退出
(4)生成镜像
# docker build -t sshd:centos .
https://s1.运维网.com/images/blog/201804/13/38d2a28b2fa4c935b17c8f807b587243.png
https://s1.运维网.com/images/blog/201804/13/0a718df0831f75e1a195b61846bfc9b4.png
# docker run --privileged -itd -p 2222:22 35f737ae37e9 /usr/sbin/init
//创建、启动容器,并且将ssh服务加入系统启动服务,该命令只适用于centos7以上版本
https://s1.运维网.com/images/blog/201804/13/4fc8fb7d7fcb04016e1c8dd90957aa9c.png
# systemctl status sshd
https://s1.运维网.com/images/blog/201804/13/682ab7d76e83934e10ee702cfc1a5582.png
# yum install initscripts –y
https://s1.运维网.com/images/blog/201804/13/0cb94bc7c1dbffdf1a079d70a3ace10a.png
注意:centos7以下不需要,只要使用以下命令:
docker run -itd -p 2222:22 9ccd132ae0f7 /bin/bash
(5)验证测试
# ssh 172.17.0.11 //远程访问,不需要输入密码直接进入
https://s1.运维网.com/images/blog/201804/13/418301cfd6b1b7c6da623237497cf683.png
第六部分数据卷管理
[*]数据卷
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。类似于Linux下对目录进行的mount操作
1.1 创建数据卷
在docker run命令中使用-v选项可以在容器内创建数据卷;
多次使用-v选项可创建多个数据卷;
使用--name选项可以给容器创建一个友好的自定义名称。
# docker run -v /mnt:/mnt:ro -itd --name www centos1 /bin/bash
https://s1.运维网.com/images/blog/201804/13/33b41b5dad3942600ebb8e674da38aaa.png
1.2 进入容器中查看挂载情况
# docker exec -it 673e2ad4bb91 /bin/bash
https://s1.运维网.com/images/blog/201804/13/e68901931b42351d3c1e94acf9e67fdf.png
//查看本地mnt目录:
https://s1.运维网.com/images/blog/201804/13/ad0d82f65c2ed921b57a65d8aebf1d52.png
# docker inspect 673e2ad4bb91 //查看容器信息
[*]数据卷容器
用于不同的容器之间共享数据
2.1 创建数据卷容器
# docker run -itd -v /datevo --name dbdata centos2 /bin/bash
https://s1.运维网.com/images/blog/201804/13/9134017f2e68d30691ca8abb86e092a9.png
# docker exec -it a00ca1ae829d /bin/bash
https://s1.运维网.com/images/blog/201804/13/eb092bfb7d9dee693cc36ec037fb0c53.png
2.2 使用—volumes-from来挂载一个容器中的数据卷到一个新的容器
# docker run -it --volumes-from dbdata --name db1 centos2 /bin/bash
https://s1.运维网.com/images/blog/201804/13/23c1c42181988de261c5334fc15836b9.png
https://s1.运维网.com/images/blog/201804/13/531bccce0b387a322a495f10bb5b8898.png
2.3 写数据验证
# docker start 3fee5101e8b0
# docker exec -it 3fee5101e8b0 /bin/bash
# cd datevo/
# touch aa.txt
https://s1.运维网.com/images/blog/201804/13/f0996ab7f6466fc911ddb0ec017cd97c.png
# exit
# docker exec -it a00ca1ae829d /bin/bash
# cd datevo/
https://s1.运维网.com/images/blog/201804/13/0227f873e333048b1c4fee789036a955.png
第七部分网络通信
[*]端口映射
选项:
-P:随机映射
-p:指定要映射的端口
用法:# docker run -d -p 9000:80 httpd:centos
# docker run -d -P httpd:centos
https://s1.运维网.com/images/blog/201804/13/d32945eb365ac251d9026ba539328552.png
浏览器访问http://192.168.80.10:32768
https://s1.运维网.com/images/blog/201804/13/209015f26344dd8e8fdb4208f75998e8.png
[*]容器间通信
2.1 创建源容器
# docker run -itd -P --name web1 nickistre/centos-lamp:latest /bin/bash
//创建并运行容器取名web1,端口号自动映射
https://s1.运维网.com/images/blog/201804/13/cb847341e28a6385ed3530abf289f7df.png
2.2 创建接收容器
# docker run -itd -P --name web2 --link web1:web1 nickistre/centos-lamp:latest /bin/bash //创建并运行容器取名web2,链接到web1和其通信
https://s1.运维网.com/images/blog/201804/13/15f07c4f020e6215c4fec77fffc7e83d.png
2.3 测试容器互联通信
# docker exec -it c8f2674e7e6b /bin/bash
# ping web1
https://s1.运维网.com/images/blog/201804/13/0e9ebc308689f0191870edbb8b75bc12.png
# docker exec -it bd3673a6da2a /bin/bash
# ping 172.17.0.10
https://s1.运维网.com/images/blog/201804/13/9c34571286a81986ff0c5ede59ed87fc.png
第八部分构建nginx镜像
[*]创建工作目录
# mkdir nginx
# cd nginx
[*]创建并编写dockerfile文件
# vi Dockerfile
FROM centos
MAINTAINER The Centos Project
RUN yum install -y epel-release
RUN yum install -y nginx
#ADD nginx.conf /etc/nginx/nginx.conf
#RUN echo "test page" >> /etc/nginx/nginx.conf
ADD run.sh /run.sh
RUN chmod 775 /run.sh
EXPOSE 80
#CMD [ "/usr/sbin/init"]
CMD ["/run.sh"]
保存退出
[*]创建并编写启动脚本
# vi run.sh
#!/bin/bash
/usr/sbin/nginx
保存退出
[*]Dockerfile生成镜像
# docker build -t nginx:centos .
https://s1.运维网.com/images/blog/201804/13/70646effbd73600b49985aa575a2e579.png
# docker images //查看生成的镜像
https://s1.运维网.com/images/blog/201804/13/0968addd060c74632d1ca58cbc8cfee1.png
# docker run --privileged -itd -p 80:80 e2201d9ab8a9 /usr/sbin/init
//创建、启动容器,映射到本机80端口,并且将nginx加入系统启动服务,该命令只适用于centos7以上版本
https://s1.运维网.com/images/blog/201804/13/fc96c0ea3e5c1067902f1218287bc1d7.png
# docker exec -it 010bf45da174 /bin/bash
# nginx
# netstat -anpt | grep nginx
https://s1.运维网.com/images/blog/201804/13/e084be8b89828ea6d552fd92a8864ffc.png
浏览器访问http://192.168.80.10:80
https://s1.运维网.com/images/blog/201804/13/c1475ae78d49ca816ff60904bca05650.png
//构建完成
页:
[1]