Docker知识学习

Docker

Docker是一个开源的容器引擎,让开发者可以打包他们的应用程序以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,dockers也可实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:

  1. DockerClient客户端
  2. Docker Daemon守护进程
  3. Docker Image镜像
  4. DockerContainer容器
    Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
    在这里插入图片描述
    Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
    Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
    docker镜像一run就生成为docker容器。
    docker对系统资源的利用率非常高,一个主机上可以运行上千个docker容器。
    传统的虚拟机要部署10个不用的应用需要起10台虚拟机,而docker只需要起10个容器即可。
    Docker容器是一个系统级别的服务,拥有自己的IP和系统目录结构。
    Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。
    传统的虚拟机 技术是虚拟出一整套硬件后再在其上安装一个完整的操作系统,在该操作系统上运行所需应用。
    LXC:(Linux contaniner)Linux容器虚拟技术。
    容器和虚拟机的对比:
    在这里插入图片描述
    Docker技术的三大核心概念:镜像、容器、仓库。

安装docker:https://docs.docker.com/engine/install/centos/
docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像则就去镜像仓库下载。
docker的工作原理:docker是一个Client-Server结构的系统,docker守护进程运行在主机上,守护进程从客户端接受命令并管理运行在主机上的容器,容器是一个运行时环境,这就是我们说的集装箱。
docker version:查看docker版本
docker –h或–help:查看docker帮助文档
docker info:显示docker系统的信息
docker images:列出本地的所有镜像
docker pull softwareName:tag :拉取一个指定版本的镜像,不加tag标签号默认pull最新的镜像
docker kill containerName:终止一个正在运行的容器
docker rm [option] container_ID:移除一个容器,加-f表示强制移除。
docker ps [option]:查看当前宿主机上容器列表。默认只查看runing中的容器。
[option]主要有:
-a :相当于all,查看所有的容器列表。
-q : 只显示容器ID,如docker ps –aq docker images -q

容器有一共有7种状态:cerated(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(已停止)、dead(死亡).
下载指定本版镜像:docker pull mysql:7.0,如果不使用双冒号指定所要拉去的镜像版本则默认拉去最新的版本。
docker search 镜像名称:从默认仓库中搜索指定的镜像
docker rmi image_name:移除一个镜像,-f可以强制移除
docker rm container_ID:移除一个容器,-f可以强制移除
docker stop container_ID:停止一个正在运行的容器
docker start container_ID:启动一个已经停止的容器
docker restart container_ID:重启容器
创建并启动容器语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
option说明:()有些是单个-符号,有些是两个—符号
–name :为容器指定一个名字
-d :后台运行容器,并返回容器ID,也即启动守护式容器。
-i :以交互式运行容器,通常与-t同时使用
-t :为容器重新分配一个伪输入终端,通常与-i同时使用
-P :随机端口映射
-p :指定端口映射 方式: -p 8089:8080 其中前面那个是暴露在外部的端口,后面那个容器内部端口,我门知道docker是沙箱机制,想要外部程序能访问docker就必须暴露一个端口让外部访问。
如:docker run –it –d –p 8089:8080 tomcat /bin/bash
exit :退出并关闭容器
CTRL+p+q :退出不关闭容器
强制删除所有容器:docker rm –f $(docker ps -aq)

docker容器后台运行就必须有一个前台进程,容器的命令如果不是那些一直挂起的命令(如top,tail)就会自动闪退,因为他觉得没事做了就会自动自杀,这是docker的机制问题。

docker logs [option] container_ID:查看指定容器的日志信息
–tail n :查看日志末尾n行,不加n表示all.
-t:显示时间戳
-f :持续追踪日志
docker top container_ID:显示指定正在运行的容器进程信息

docker inspect [option] image_ID/container_ID:查看某个镜像或容器的细节信息(信息很全)
docker inspect image_ID:查看镜像信息(包含版本)
进入正在运行的容器并以命令行交互:
方式1:docker exec –it container_ID /bin/bash
方式2:docker attach container_ID
两种方式的区别:exec –it 表示在容器打开新的终端并开启新进程,这样即使exit也只是退出自己的终端。attach则是直接进入容器终端,不会启动新的进程。
复制命令,从容器复制文件到物理主机或从主机复制文件到容器:
docker cp container_ID:file_path host_filesystem_path
docker cp host_filesystem_path container_ID:file_path
如docker cp 15d0def0fd10:/usr/local/tomcat/webapps/ /home/guo/Test
docker cp /home/guo/Test 31812cb98a0c:/usr/local/tomcat
docker镜像都是只读的。当容器启动后,一个新的可写的镜像被加载到镜像层的顶部,这一层通常被叫做容器层,容器层之下的都叫镜像层。
docker的commit操作:当镜像运行之后可以修改容器里面的内容,在提交成一个新的镜像。
语法:docker commit –m ”新镜像描述信息” –a “作者” container_ID 新镜像名:[标签]
注意:要加双引号
移除所有容器:docker rm $(docker stop $(docker ps -aq))
docker运行tomcat必须使用-p指定端口,否则外部将访问不到tomcat。开放了端口docker ps查看是这样的:0.0.0.0:1780->8080/tcp,未开放端口是这样的:8080/tcp。
容器数据卷:
在docker容器中产生的数据如果不通过docker commit 保存镜像使得数据作为镜像的一部分保存下来,那么在容器被删除之后数据也随之没有了,为了能搞保存数据,我们使用数据卷的办法来保存。
数据卷和数据卷容器
使用docker过程中,我们需要查看容器中产生的数据,以及容器与容器之间、容器与主机之前进行数据共享、备份等操作,这里就需要到容器的数据管理。 数据的管理目前提供如下两种方式:
#数据卷 data volumes
#数据卷容器 data volumes containers
数据卷:说白了就是一个特殊目录,类似linux下对目录或文件进行mount挂载操作,即在宿主机和容器之间建立一个或多个目录来相互映射文件,其具有如下特点:
(1) 数据卷可以在容器之间进行共享和重用
(2)对数据卷的更改会立即生效
(3)对数据卷的更新不会影响到镜像 (镜像只读)
(4)卷会一直存在,直到容器被rm
注意:
(1)删除容器的时候,数据卷不会删除。如果要删除容器的时候同时删除数据卷,需加上-v参数。比如: docker rm os456 -v /homedata (-v参数在本机上报错)
(2)默认数据卷挂载以后文件的权限为rw,如需单独设置,可以容器数据卷后边设置:ro只读。
数据卷容器:
建立的容器很多时候不是单一的,需要容器之间进行数据共享,进行数据同步和更新操作。这样就需要建立一个数据卷容器。
数据卷容器就是一个普通的容器,里边带有设置好的数据卷,专门提供给其他容器挂载使用。 通过–volumes-from 数据卷容器名 来实现。
我有一个网站程序放到了服务器本机的/Webdata目录 ,下边创建一个数据卷容器centos,同时将我服务器上的/Webdata挂载到数据卷容器的/ test_date目录下:
docker run -itd -v /Webdate:/test_date --name centos centos:latest
接着分别创建了两个容器,都通过–volumes-from centos 挂载了同一个数据卷容器centos,进入centos1和centos2 分别查看/ test_date可见数据都是存在的,于是这里就实现了数据的共享同步:
docker run -itd --volumes-from centos --name centos1 centos:latest
docker run -itd --volumes-from centos --name centos2 centos:latest
这样在任何一个数据卷目录修改其内容都会映射到其他容器对应的目录。
说明:
1,可以多次使用–volumes-from参数从多个容器挂载多个目录。 也可以从其他已经挂载了数据卷的容器来挂载数据卷(类似传递)。
2,如果删除了挂载的容器,数据卷不会被自动删除。如果要删除容器的时候同时删除数据卷,需加上-v参数。
3,使用–volumes-from参数所挂载的数据卷容器本身并不需要保持运行状态,依旧可以挂载
创建数据卷:
docker run -it -d --name mycentos –v /home/guo/docker_share_file/:/root/docker_share_file – privileged=true centos /bin/bash
使用-v参数来指定要创建数据卷,/home/guo/docker_share_file/:/root/docker_share_file 前半部分是主机中已存在的目录,后半部分是容器里要创建的目录,容器创建成功后,在主机和容器之间docker_share_file这个目录里面的内容就完全一样的,即另外一边更改就会同步到另一边,数据完全共享,这就可以让人快速部署项目了,如docker部署tomcat时,创建数据卷并对应容器的webapps目录之后,就可以直接在外部主机拷贝文件到对应的数据卷目录即可。
– privileged=true 此参数表示容器内对应的数据卷目录可读可写。
–v /home/guo/docker_share_file/:/root/docker_share_file:ro 表示只读,默认Rw.
虽然docker cp 命令可以在主机与容器之间传输文件,但建议使用数据卷。创建容器时可以指定多个-v参数来创建多个数据卷。路径必须是绝对路径,目录不存在会创建目录,可挂载多个数据卷。
docker inspect container_ID 中 Mounts节点可查看数据卷的相关信息,如路径和权限等。
数据卷是双向的,即主机文件夹内容的修改会映射到容器对应的文件夹内容,反之亦然,即使容器停掉后修改主机的文件内容,容器启动后都会映射主机内容。
容器之间也可以有数据卷。待详解。
dockerfile讲解
1、 每条保留字指令都必须是大写字母后面要跟随至少一个参数
2、 指令从上到下执行
3、 #表示注释符
4、 每条指令都会创建一个新的镜像层并对镜像进行提交
dockerfile的运行流程:
1、 dockerfile从基础镜像运行一个容器
2、 执行一条指令并对容器进行修改
3、 执行类似于docker commit的提作提交一个新的镜像
4、 docker在基于刚才提交的镜像运行一个容器
5、 执行dockerfile的下一条指令再从执行第2条直到没有指令
从应用软件的角度来看,dockerfile、docker 镜像、docker 容器分别代表软件的三个不同阶段:dockerfile是软件的原材料,docker镜像是软件的交付品,docker 容器是软件的远行状态。
dockerfile面向开发,docker镜像成为交付标准,docker 容器涉及部署和运维,三者缺一不可,共同成为docker体系的基石。
dockerfile关键字(都是大写)
FROM :基础镜像,定义当前镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUM:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露的端口
WORKDIR:定义创建容器后,终端进入容器的默认工作目录
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝到镜像,且自动处理URL和自动解压tar包
COPY:类似于ADD命令,拷贝文件和目录到镜像中,语法:COPY src dest COPY [“src”,“dest”]
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD: 指定一个容器启动是要运行的命令格式:
shell CMD <命令>
exec CMD <”可执行文件”,”参数1”,”参数2”>
dockerfile可以有多个CMD命令,但只有最后一个生效,CMD会被docker run 之后的参数替换
ENTEYPOMT:指定一个容器启动是要运行的命令
OBBUILD:当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承触发父镜像的onbuild
容器的导入导出
当别人需要的你的容器时,你可以使用export命令导出一个tar压缩包给他,然后他就导入impport这个压缩包到他的机器上成为他本地的镜像。还可以用save命令来生成一个tar压缩包给他,然后他就load导入这个压缩包到他的机器上成为他本地的镜像。
export导出语法:
export Export a container’s filesystem as a tar archive
Usage: docker export [OPTIONS] CONTAINER
Options:
-o, --output string Write to a file, instead of STDOUT
示例:(以下两条命令运行结果是等价的)
docker export red_panda > latest.tar
docker export --output=“latest.tar” red_panda
import导入语法:
import Import the contents from a tarball to create a filesystem image
Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Options:
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Set commit message for imported image
示例:()
docker import /home/guo/test1.tar mytest:1.0
cat /home/guo/test1.tar | docker import – mycentos:1.1.0
save语法:
Usage: docker save [OPTIONS] IMAGE [IMAGE…]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, --output string Write to a file, instead of STDOUT
示例:(以下两条示例是等价的)
docker save -o /home/guo/Testcentos.tar centos:latest
docker save centos_vim:1.0.0 > /home/guo/testcentos.tar
load语法:
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
示例:(以下两条命令结果等价)
docker load -i /home/guo/testcentos.tar
docker load < /home/guo/testcentos.tar
这样load的镜像原来是什么名称load之后回来就是什么名称,这里的额testcentos.tar只是包名。
其中-i和<表示从文件输入,会成功导入镜像及相关元数据,包括tag信息。
export与import是一对,save与load是一对,他们的区别:
1、docker Sava 保存的是镜像(image),docker export 保存的是容器(container);
2、docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
3、docker load不能对载入的镜像重命名,而docker import可以为载入的镜像重命名。
• 注意: save导出的是镜像打包的tar文件,此类文件只能用load进行导入。
• import只能导入export生成的容器镜像tar文件或基于本地的镜像模板;import通常和cat命令搭配使用。

使用portainer管理容器
先运行portainer:docker run -it -d -p 9000:9000 --restart=always --name portainer -v /var/run/docker.sock:/var/run/docker.sock 2869fc110bf7
网页打开:

猜你喜欢

转载自blog.csdn.net/MssGuo/article/details/114285480
今日推荐