这是我参与更文挑战的第 28 天,活动详情查看: 更文挑战
一、简介
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
Docker是一容器虚拟化技术。
二、Docker的组成
- 镜像(image):是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
- 容器(Container):Docker利用容器独立运行一个或一组应用。运行是用镜像创建的运行实例。容器可以被启动、开始、停止、删除。容器可以看作是一个简易版的Linux环境,包括环境配置和应用。
- 仓库(repository):是集中存放镜像文件的场所,仓库和仓库注册服务是有区别的,仓库注册服务存在多个仓库,每个仓库又包含了多个镜像,每个镜像都有不同的标签。仓库分公有私有。
三、Docker安装
1、需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
2、配置阿里云docker镜像下载
yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
3、更新yum软件包索引
yum makecache fast
4、查看本机可用版本
yum list docker-ce --showduplicates | sort -r
5、安装docker
sudo yum install docker-ce-17.12.0.ce-1.el7.centos
6、启动服务
systemctl start docker
查看是启动状态
systemctl status docker
测试
docker run hello-world
7、阿里云镜像加速器
- 创建目录:
mkdir -p /etc/docker - 创建加速器的文件:
vim /etc/docker/daemon.json - 配置daemon文件:
{ "registry-mirrors": ["https://自己阿里云中的配置.mirror.aliyuncs.com"] } - 刷新配置文件:
systemctl daemon-reload - 重启Docker:
systemctl restart docker
四、Docker常用命令
1、帮助命令
- 查看版本信息:
docker version - 查看docker信息:
docker info - 帮助文档:
docker help
2、镜像命令
- 查看本地镜像信息:
docker images [options],OPTIONS,-a列出本地所有镜像、-q只显示镜像id、--digest显示镜像的摘要信息、--no-trunc显示完整镜像信息 - 搜索镜像:
docker search [options] xxx镜像,options,-s筛选指定点赞数大于多少 - 下载镜像:
docker pull 需要下载的镜像:[可以指定版本,默认最新版],先下载一个centos - 删除镜像:
docker rmi -f 要删除的镜像ID,删除多个docker rmi -f 要删除的镜像ID 要删除的镜像ID,删除全部docker rmi -f $(docker.images -qa)
3、容器命令
- 新建并启动容器:
docker run [options],options{-name=可以指定容器名字,-d=后台运行,启动守护进程,-i=以交互式模式运行,-t=为容器分配一个伪输入终端经常和-i一起用,-P=随机端口映射,-p=指定端口映射(主机端口号:容器端口号)} - 查询正在运行的容器:
docker ps [options],options{-a=列出正在运行和历史上运行过的,-l=显示最近创建的容器,-n=显示最近n个创建的容器,-q=静默模式只显示编号} - 退出容器:容器停止退出=
exit和容器不停止退出=CTRL+P+Q - 启动容器:
docker start 容器id - 重启容器:
docker resatrt 容器id - 停止容器:
docker stop 容器id - 强制停止:
docker kill 容器id - 删除容器:
docker rm 容器id,删除所有docker rm -f $(docker ps -a -q)
4、容器其他命令
- 后台启用容器:使用
docker run -d 容器名,会有一个情况就是,这个容器启动后没有使用,就会被自动退出。在启动时使用一个死循环输出日志docker run -d centos /bin/sh -c "while true;do echo hello yylm;sleep 2;done",这样就会在一启动就使用容器,不会被自动退出。 - 查看日志:
docker logs [options] 容器id,options{-t=是否加入时间戳,-f=跟随最新日志打印,--tail=数字显示最后多少条} - 查看容器内的进程:
docker top 容器id - 查看容器内部细节:
docker inspect 容器id - 在当前的宿主机使用命令操控容器:
docker exec -it 容器id 需要执行的命令,切换到该容器的命令方式docker exec -it 容器id /bin/bash - 重新进入容器:
docker attach 容器id,不会启动新的进程 - 拷贝容器内的文件:
docker cp 容器id:/容器路径/文件 /目标地址
五、Docker 镜像
1、概述
镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于软件运行环境的软件。
是一种UnionFS(文件联合系统),下载下来的一个镜像包含多层,比如tomcat的镜像,包括了tomcat执行所需要的环境。
每一层的资源都是可以共享的,A镜像的包含的其他层资源,B镜像可以直接共享使用。
2、镜像Commit
运行容器后提交副本使其成为一个新的镜像。
- 运行Tomcat:
docker run -it -p docker对应的端口:tomcat实际端口 tomcat - 删除当前运行的tomcat的文档文件
- 提交镜像:
docker commit -a="作者" -m="注释" 容器id 名字:版本 - 再次运行刚才提交的镜像,就是删除文档后的tomcat了
六、Docker 容器数据卷
1、概述
容器中产生的数据如果不Commit镜像,容器关闭后就会消失,为了解决这一问题出现了容器卷,可以把容器产生的数据持久化并且共享给其他容器使用。
特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
2、使用命令添加容器卷
- 创建数据卷的方式启动容器:
docker run -it -v /宿主机文件夹:/容器中需要持久化文件的文件夹 镜像,其中v命令还有自动创建文件夹的功能。 - 宿主机和容器的两个文件夹实现了数据共享,单方创建或修改文件都会共享到另外一边。
- 容器停止后再次启动依旧会同步宿主机的数据
- 带权限:
docker run -it -v /宿主机文件夹:/容器中需要持久化文件的文件夹:ro 镜像,容器中对当前路径下的文件只能读操作
3、使用DockerFile添加容器卷
-
根目录下新建mydocker文件夹进入
-
在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
-
File构建:创建一个一个Dockerfile,
touch Dockerfile# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,----success1" CMD /bin/bash -
build后生成镜像:
docker build -f /mydocker/Dockerfile -t lm/centos . -
启动容器,在容器内的根目录下会自动创建上面的脚本中的两个文件夹,并且和宿主机同步
-
没有指定宿主机文件夹的位置会有默认的,查看:
docker inspect 启动的容器id
4、volumes-from
- 启动一个父容器dc01:
docker run -it --name dc01 lm/centos - 启动一个子容器dc02继承dc01:
docker run -it --name dc02 --volumes-from dc01 lm/centos - 两个容器之间的数据共享。
- 删除父容器后其他容器依旧共享数据。
七、DockerFile
1、概述
DockerFile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
DockerFile是软件原材料,Docker镜像时软件的交付品,Docker容器是软件运行形态。
DockerFile基础知识:
- 每条保留字都必须为大写且后面必须跟随至少一个参数
- 指令按照从上到小的顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
执行DockerFile的流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 提交一个新的镜像层
- docker基于刚提交的镜像运行一个行的容器
- 执行dockerFile下一条指令,重复操作直至全部执行完成
2、保留字指令
- FROM:基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER:作者名字+邮箱
- RUN:容器构建时需要运行的命令
- EXPOSE:当前容器对外暴露的端口号
- WORKDIR:指定创建容器后,终端默认登录进来的工作目录
- ENV:构建镜像中设置环境变量
- ADD:将宿主机目录下的文件复制到镜像,并自动处理URL和解压tar
- COPY:类似ADD,但只会复制不会处理URL和解压tar
- VOLUME:容器数据卷,数据保存和持久化
- CMD:指定一个启动时需要运行的命令,DockerFile可以有多个CMD指令,但只有最后一个会生效,CMD会被Docker run只会的参数替换
- ENTRYPOINT:和CMD类似,但是不会被docker run的参数覆盖,而是追加
- ONBUILD:当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
3、自定义mycentos
hub的centos不可以使用vim、ifconfig等命令,自定义一个centos安装相关命令。
- 新建一个Dockerfile
FROM centos
MAINTAINER llmm<llmm@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "SUCCESS ----------- ok"
CMD /bin/bash
- 构建dockerFile
docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 . - 运行自定义的centos
docker run -it mycentos:1.3 - 查看镜像的变更历史
docker history 5b643bf5f6ac - **注意:**CMD只会执行最后一个,如果指定其他参数就会覆盖之前的,如果想要多个参数可以使用 ENTRYPOINT
八、Docker安装其他软件
1、MySQL
- 安装:
docker pull mysql:5.6 - 启动:
docker run -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 - 交互模式:
docker exec -it 容器id /bin/bash
2、Redis
- 安装:
docker pull redis:3.2 - 启动:
docker run -p 6378:6379 -v /ggcc/myredis/data:/data -v /ggcc/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes - 交互模式:
docker exec -it 容器id redis-cli