Docker基础知识梳理
目录
架构
概念
-
Docker 是一个开源的应用容器引擎
-
docker客户端
docker客户端是用户与docker服务交互的窗口,也就是我们通常操作各种docker命令的终端。
-
docker服务
docker daemon的守护进程
docker deamon监听着客户端的请求,并且管理着docker的镜像、容器、网络、磁盘(图中只列出了镜像与容器)等对象
-
仓库
类似于代码仓库github,但这个是docker镜像的仓库
-
镜像
docker镜像是一个只读模板,可以用来创建docker容器。镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。
镜像是一层套一层。
-
容器
镜像的一份运行实例
-
容器数据卷
容器内的数据需要持久化到宿主机上是很有必要的,这就需要用到数据卷
容器数据卷的设计目的就是做数据的持久化和容器间的数据共享,数据卷完全独立于容器的生命周期,也就是说就算容器关闭或者删除,数据也不会丢失。简单点说就将宿主机的目录挂在到容器,应用在容器内的数据可以同步到宿主机磁盘上,这样容器内产生的数据就可以持久化了。关于容器卷的命令我们后面会有操作实例!
安装
常用命令
本地镜像命令
-
docker images
查看本地主机上所有的镜像。
还可以通过docker images nginx指定某个具体的镜像查看对应信息。
注意:镜像名是会重复的,只有image id才是唯一的标识。
-
docker rmi
删除本地的镜像
-
docker tag
标记本地镜像,将其归入某一仓库。
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] docker tag ubuntu:15.10 jm/ubuntu:v3
-
docker history
docker history jm/ubuntu:v3
-
docker build
命令用于使用 Dockerfile 创建镜像。
docker build [OPTIONS] PATH | URL | -
options详见:Docker build 命令 | 高手教程
-
docker save
将指定镜像保存成 tar 归档文件。
docker save -o my_ubuntu_v3.tar jm/ubuntu:v3
-
docker import
从归档文件中创建镜像。
docker import my_ubuntu_v3.tar jm/ubuntu:v4
镜像仓库
-
docker login
登陆到Docker Hub
docker login -u 用户名 -p 密码
登出Docker Hub
docker logout
-
docker search
根据镜像名称搜索远程仓库中的镜像
-
docker pull
搜索到某个镜像之后就可以从远程拉取镜像啦,类似git中的pull命令,对应的还有个docker push的命令。
-
docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。
docker push myapache:v1
容器生命周期命令
-
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 可以基于某个镜像运行一个容器,如果本地有指定的镜像则使用本地镜像,如果没有则从远程拉取对应的镜像然后启动。
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash
-d:启动容器,并且后台运行(docker容器后台运行,就必须要有一个前台进程,容器运行的命令如果不是一直挂起的命令,容器启动后就会自动退出); 启动后没有进入到容器内部,还是在宿主机。 -i:以交互模式运行容器,通常与-t同时使用; -t:为容器重新分配一个伪输入终端,通常与-i同时使用(容器启动后进入到容器内部的命令窗口); -P:随机端口映射,容器内部端口随机映射到主机的高端口; -p:指定端口映射,格式为:主机(宿主)端口:容器端口; -v:建立宿主机与容器目录的同步;注意的是这里的同步是双向的。 --name="myTomcat": 为容器指定一个名称(如果不指定,则有个随机的名字);
更多options详见Docker run 命令 | 高手教程
-
docker create
创建一个新的容器但不启动它
-
退出容器
进入到容器后可以通过exit命令退出容器,也可以通过ctrl+P+Q快捷键退出容器,这两种方式的不同之处是exit会退出并且关闭容器,而ctrl+P+Q快捷键只是单纯的退出,容器还在运行,并且还能再次进入。
-
docker start
启动一个或多个已经被停止的容器
-
docker stop
停止一个运行中的容器
-
docker restart
重启容器
-
docker pause
暂停容器中所有的进程。
-
docker unpause
恢复容器中所有的进程。
-
docker exec
在运行的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
在容器mynginx中以交互模式执行容器内/root/jm.sh脚本
jm@jm:~$ docker exec -it mynginx /bin/sh /root/jm.sh
在容器mynginx中开启一个交互模式的终端
jm@jm:~$ docker exec -i -t mynginx /bin/bash root@b1a0703e41e7:/#
-
docker rm
删除一个或多少容器
-
docker kill
杀掉一个运行中的容器
容器操作
-
docker ps
列出容器,没有加options,默认展示正在运行的容器。
options:
-a :显示所有的容器,包括未运行的。 -f :根据条件过滤显示的内容。 --format :指定返回值的模板文件。 -l :显示最近创建的容器。 -n :列出最近创建的n个容器。 --no-trunc :不截断输出。 -q :静默模式,只显示容器编号。 -s :显示总的文件大小。
-
docker top
查看容器中运行的进程信息,支持 ps 命令参数
-
docker attach
连接到正在运行中的容器。attach是可以带上–sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
-
docker inspect
获取容器/镜像的元数据,关于容器/镜像配置信息。
-
docker events
从服务器获取实时事件
显示docker 2019年11月2日后的所有事件:
docker events --since="1572624000"
-
docker logs
获取容器的日志
-f : 跟踪日志输出 --since :显示某个开始时间的所有日志 -t : 显示时间戳 --tail :仅列出最新N条容器日志
sudo docker logs -f jm-php7-2-php-fpm
-
docker port
列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
容器其他命令
-
docker commit :从容器创建一个新的镜像。
-a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :在commit时,将容器暂停。
将容器 jm-php-7-2-php-fpm 保存为新的镜像 php72web并打上tag为v1,添加提交人信息和说明信息。
docker commit -a "tsingchan" -m "new php7.2 webserver" jm-php-7-2-php-fpm php72web:v1
-
docker cp
用于容器与主机之间的数据拷贝。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
options:
-L :保持源目标中的链接
注意:docker cp支持直接复制目录;
注意:docker cp支持重命名;
将主机/www/data目录拷贝到容器jm-php-7-2-php-fpm的/www目录下。 docker cp /www/data jm-php-7-2-php-fpm:/www/ 将主机/www/data目录拷贝到容器jm-php-7-2-php-fpm中,目录重命名为www。 docker cp /www/data jm-php-7-2-php-fpm:/www 将容器jm-php-7-2-php-fpm的/www目录拷贝到主机的/tmp目录中。 docker cp jm-php-7-2-php-fpm:/www /tmp/
-
docker diff
检查容器里文件结构的更改
sudo docker diff jm-php7-2-php-fpm C /run A /run/php-fpm.pid C /etc C /etc/php C /etc/php/7.2 C /etc/php/7.2/fpm C /etc/php/7.2/fpm/conf.d A /etc/php/7.2/fpm/conf.d/99-overrides.ini
其他命令
- docker info : 显示 Docker 系统信息,包括镜像和容器数。
- docker version :显示 Docker 版本信息
Dockerfile
我们可以从远程pull一个镜像,那远程的镜像是怎么来的呢?
如果我们想自己创建一个镜像又该怎么做呢?
这就涉及到Dockerfile了,Dockerfile是一个包含用户能够构建镜像的所有命令的文本文档,它有自己的语法以及命令,docker能够从dockerfile中读取指令自动的构建镜像。
我们要想编写自己的Dockerfiler并构建镜像,那对Dockerfile的语法和命令的了解就是必须的。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
更多关于dockerfile指令详解:Dockerfile基础知识梳理-9ong
docker-compose
Docker Machine
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Swarm
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。