Docker-1.0>>>>>>初阶学习

Docker学习总结

Docker三大组成: image(镜像)、container(容器)、repository(仓库)。

  1. 镜像:一个镜像可以有多个容器,每个镜像都有不同的tag(版本号)。
  2. 容器:是镜像的实例,一个镜像可以有多个容器,容器是简易版的lunix环境和在其中运行的应用程序。
  3. 仓库:集中存放image的地方
  4. 仓库注册服务器:存在着多个仓库

仓库又分公开仓库和私有仓库,最大的公开仓库是Docker Hub(基本不用,国外的网站),国内的公开仓库有:阿里云、网易云等

Dcoker与虚拟机的区别:

Docker容器虚拟机(VM)
操作系统与宿主机共享OS宿主机OS上运行虚拟机OS
存储大小镜像小,便于存储于传输镜像庞大
运行性能几乎无额外性能损失操作系统额外的CPU、内存消耗
一致性轻便、灵活、适应于lunix笨重,与虚拟化技术耦合度高
硬件亲和性面向软件开发者面向硬件运维者
部署速度快速,秒级较慢,10s以上,分钟级
一、Docker的安装:
  • 卸载已有的Docker:

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  • 安装gcc

    yum -y install gcc
    
  • 更新yum

    yum makecache fast
    

参考官方文档:
Docker官方文档
在lunix系统安装Docker必须是centos6.5以上,我的系统是centos7.6。

  • 1、安装所需软件包:

    yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    
  • 2、设置仓库:
    官方仓库:

    yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
  • 3、安装Docer:

    yum install docker-ce docker-ce-cli containerd.io
    

一路Y就行

  • 4、配置网易镜像:
  1. 新建并编辑:

    vim /etc/docker/daemon.json
    
  2. 输入并保存:

    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    

    若提示错误,先创建文件

  3. 重新加载并重新启动Docker:

    systemctl start docker // 启动
    systemctl daemon-reload //重新加载
    systemctl restart docker // 重新启动
    
  4. 查看docker运行情况:

    docker info //查看docker详情,Registry Mirrors:可以看到刚刚修改的镜像
    ps -ef | grep docker // 显示docker进程
    
  5. docker初体验:

    docker run hello-world
    
  6. 设置docker开机启动

    systemctl enable docker
    
  7. 关闭docker开机启动

    systemctl disable docker
    
二、Docker常用命令
1、帮助命令:
  • docker version:查看docker版本
  • docker info:查看docker详情
  • docker --help:帮助命令
2、镜像命令:
  • docker images:本地镜像列表

    REPOSITORYTAGIMAGE IDCREATEDVIRTUAL SIZE
    镜像的仓库源镜像的标签镜像ID创建时间镜像大小
    同一个镜像有多个tag及多个版本,默认为lasted,用:来表示版本号
    参数选项:
    -a:列出本地镜像(含中间映射层)
    -q:只列出镜像的id
    -qa:组合健
    –digests:显示镜像的摘要信息
    – no-trunc:显示完整的镜像信息
  • docker search:官方镜像仓库搜索指定的镜像

    docker search tomcat
    
    NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED
    镜像名称描述点赞数是否为官方版本自动构建

    参数选项:
    -s:列出收藏数不小于指定值的镜像,例如;

    docker search -s 50 tomcat
    

    – no-trunc:显示完整的镜像信息
    –automated:只列出autjomated build类型的镜像

  • docker pull:从仓库下载镜像,不加版本号默认是最新版:

    docker pull tomcat
    
  • docker rmi:删除镜像,运行中的镜像会报错,需要加上 -f 强制删除:
    不加版本号默认删除的是最新版

    docker rmi -f  hello-world // 删除单个
    docker rmi -f  hello-world tomcat //删除多个
    docker rmi -f $(docker images -qa) // 删除全部
    
3、容器命令:
  • docker run:新建并启动一个容器
    参数选项:
    –name–:为容器指定一个名称
    -d:后台运行容器并返回ID,即启动守护式容器
    -i:以交互模式运行容器,通常与 -t 同时使用
    -t:为容器重新分配一个伪终端,通常与 -i 同时使用
    -P:随机端口映射
    -p:指定端口映射,有四种格式
    1> ip:hostPort:containerPort
    2> ip::contaimerPort
    3> hostPort:containerPort
    4> containerPort

    // 第一个8080是外部容器断开,第二个8080是内部tomcat默认端口
    docker run -it -p 8080:8080 tomcat
    
  • exit:退出容器,容器停止

  • Ctrl+P+Q:退出容器,容器不停止

  • docker ps:查看运行的容器
    参数选项:
    -a:列出所有正在运行和历史运行过的
    -l:显示最近创建的容器
    -n:显示最近n个创建的容器
    -q:静默模式,只显示容器编号
    – no-trunc:不截断输出
    组合使用:

    docker ps -lq
    docker ps -aq
    
  • docker start:启动容器

    docker start c7661da822b4  // 通过id启动容器
    
  • docker restart:重启容器

    docker restart c7661da822b4 
    
  • docker stop:停止容器,通过id或容器名

  • docker kill:强制停止容器

  • docker rm:删除已停止运行的容器

    docker rm -f  $(docker ps -a -q) // 删除所有的容器
    docker ps -a -q | xargs docker rm // 删除所有容器
    
  • docker logs :查看日志

    // 实时查看倒数5行的日志
    docker logs -t -f --tail 5 c7661da822b4
    
  • docker top:查看容器内进程

  • docker inspect:查看容器内部细节,json字符串显示

  • docker attach:进去容器并启动命令终端

  • docker exec:在容器外执行,并且返回结果

    docker exec c7661da822b4 ls -l
    
  • docker cp:从容器中复制到宿主机

  • docker commit:提交容器副本成为一个新的镜像

    参数选项:
    -m:" 提交的描述信息 "
    -a:" 作者 "

    // my是包名,1.2是版本号,tomcat01是自定义名称
    docker commit -a="smilevers" -m="del tomcat docs" xxxxx my/tomcat01:1.2
    
  • –restart=always :docker容器自启动

    // 启动时设置docker容器为自启动
    docker run --restart=always
    // 更新docker容器为自启动
    docker update --restart=always <CONTAINER ID>
    // 更新docker容器关闭自启动
    docker update --restart=no <CONTAINER ID>
    
三、镜像详解

    镜像是一种轻量级、可执行的独立软件包,==用来打包软件运行环境和基于运行环境开发的软件,==它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

  • UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录的挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 共用kernel(内核),bootfs引导完后就自己卸载,只留下rootfs。

  • 只读,

四、容器数据卷(持久化,数据共享)

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过Union File System 提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生成周期,因此Docker不会再容器删除时删除其挂载的数据卷。

  • 1、数据卷可在容器之间共享或重用数据
  • 2、卷中的更改可以直接生效
  • 3、数据卷中的更改不会包含在镜像的更新中
  • 4、数据卷的生命周期一直持续到没有容器使用为止
1、用命令添加数据卷
// myDateVolume宿主机文件夹,dataVolumeContaimer容器中的文件夹
// 目录共享
docker run -it -v /myDateVolume:/dataVolumeContaimer centos
// 容器内只读
docker run -it -v /myDateVolume:/dataVolumeContaimer:ro centos
Docker挂载主机目录Docker访问出现cannot open directory .:Perimisson denied
解决方案:在挂载目录后多加一个 --privileged=true 参数即可:

docker run -it -v /myDateVolume:/dataVolumeContaimer --privileged=true centos
2、DockerFile添加数据卷

镜像描述文件

#volume test
FROM centos
VOLUME ["/dataVolumeContaimer1","/dataVolumeContainer2"]
CMD echo "finished,----------success1"
CMD /bin/bash

  • docker build:- f 默认文件名为Dockerfile则不需要写
// 根据dockerfile构建镜像,1.3是版本号,zzzyy是前缀,最后面需要加空格和点
docker build -f /mydocker/Dockerfile -t zzzyy/centos:1.3 .

默认会在宿主机上生成数据卷,通过docker inspect 查看

3、数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器称之为数据卷容器。
1、创建父容器

docker run -it --name dc01  zzzyy/centos

2、创建子容器并集成父容器

docker run -it --name dc02 --volumes-from dc01 zzzyy/centos

数据卷的生命周期一直持续到没有容器使用为止,删除任何数据卷容器其他容器之间还会共享。

五、DockerFile
  • Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
  • 流程:编写dockerfile > 构建dockerfile镜像 > 运行镜像
1、DockerFile解析过程:

基础:

  • 1> 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 2> 指令按照从上到下,顺序执行
  • 3> #表示注释
  • 4> 每条指令都会创建一个新的镜像层,并对镜像进行提交
    执行流程:
  • 1> docker从基础镜像运行一个容器
  • 2> 执行一条指令并对容器作出修改
  • 3> 执行类似docker commit的操作提交一个新的镜像层
  • 4> docker再基于刚提交的镜像运行一个新容器
  • 5> 执行dockerfile中的下一条指令直到所有指令都执行完成
2、保留字指令:
  • FROM:基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER:镜像维护者的姓名和邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露的端口号
  • WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
  • ENV:在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
  • COPY:从构建上下文目录中的<源路径>文件或目录,复制到新一层镜像内的<目录路径>位置
  • VOLUME:数据卷,用于数据保存和持久化工作
  • CMD:指定一个容器启动时要运行的命令,只要最后一个会生效,会被docker run之后的参数替换
  • ENTRYPOINT:指定一个容器启动时要运行的命令,可以追加参数
  • ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
3、实际案例:

Base镜像(scratch)
docker history:查看镜像历史,形成过程

  • 1、

    // 从本地镜像导入
    FROM centos
    // 作者信息
    MAINTAINER smilevers<smilevers@163.com>
    // 变量
    ENV MYPATH  /usr/local
    // 登陆进的工作目录
    WORKDIR $MYPATH
    // 安装vim
    RUN yum -y install vim
    // 安装网络环境
    RUN yum -y install net-tools
    // 设置对外暴露的端口
    EXPOSE 80
    // 容器运行的命令
    CMD echo $MYPATH
    CMD echo "success----------"
    CMD /bin/bash
    
  • 2、

    // 从本地镜像导入
    FROM centos
    // 安装curl
    RUN yum -y install curl
    // 容器运行的命令,可以追加参数
    ENTRYPOINT ["curl" ,"s" ,"http://ip.cn"]
    

    运行docker run命令是后面的参数可以追加到"s"后面

  • 3、

	// 从本地镜像导入
	FROM centos
	// 作者信息
	MAINTAINER smilevers<smilevers@163.com>
	// 把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下,并重命名
	COPY c.txt /usr/local/cincontainer.txt
	// 把tomcat和jdk添加到容器中,并解压
	ADD apache-tomcat-9.0.tar.gz  usr/local/
	ADD jdk-8u171-linux-x64.tar.gz  usr/local/
	// 配置java和tomcat的环境变量
	ENV JAVA_HOME /usr/local/jdk1.8.0_171
	ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
	ENV CATALINA_HOME /usr/lcoal/apache-tomcat-9.0.8
	ENV CATALINA_BASE /usr/lcoal/apache-tomcat-9.0.8
	ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
	// 设置一个变量
	ENV MYPATH  /usr/local
	// 登陆进的工作目录
	WORKDIR $MYPATH
	// 安装vim
	RUN yum -y install vim
	// 安装网络环境
	RUN yum -y install net-tools
	// 设置对外暴露的端口
	EXPOSE 80
	// 容器启动时运行tomcat
	# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
	# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
	CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

  • 4、通过共享容器卷,发布web项目
六、Docker常用安装
1、tomcat
  • 1> 仓库拉取:
    docker pull tomcat
    
  • 2> 运行:
2、Mysql
  • 1> 仓库拉取:

    docker pull mysql:5.6
    
  • 2> 运行:

    docker run -p 3306:3306 --name mysql \
    -v /smilevers/mysql/conf:/etc/mysql/conf.d \
    -v /smilevers/mysql/logs:/logs \
    -v /smilevers/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD = root \
    -d mydql:5.6
    
  • 3> 数据备份:

    docker exec 容器id sh -c ' exec mysqldump --all-databases -uroot -p "root" ' > /smilevers/all-databases.sql
    
3、Redis
  • 1> 仓库拉取:

    docker pull redis:3.2
    
  • 2> 运行:

    docker run -p 6379:6379 \
    -v /smilevers/myredis/data:/data \
    -v /smilevers/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
    -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf \
    --appendonly yes // 开启持久化
    
七、本地镜像发布阿里云
  • 推送到阿里云
$ sudo docker login --username=smilevers registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/smilevers/mysql:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/smilevers/mysql:[镜像版本号]
  • 从阿里云拉取
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/smilevers/mysql:[镜像版本号]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值