Docker能支持哪些复杂的应用场景?
摘要:目录Docker实际应用docker 管理镜像操作容器操作Dockerfile命令学习一些Docker的图解 Docker实际应用 docker 管理 镜像操作 搜索对应镜像 docker serarch xxx 查看现有镜像 docker
目录Docker实际应用docker 管理镜像操作容器操作Dockerfile命令学习一些Docker的图解
Docker实际应用
docker 管理
镜像操作
搜索对应镜像
docker serarch xxx
查看现有镜像
docker images
docker images ls
docker images image_name # 也可以直接查找镜像名
拉取镜像
docker pull xxx # 默认default版本
docker pull xxx:xxx # 可以冒号后面指定版本号
镜像配置文件路径(该文件内容是用的json格式数据)
docker info # docker信息,包含了路径
一般情况下在 /var/lib/docker 下
docker info | grep root # 不确定的话可以直接查看对应数据存放的目录
可以接着去看该目录下对应的内容,下图直接告诉你存放docker镜像配置文件的具体位置
# 查看镜像的信息
docker images inspect 镜像id
删除镜像
docker rmi 镜像名字
# 删除所有镜像, 参数a就是显示所有镜像,q就是只显示镜像id,所以列出来后再进行rmi就很方便了
docker rmi `docker images -aq`
这里删除的时候可能会因为容器被挂起了,或者容器被使用过无法删除镜像,这里需要找到对应的容器删除,那删除容器后面会讲
导入/导出镜像
# 导出
docker save nginx:latest -o docker_nginx_latest.tar.gz
docker save nginx > /opt/docker_nginx_latest.tar.gz
# 导入
docker load -i docker_nginx_latest.tar.gz
当前状态保存为一个新的镜像
# commit 命令
OPTIONS说明:
-a :提交的镜像作者。
-c :使用 Dockerfile 指令来创建镜像。
-m :提交时的说明文字。
-p :提交镜像前暂停容器(默认为 true)。
将名为 my_container 的容器保存为一个名为 my_new_image 的新镜像
指定标签: docker commit my_container my_new_image:latest
给镜像打标签
通过为镜像打标签,可以使用更容易记忆的名字或版本号来标识和管理镜像
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- SOURCE_IMAGE[:TAG]: 源镜像名称和标签,标签默认为 latest。
- TARGET_IMAGE[:TAG]: 目标镜像名称和标签,标签默认为 latest。
容器操作
运行容器
docker run nginx:xxx
# 也可以在运行容器的时候执行一个命令
docker run nginx:xxx ping baidu.om
# 上述中运行了一个容器,容器运行了ping biadu.com,所以当你终止ping baidu.com 的时候这个容器也就终止了
# 参数-i 交互模式 参数-t开启一个终端
docker run -it nginx:xxx bash
# 上面这个就是运行nginx的时候进入一个交互模式,并且运行一个命令bash,因为你bash才能交互,
# 上面的都是:如果你中断了该进程比如ping 或者 你进入的那个bash交互,中断了之后容器也终止了
# 那我们就需要另一个参数 -d 在后台运行容器
docker run -d nginx:xxx ping biaud.com
如下图所示一:command中就是你运行的命令,当然具体情况看你执行了什么
指定容器运行的名字
docker run -d --name xxx nginx:xxx
容器启动
docker start 容器名/容器id
停止容器
docker stop 容器名/容器id
删除容器
docker rm 容器名/容器id
查看某个容器的日志
# 查看该容器的所有日志,注意:会显示非常多
docker logs 容器id
# 监听日志参数 -f
docker logs -f 容器id
查看已有容器
docker ps
# 查看不管挂掉还是停止了的容器
docker ps -aq
查看容器详细信息
# 这个依旧是json数据,显示容器的具体详细信息
docker container inspect 容器id
容器端口映射
# 这里就是物理机的84端口与容器内的80端口映射
# 也就是说你物理机访问84端口就可以访问到容器的80端口
docker run -p 84:80 nginx
# 实际情况中当然还要结合其他参数,比如-d后台执行,--name 指定容器的名字 等等
Dockerfile
Dockerfile文件,可以通过docker build . 来构镜像
这个就是当你有这个Dockerfile文件后,你通过这个命令能够根据你这个文件的配置去构建一个镜像
命令学习
FROM
从现有镜像指定一个作为基础
先去本地看是否存在该镜像,若有就直接使用,若没有则需要去仓库中在线下载
RUN
从你这个镜像中,你希望运行一个容器后他要做什么
ADD <物理机的源目标/URL> <容器的目录目标>
添加宿主机的文件到容器内
ADD 添加进容器,若源文件为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到目标路径
若ADD指定的是一个URL,则会去下载然后放到目标目录中
COPY
和ADD功能差不多,但官方推荐使用这个,因为这个单单只是复制仅此而已,不会对什么压缩包额外进行解压之类操作
WORKDIR
类似CD,就是在创建容器后,进入的目录的位置
在你配置Dockerfile的时候,可能需要切换目录去做一些操作,那这个就类似cd
这也就是为什么上面所说有的容器进入的时候,发现他的默认目录不一样,这是因为写Dockerfile的那个人可能用这个切换了目录去做一些事情,也有可能希望用户默认进入的目录是某个目录等等
VOLUME
挂载,就是类似vmware的目录映射,将物理的某个目录映射到容器内的某个目录
当你访问容器内那个目录的时候就相当于访问映射的那个物理机的目录
这个更多的作用是:
确保应用产生的数据不写入应用层,而是将数据写入到我们的物理机中想要存储的位置,所以我们就可以用VOLUME
还有一个方式是当你run的时候,指定参数-v指定目录挂载
当你构建了一个镜像后,且运行了一个该镜像的容器后可以通过docker inspect 容器id来查看你挂载的目录在哪,下面这个就是自动指定的一个物理机中的目录,你VOLUME指定的是容器中哪个目录
CMD ["参数1", "参数2"]
该命令不允许在run的时候额外传入参数,所以这就需要后面学习的ENTRYPOINT命令
比如我们docker run -it nginx bash中最后一个bash就是我们进入容器执行的一个命令
若不指定,那就是默认我们写的dockerfile中构建的这个容器的配置中写的这个CMD了
所以该CMD的作用就是默认你进入容器的命令
例子:
CMD ["cat", "/etc/passwd"] # 这个就是等于正常的cat /etc/passwd
CMD ["/bin/bash"]
ENTRYPOINT
简单点直接看例子:
Dockerfile重新修成下面这样
------------
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
------------
当你run的时候就可以传参了:docker run nginx:test -c /etc/nginx/new.conf
这个可不是重新传入一个新命令哈,这个是重新传入-c参数并指定新的一个conf文件进去
(容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
EXPOSE
EXPOSE <端口1> [<端口2>...]
仅仅只是声明端口,不会作用于你实际的映射端口(除非你使用随机映射参数-P的时候才会起到帮忙随机你指定的端口)
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
理解:
EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
ENV/ARG
ENV 在构建镜像和容器运行的时候都可以找得到能使用
ARG 只在构建镜像的时候能用,容器跑起来的时候找不到不能用
User
切换用户
USER root
USER test
MAINTAINER
维护者信息(可选)
一些Docker的图解
看视频课过程中截图下来的一些图解
这里主要要注意增删的时候都是只在容器层处理,基础镜像这些不会被改变,只做记录,这是为了保证你这个镜像image可以启动多个容器而不会因为某个容器修改导致其他容器想要使用的时候镜像被修改了
现阶段我个人所需的且能用到的就这些,后续可能会有更多的补充内容。
