docker基本使用
一、基本概念
1、简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器 [2]
2、docker架构
Docker是一个CS架构的程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令
3、 镜像和容器
- 镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。镜像是一个只读模板,其中包含创建 docker 容器的说明。通常一个镜像基于另一个镜像产生,有一些额外的定制操作。
你可以创建自己的镜像,也可以使用其他人创建的镜像(发布在registry)。 - 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。容器是镜像的可运行实例。可以使用 docker API 或 CLI 创建、运行、停止、移动或删除容器。可以将容器连接到一个或多个网络,保存起来,甚至可以基于当前状态创建新镜像。
4、DockerHub
- DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
- 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
5、Registry
**概念:**Registry 是存放容器镜像的仓库,用户可进行镜像下载和访问,分为公有和私有两类
-
公有镜像仓库
- Docker Hub 是 Docker 公司为公众提供的托管 Registry
- Quay.io 现为 Red Hat 下的公共托管 Registry
- 阿里云:https://www.aliyun.com
- catalog.redhat.com
-
私有仓库
- 企业可以用 Docker Registry 构建私有的 Registry,**-**Registry 本身是一个开源项目,可以用于搭建私有 Registry
- Harbor,企业免费
- quay,收费
6、镜像加速
在国内使用docker官方的源比较慢,可以配置更换成国内的源。linux中需要配置/etc/docker/daemon.jsondaemon.json,此文件默认不存在,需要我们手动创建并进行配置,windows中在docker应用设置中更改即可。docker的加速就是通过配置此文件来实现的。
示例:
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://xxxxx.mirror.aliyuncs.com"
]
#第一个为docker中国官方的镜像,第二个为阿里云专属镜像(登录自己的阿里云账号即可:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)
7、docker 文件分层与数据卷挂载
参考:https://blog.csdn.net/leilei1366615/article/details/106269231
二、基本使用
1、linux系统下启动与关闭
-
启动docker
systemctl start docker 或 service start docker
-
关闭docker
systemctl stop docker 或 service stop docker
-
重启docker
systemctl restart docker 或 service restart docker
-
docker设置随服务启动而自启动
systemctl enable docker 或 service enable docker
-
查看docker 运行状态
#如果是在运行中 输入命令后 会看到绿色的active systemctl status docker 或 service status docker
2、docker登录仓库
操作前记得登录自己的账户,可以使用docker官方仓库
docker login -u 账户id
windows用户可以直接在UI上登录
3、查看docker基本信息
-
查看docker 版本号信息
docker version docker info
-
docker 帮助命令
忘记了某些命令便可使用此进行查看与回顾
docker --help
比如 忘记了拉取命令 不知道可以带哪些参数 咱可以这样使用
docker pull --help
-
查看docker工作目录
sudo docker info | grep "Docker Root Dir"
-
查看docker磁盘占用总体情况
du -hs /var/lib/docker/
-
查看Docker的磁盘使用具体情况
docker system df
4、拓展命令
-
删除 无用的容器和 镜像
#删除异常停止的容器 docker rm `docker ps -a | grep Exited | awk '{print $1}'` #删除名称或标签为none的镜像 docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
-
清除所有无容器使用的镜像
注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止
docker system prune -a
-
查找大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
-
查找指定docker使用目录下大于指定大小文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/test/*'
三、镜像操作
1、搜索镜像
# 在官方库中搜索镜像,命令格式
docker search [OPTIONS] 镜像名
#OPTIONS(选项)
--filter , -f:基于给定条件过滤输出
--format:使用模板格式化显示输出
--limit:最大搜索结果数 ,默认值25
--no-trunc:禁止截断输出,显示完整的摘要信息
--stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到--filter中使用
--automated:只列出automated build类型的镜像
示例:
#星星数在50以上
docker search --filter stars=50 nginx
#属于docker官方库中的镜像
–filter “is-official=true”
#搜索结果参数说明
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否为docker官方发布
STARS:类似于github中的star
AUTOMATED:自动构建
2、获取镜像
搜索得到镜像结果之后,就可以下载需要的镜像到本地
# 官方镜像
docker image pull 镜像名称[:tag]
# 或简写为
docker pull 镜像名称[:tag]
#tag可选,可以是版本号。注意镜像默认为仓库里最新版本,tag为latest,即镜像名称:latest
# 比如
docker pull ubuntu
docker pull ubuntu:16.04
# 个人镜像
docker pull 仓库名称/镜像名称
docker pull xunmi/django
# 第三方仓库拉去
docker pull 第三方仓库地址/仓库名称/镜像名称
docker pull hub.c.163.com/library/mysql:latest
(默认仓库名为library,所有从官方获取镜像相当于`docker image pull library/镜像名称`)
3、查看和删除镜像
-
查看当前所有镜像
docker image ls # 或者 docker images #结果标签 REPOSITORY: 镜像所在的仓库名称 TAG:镜像标签 IMAGEID:镜像ID CREATED:镜像的创建日期(不是获取该镜像的日期) SIZE:镜像大小
-
删除镜像
docker image rm 镜像名或镜像ID 或 docker rmi 镜像名或镜像ID docker image rm hello-world docker rmi 9e64176cd8a2
**注意:**删除镜像的前提是没有使用这个镜像的容器,如果有需要先删除容器(不然会报错)可以尝试先执行
docker rm 容器ID
删除容器几条删除命令的区别:
docker rm: 删除一个或多个 容器 docker rmi: 删除一个或多个 镜像 docker prune: 用来删除不再使用的 docker 对象
4、镜像打包
# 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
docker save -o 保存的文件名 镜像名
# 镜像解压
docker load -i 文件路径/备份文件
5、加载镜像
镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。
docker run [可选参数] 镜像名 [向启动容器中传入的命令]
常用可选参数 作用
常用可选参数 | 作用 |
---|---|
-i | 表示以“交互模式”运行容器。 |
-d | 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。 |
-t | 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 |
-name | 为创建的容器命名。(默认会随机给名字,不支持中文字符!!!) |
-v | 表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 |
-p | 表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口 |
–network=host | 表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。 |
示例:
#启动一个名为kali-test的kail系统
docker run -i -d -t --name=kali-test kalilinux/kali-rolling
可以简写为:
docker run -idt --name=kali-test kalilinux/kali-rolling
#使用容器搭建一个网站,启动后使用交互模式并直接登录到容器,如果希望后台启动-d开启进程守护
#映射容器80端口到本地8080端口(还有3306端口)以及容器目录到本地目录
docker run -ti -p 8080:80 -p 3309:3306 -v E:\www:/var/www/html --name web-lamp ubuntu /bin/bash
注意:这里的本地端口映射还可以加上ip,示例: -p 127.0.0.1:80:8080
注意:
利用-v映射挂载目录,就将容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件
添加参数--restart=always
便表示,该容器随docker服务启动而自动启动
四、容器操作
镜像加载后成为了容器
修改已经加载的容器配置:
利用update更新容器配置:示例添加自启动功能
docker update --restart=always 容器Id 或者 容器名
或
docker container update --restart=always 容器Id 或者 容器名
1、查看容器
查看容器主要会用到ps命令
# 查看当前所有正在运行的容器
docker ps
# 查看当前所有的容器
docker ps -a
# 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
docker ps -f name=指定的名字
# 显示2个上次创建的容器(2可以改变)
docker ps -n 2
# 显示最新创建的容器(包括所有状态)
docker ps -l
# 仅显示ip
docker ps -q
# 显示容器大小
docker ps -s
#标签含义
CONTAINER ID:镜像ID
IMAGE:创建容器的镜像名称
COMMAND:默认启动命令(启动时会自动执行)
CREATED:创建容器的日期
STATUS:当前的状态(启动了多久,多久之前退出等)
PORTS:映射的端口
NAMES:容器的名称
SIZE:容器大小(使用-s命令参数时才能看到)
查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
重命名容器
docker rename 容器ID/容器名 新容器名
2、启动和关闭容器
# 停止容器
docker container stop 容器名或容器id
# 或可简写为
docker stop 容器名或容器id
# 强制关闭容器
docker container kill 容器名或容器id
# 或可简写为
docker kill 容器名或容器id
# 启动容器
docker container start 容器名或容器id
# 或可简写为
docker start 容器名或容器id
注意:
- 如果我们成功启动或者关闭一个容器的话,会返回容器名或者容器id
- stop和kill的区别: stop是比较优雅的关掉一个容器,类似我们正常退出一个软件,而kill是当一个进程出现意外无法正常关闭的时候,我们强行进行关闭,有点像我们使用任务管理器进行结束进程操作
3、操作容器
首先我们确保我们要进入的容器是开启状态的,使用docker ps -a
查看其中的STATUS属性是否是Up开头,如果不是需要先开启容器
我们开启容器后,如果需要在容器内执行命令,可以将后台切换到前台,也可能使用docker命令将我们需要执行的命令传入。
常见命令
# 如果我只需要执行简单的一两条命令可以使用docker exec
# 执行单条命令 (-i: 启动并且保留交互式命令行; -t:作用是分配一个虚拟的终端; docker run )
docker exec -it 容器名或容器id 执行的命令
# 比如
docker exec -it kali-test whoami
# 用这种方法,我们还可以启动命令行,根据Linux的特性,系统程序会在/bin中,linux中常用的Shell有多个,其中大部分用的Linux默认的为bash
# 所以我们启动命令可以自行如下命令(除了/bin/bash外,linux一般还带/bin/sh、/bin/rbash、/bin/dash等)
docker exec -it 容器名或容器id /bin/bash
# 比如
docker exec -it kali-test /bin/bash
# 除了exec外还有attach可以使用,但它有个弊端,多终端启动attach后,都会会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
docker attach 容器名或容器id
# 比如
docker attach kali-test
exec可选参数 | 作用 |
---|---|
-d | 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。 |
-e | 设置环境变量 |
-i | 表示以《交互模式》运行容器。 |
-t | 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 |
-u | 设置用户名和UID。 |
-w | 设置容器内的工作目录。 |
除了上述方法外,在进入容器后,我们还可以尝试安装SSH(不建议)或者nsenter尝试登陆,不过这两种方法都先进入容器安装后才能使用
4、删除容器
要删除一个容器,首先需要确保这个容器已经停止了,因为正在运行的容器是无法直接删除,删除运行中的容器会报错。
可以运行一下docker ps -a
,如果发现没有停止,可以使用docker stop
停止(STATUS下已Exited开头则是停止的)
# 使用rm删除容器
docker rm 容器名或容器id
# 列如
docker rm ubuntu
5、容器制作镜像
- commit 方法
# 将容器制作成镜像
docker commit [选项] 要打包容器名 [仓库/镜像名[:TAG]]
#其他选项
-a:提交镜像的作者
-c:使用dockerfile来制作镜像
-m:提交时的说明文件,镜像说明摘要
-p:在commit时,将容器暂停
#注意:
这里的[仓库/镜像名[:TAG]]也可以直接是一个镜像名
然后在通过下面的命令打下标签,在上传
docker tag 镜像名 [仓库/镜像名:v1]
- Dockerfile
概念:文件指令集,描述如何自动创建 Docker 镜像,一般用于批量创建镜像,类似于批处理。可以实现一个文件从加载基础镜像、配置环境再到打包全过程。
是包含若干指令的文本文件,可以通过这些指令创建出 docker image
文件中的指令执行后,会创建一个个新的镜像层
文件中的注释以 “#” 开始
一般由 4 部分组成:镜像基础信息、容器启动指令、维护者信息、镜像操作指令
dockerfile 常用指令
指令 | 作用 | 命令格式 |
---|---|---|
FROM | 指定base镜像 | FROM : |
MAINTAINER | 注明镜像的作者 | MAINTAINER |
MAINTAINER | 注明镜像的作者 | MAINTAINER |
RUN | 运行指定的命令 | RUN |
ADD | 将文件从build context 复制到镜像中 | ADD [–chown=:]… |
COPY | 将文件从build context复制到镜像中 | COPY [–chown=:]… |
ENV | 设置环境变量 | ENV |
EXPOSE | 指定容器中的应用监听的端口 | EXPOSE [/…] |
USER | 设置启动容器的用户 | USER [:] |
CMD | 设置在容器启动时运行指定的脚本或命令 | CMD command param1 param2 |
ENTRYPOINT | 指定的是一个可执行的脚本或者程序的路径 | ENTRYPOINT command param1 param2 |
VOLUME | 将文件或目录声明为volume,挂载到容器中 | VOLUME [“/data”] |
WORKDIR | 设置镜像的当前工作目录 | WORKDIR /path/to/workdir |
示例:
echo haha > index.html
vim dockerfile
FROM httpd #指定镜像
COPY index.html / #将文件拷贝到镜像的根目录下
RUN echo haha #运行一条命令
#使用上面的dockerfile打包镜像
docker build -t tests . #-t指定镜像名 .为在当前目录中寻找dockerfile文件
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM httpd
---> a981c8992512
Step 2/3 : COPY index.html /
---> 9f026a199a7d
Step 3/3 : RUN echo haha
---> Running in 553668509bac
haha
Removing intermediate container 553668509bac
---> 3a9e4e5ee1bf
Successfully built 3a9e4e5ee1bf
Successfully tagged tests:latest
6、容器的导入导出
-
docker容器的导出
docker export [options] container
OPTIONS说明:
-o表示输出的文件,这里指定了输出的路径,如果没有指定路径,则默认生成到当前文件夹。
示例1:docker export -o redis.tar.gz redis 或 docker export redis > redis1.tar.gz
说明:将运行中的redis容器导出为redis.tar.gz包
scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径>
-
docker容器的导入
从tar包导入内容为docker镜像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
OPTIONS说明:
-c :应用docker 指令创建镜像; -m :提交时的说明文字
示例1:docker import redis.tar.gz redis:v1
示例2:docker import https://example.com/exampleimage.tgz
补充:
docker export和docker save的区别
(1)docker save保存的是镜像(image),docker export保存的是容器(container);
(2)docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
五、建仓库上传镜像
1、创建仓库
这里使用“registry” 镜像构建本地镜像仓库,需要下载“registry” 镜像,再把搭建好的镜像放到这个仓库(仓库本身也是镜像)中。
这里演示在线的私有仓库,可以直接登录网页创建: https://hub.docker.com/repositories/ 你的id
一般仓库是以用户id/镜像名
组成,默认每个人的仓库一id为名。
2、上传镜像
命令
ocker pull [仓库/镜像名[:TAG]]
#默认tag为lastas