学习

Docker学习笔记

越权(0x3E5) · 8月20日 · 2019年 ·

一、Docker 和 虚拟机Vm 的区别

Docker 虚拟机(Vm)
操作系统 与宿主机共享OS 宿主机OS上运行虚拟机O本文来自:1024s.cnS
存储大小 镜像小,便于存储于传输 镜像庞大(vmdk、vdi)等
运行性能 几乎无额外性能损失 操作系统额外的CPU、内存消耗
移植性 轻便、灵活、适用于Linux 笨重,与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者
部署速度 快速,本文来自:1024s.cn秒级 较慢,10s以上

二、Docker的安装

1.Centos6安装

yum install -y epel-release
yum install -y docker-io
#安装后的配置文件: /etc/sysconfig/docker
service docker start #启动Docker后台服务
docker version #验证Docker是否安装成功

2.Centos7安装

yum -y install gcc #安装gcc
yum -y install gcc-c++ #安装c++
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine #卸载旧版本,如果没安装过则无需执行
yum install -y yum-utils device-mapper-persistent-data lvm2 #安装需要的软件包
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #切换阿里云的docker源
yum makecache fast #更新yum缓存
yum -y install docker-ce #安装docker
systemctl start docker #启动docker
systemctl enable docker #设置开机自启
docker version #查看docker版本信息测试安装是否成功
#配置文件 /etc/docker/daemon.json

#卸载dockder
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker

3.Docker镜像加速

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

三、Docker命令

1.帮助命令

docker version#Docker版本信息
docker info   #Docker详细信息
docker --help #Docker帮助命令

2.镜像命令

01)列出本地镜像

docker images #列出Docker镜像(本地的)
OPTIONS说明:
    -a #列出本地所有的镜像(含中间映像层)
    -q #只显示镜像ID
    --digests #显示镜像的摘要信息
    --no-trunc 1024s.cn#显示完整的镜像信息

02)查询镜像

docker se本文来自:1024s.cnarch XXX #去网站(https://hub.docker.com)查询 XXX 镜像
OPTIONS说明:
    --no-trunc #显示完整的镜像描述
    -s #列出收藏数不小于指定值的镜像。
    --automated #只列出automated build类型的镜像

03)下载镜像

docker pull xxx #下载镜像 xxx 
OPTIONS说明:
    xxx:3.2 #控制下载版本(默认省略不写为latest即最新版)

04)删除镜像

docker rmi xxx #删除本地镜像 xxx 
docker rmi -f xxx #强制删除 xxx
docker rmi -f xxx xxx1 xxx2 #删除多个
docker rmi -f $(docker images -qa) #删除全部

05)提交镜像到阿里云

sudo docker login --username=你的阿里云帐号 registry.cn-qingdao.aliyuncs.com
sudo docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/0x3e5/mycentos:[镜像版本号]
sudo docker push registry.cn-qingdao.aliyuncs.com/0x3e5/mycentos:[镜像版本号]

3.容器命令

01)新建容器

docker run xxx #新建并运行容器 xxx
OPTIONS说明:
    --name="容器新名字" #为容器制定一个名称
    -d #后台运行容器,并返回容器ID,也即启动守护式容器
    -i #以交互模式运行容器,通常与 -t 同时使用
    -t #为容器重新分配一个伪输入终端,通常与 -i 同时使用
    -P #随机端口映射
    -p #指定端口映射,有以下四种格式
        ip:hostPort:containerPort
        ip::containerPort
        hostPort:containerPort
        containerPort

02)启动容器

docker start XXX #启动容器 xxx可以是 容器ID 或者 容器名

03)重启容器

docker restart xxx #重启容器 xxx可以是 容器ID 或者 容器名

04)停止容器

docker stop xxx #停止容器 xxx可以是 容器ID 或者 容器名
docker kill xxx #强制停止容器 xxx可以是 容器ID 或者 容器名

05)退出容器

exit #容器停止并退出
CTRL+P+Q #容器不停止并退出

06)进入容器

docker attach xxx #进入容器已经打开的终端 xxx可以是 容器ID 或者 容器名
docker exec -t xxx ls #对容器xxx执行命令 ls 无需进入容器
docker exec -t xxx /bin/bash #对容器xxx打开新的终端,可以启动新的进程

07)查看容器状态

docker ps #查看当前运行的容器
OPTIONS说明:
    -a #列出当前所有正在运行的容器+历史上运行过的
    -l #显示最近创建的容器
    -n #显示最近n个创建的容器
    -q #静默模式,只显示容器编号
    --no-trunc #不截断输出

08)删除已停止的容器

docker rm xxx #删除已停止的容器 xxx可以是 容器ID 或者 容器名
docker rm -f #强制删除容器
docker rm -f $(docker ps -a -q) #删除当前全部容器
docker ps -a -q | xargs docker rm #删除当前全部容器

09)查看容器日志

docker logs -f -t --tail 容器ID #查看容器日志
OPTIONS说明:
    -t #加入时间戳
    -f #跟随最新的日志打印
    --tail n(数字) #显示最后多少条

10)查看容器内进程

docker top xxx #查看容器内进程 xxx可以是 容器ID 或者 容器名

11)查看容器内部细节

docker inspect xxx #查看容器内部细节 xxx可以是 容器ID 或1024s.cn者 容器名

12)从容器内拷贝文件到主机

docker cp xxx:/tmp /root #从xxx容器的/tmp文件夹 拷贝内容到主机的/root目录

13)从容器生成一个新镜像

docker commit -m="提交的描述信息" -a="作者" xxx 前缀(可以任意写)/要创建的目标镜像名:[标签名(版本号)] #xxx可以是 容器ID 或者 容器名

14)将容器端口映射到外部

docker run -it -p 8888:8080 tomcat #将容器端口映射到外部 8888是外部访问端口 8080是容器内部端口
docker run -it -P tomcat #将容Powered by 0x3E5器端口映射到外部随机分配端口

四、容器数据卷操本文来自:1024s.cn

1.添加数据卷

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 #新容器添加数据卷
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 #新容器添加数据卷并设置容器只读权限
#如果遇到读写错误在命令后边加
--privileged=true

2.DockerFile

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

Dockerfile编写规范

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

1)编写dockerfile文件

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

2)编译脚本生成镜像

docker build -f /mydocker/Dockerfile -t zzyy/centos . #编译dockerfile脚本 -t 前缀(可以任意写)/要创建的目标镜像名 最后要加“.”!!!

3)生成并运行容器

docker run -it 生成镜像名称

4)查看容器对接目录

docker inspect 容器名称/id
#一般默认目录在 /var/lib/docker/volumes/ 下

3.新容器继承某个容器的数据卷设置

docker run -it --name dc02 --volumes-from dc01 0x3e5/centos #继承自哪个容器就在参数后面加 --volumes-from 容器名/id

4.DockerFile体系结构(保留字指令)

FROM        #基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER  #镜像维护者的姓名和邮箱地址
RUN         #容器构建时需要运行的命令
EXPOSE      #当前容器对外暴露出的端口
WORKDIR     #指定在创建容器后,终端默认登录进来的工作目录
E1024s.cnNV         #用来在构建镜像过程中设置环境变量
# ENV MY_PATH /usr/tePowered by 0x3E5st 这个环境变量可以在后续的任何RUN指令中使用,也可以在其他指令中直接使用这些环境变量
#例如:WORKDIR $MY_PATH
ADD         #将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY        #类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
#COPY两种写法
#COPY src dest
#COPY ["src","dest"]
VOLUME      #容器数据卷,用于数据保存和持久化工作
CMD         #指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
#CMD指令的格式和RUN相似,也是两种格式:
#shell 格式:CMD <命令>
#exec 格式:CMD ["可执行文件","参数1","参数2"...]
ENTRYPOINT  #指定一个容器启动时要运行的命令
ONBUILD     #当构建一个被继承的Dockerfile时运行命令,赴京向在被子继承后赴京向的onbuild被触发

五、基本案例本文来自:1024s.cn

1.修改centos

#mycentos
FROM centos #基础镜像
MAINTAINER 0x3E5<4722957@qq.com> #设置作者

ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #修改工作目录

RUN yum -y install vim #安装vim编辑器
RUN yum -y install net-tools #安装ifconfig相关工具

EXPOSE 80 #对外暴露端口

CMD /bin/bash #容器启动时要执行的命令

2.制作自己的tomcat

FROM centos
MAINTAINER 0x3E5<4722957@qq.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.8.tar.gz /usr/local
#安装vim编辑区
RUN yum -y install vim
#设置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALIA_HOME/lib:$CATALIA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bi/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out