docker基本使用

docker基本使用

一、基本概念

1、简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

  1. DockerClient客户端
  2. Docker Daemon守护进程
  3. Docker Image镜像
  4. 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 常用指令

参考:Dockerfile 参考 |Docker文档

指令作用命令格式
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值