Docker基础
Posted dingwen_blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础相关的知识,希望对你有一定的参考价值。
一、基本概念
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口
Docker组成
- Repository(仓库)
- Image(镜像)
UnionFS
(联合文件系统):Union文件系统(``UnionFS`)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual file system)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
- Container(容器) Docker 镜像创建的运行实例
二、工作原理
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
三、基础命令
-
docker --version
查看docker 版本 -
docker ps
查看当前正在运行的容器 -
docker ps -a
查看所有容器的状态 -
docker start/stop name/id
通过id或者name启动或者停止某个容器 -
docker attach id
进入某个容器(使用exit退出后容器也跟着停止运行) -
docker exec -ti id
启动一个伪终端以交互式的方式进入某个容器(使用exit退出容器不停止运行) -
docker images
查看本地镜像 -
docker rm id/name
删除某一个容器 -
docker rmi id/name
删除某个镜像 -
docker run -itd --name redis -p 6379:6379 redis
``-p 6379:6379
:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机
ip:6379访问到
Redis `的服务(主机端口:容器端口)。 -
systemctl start docker
启动docker服务 -
systemctl stop docker
停止docker服务 -
systemctl restart docker
重启docker服务 -
systemctl status docker
查看docker状态 -
systemctl enable docker
开机启动 -
systemctl info
查看docker概要信息
四、帮助命令
docker version
查看docker版本信息docker info
更详细的信息docker --help
帮助命令
五、镜像命令
docker images
列出本地主机上面的镜像
- -a 所有镜像(包括中间影像层)
- -q 只显示镜像ID
- –digests 显示镜像的摘要信息(注意是两条杠)
--no-trunc
显示完整的镜像信息
docker search
去docker hub查找镜像
--no-trunc
显示完整的镜像描述- -s 列出收藏数不小于指定数目的镜像
- –automated 只列出automated build类型的镜像
docker pull
镜像名称
- m默认是【镜像名称:latest 也可以指定tag标签
tomcat:9.8
docker rmi
镜像名称
docker rmi -f 镜像ID
删除单个docker rmi -f 镜像名称:tag 镜像名称:tag
删除多个docker rmi -f $(docker images -qa)
删除全部
- commit
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
六、容器命令
- 新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- –name 给容器新取一个名称
- -d 后台运行容器,并返回容器ID,即启动守护式容器
- -i 以交互模式运行容器,通常与-t 同时使用
- -t 给容器重新分配一个伪输入终端,通常与-t同时使用
- -P 随机端口映射
- -p 指定端口映射
//主机映射端口:容器启动端口
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
- 使用镜像
centos:latest
以交互模式启动一个容器,在容器内执行/bin/bash命令。docker run -it centos /bin/bash
- 列出当前所有正在运行的容器
docker ps [options]
- -a 列出当前所有正在运行的容器包括历史上运行过的
- -l 显示最近创建过的容器
- -n 2 显示最近创建过的第 2 个容器
- -q 静默模式,只显示容器编号
--no-trunc
不截断输出显示容器详细信息
- 退出容器
exit
容器停止退出ctrl + P + Q
容器不停止退出
- 启动容器
docker start 容器ID或者容器名称
- 重启容器
docker restart 容器ID或者容器名称
- 停止容器
docker stop 容器ID或者容器名称
- 强制停止容器
docker kill 容器ID或者容器名称
- 删除容器
docker rm 容器ID
一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
- 启动守护式容器
docker run -d 容器名
使用镜像
centos:latest
以后台模式启动一个容器docker run -d centos 问题:然后docker ps -a 进行查看, 会发现容器已经退出很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。 这个是docker的机制问题,比如你的web容器,我们以nginx
为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx
为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
- 查看容器日志```docker logs -f -t --tail 容器ID
- -f 跟随最新的日志打印
- -t 加入时间戳
- –tail 数字 显示最后多少条数据
- 查看容器内运行的进程
docker top 容器ID
- 查看容器内部细节
docker inspect 容器ID
- 进入正在运行的容器并以命令行交互
- docker exec -it 容器ID /bin/bash (默认有 /bin/bash)
- docker attach 容器ID
attach直接进入容器启动命令的终端,不会启动新的进程
exec是在容器中打开新的终端,并且可以启动新的进程 ```docker exec -it 容器ID /bin/bash
- 从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
docker cp 6011820691f1:/usr/local/tomcat/logs/localhost_access_log.2020-10-18.txt /dw
六、docker 数据容器卷
1.命令方式添加
docker run -it -v /home/dw/Documents/container-share-data:/share-data tomcat /bin/bash
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 //ro read only 权限
2.DockerFile
添加
- 新建并编写
DockerFile
文件
# current images base
FORM centos
# container data volume
VOLUME ["/dataVolumeContainer1","/dataVolume2Container2"]
# command
CMD echo "finished ---------------success!"
CMD /bin/bash
- 构建镜像
docker build [OPTIONS] PATH | URL | -
// . 表示当前目录的Dockerfile文件,注意名称必须完全一致,大小写敏感
docker build -t dw/centos --no-cache .
OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
- 使用当前目录的
Dockerfile
创建镜像,标签为runoob/ubuntu:v1
。
docker build -t runoob/ubuntu:v1 .
- 使用URL
github.com/creack/docker-firefox
的Dockerfile
创建镜像。
docker build github.com/creack/docker-firefox
- 也可以通过 -f
Dockerfile
文件的位置。
docker build -f /path/to/a/Dockerfile .
- 运行
//容器运行不退出
docker run -d centos /bin/bash -c “while true;do echo hello docker;sleep 1;done”
//前台交互形式运行
docker run -it 容器ID /bin/bash
- 镜像构建完成、容器启动成功后使用容器ID查看本机挂载目录(可先在容器对应挂载点新增文件方便对比)
docker inspect 容器ID
- 注意
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
七、数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
容器间传递共享(–volumes-from
docker run -it --name doc03 --volumes-from doc01 dw/centos
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止.即使把父容器删了也依然存在。
八、Dokcerfile
Dockerfile
是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
1.镜像构建三部
- 编写
Dockerfile
文件 - docker build
- docker run
2.Dokerfile
规范
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- # 注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
3.·执行Dockerfile
的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对镜像进行修改
- 提交一个新的镜像层
- docker运行新的镜像运行一个容器
- 执行下一条指令,直到所有指令都完成
4.关键字
From
当前镜像基于的基础镜像MAINTAINER
镜像维护者的姓名和邮箱地址RUN
容器构建时需要执行的命令EXPOSE
当前容器对外暴露出的端口WORKDIR
指定在创建容器后,终端默认登录的一个目录,落脚点ENV
用来在构建镜像过程中设置环境变量ADD
将宿主机目录下的文件拷贝进镜像且自动处理URL和解压tar压缩包COPY
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本COPY src dest / COPY ["src", "dest"]
+VOLUME
容器数据卷,用于数据保存和持久化工作CMD
制定一个容器启动时要运行的命令
Dockerfile
中可以有多个CMD
指令,但只有最后一个生效,CMD
会被 docker run 之后的参数替换 覆盖
ENTRYPOINT
指定一个容器启动的时候要运行的命令 追加ONBUILD
当构建一个被继承的Dockerfile
时运行命令,父镜像在被子继承后父镜像的onbuild
被触发
5.BASE
镜像 scratch
Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的
6.案例一:自定义镜像mycentos
(登录后的默认目录、vim编辑器、查看网络配置)
- 编写
Dockerfile
文件
FROM centos
MAINTAINER dw<dingwenemail@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
-
构建镜像
docker build -t mycentos:1.0 .
-
运行镜像
docker run -it --name mycentos mycentos:1.0
-
列出镜像的变更历史
docker history 镜像名称
6.案例二:CMD 和 ENTRYPOINT
Dockerfile
中可以有多个CMD
指令,但只有最后一个生效,CMD
会被 docker run 之后的参数替换.docker run 之后的参数会被当做参数传递给ENTRYPOINT
,之后形成新的命令组合.
7.案例三:制作CMD
版可以查询IP
信息的容器
DockerfileCMD
FROM centos
MAINTAINER dw<dwemail@qq.com>
RUN yum -y install curl
CMD ["curl","-s","http://ip.cn"]
- 构建镜像
docker build -t ipcmd -f /home/dw/Documents/DockerFiles/ip/DockerfileCMD .
- 后台运行
docker run --name ipcmd -d ipcmd /bin/bash -c "while true;do echo hello docker;sleep 1;done;"
8.案例四:制作ENTRYPOINT
版本容器
DockerfileENTRYPOINT
FROM centos
MAINTAINER dw<dwemail@qq.com>
RUN yum -y install curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
-
构建镜像
docker build -t ipentrypoint -f home/dw/Documents/DockerFiles/ip/DockerfileENTRYPOINT .
-
运行
docker run ipentrypoint -i
9.案例五:自定义tomcat9
- 准备tomcat、
jdk
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YdEpVbJR-1622904811561)(docker 基础.assets/4408)] - 编写
Dokcerfile
文件
# 来自哪一个基础镜像
FROM centos
# 作者加邮箱
MAINTAINER dw<dingwenemail@qq.com>
# 把宿主机当前上下文的touch.txt拷贝到/usr/local路径下
COPY touch.txt /usr/local/ctouch.txt
#把jdk和comcat添加到容器中
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.39.tar.gz /usr/local/
# 安装vim编辑器
RUN yum -y install vim
# 设置登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置jdk和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_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/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/bin/logs/catalina.out
- 生成镜像
docker build -t tomcat9 .
- 运行
docker run -d -p 8080:8080 --name tomcat9 -v /home/dw/Documents/DockerFiles/tomcat9/test:/usr/local/apache-tomcat-9.0.39/webapps/test -v /home/dw/Documents/DockerFiles/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.39/logs --privileged=true tomcat9
- 添加web测试
以上是关于Docker基础的主要内容,如果未能解决你的问题,请参考以下文章
markdown [Docker] Docker片段列表和命令#linux #docker #snippets