Docker基本操作

为君一笑 提交于 2020-12-06 18:50:47

Docker

简介

什么是docker?A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.

简而言之docker就是一个容器,将代码、依赖、环境配置等打包,打包好的容器可以发布到任何流行的linux上,能做到一次配置,到处运行。

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

docker 中主要有两个概念 image (镜像)、container (容器),镜像是只读的,可移植;容器是可写的,可执行的,我们运行的都是容器,在容器里配置我们的服务并启动,配置完整的容器可以 commit 成为新的镜像。举个例子说明,镜像就像是 redis 的官方压缩包,里面有它自己的一些默认配置,这些配置都是制作镜像的人自己配置的,而容器就是解压以后的 redis ,我们可以对其做定向修改并启动它,同时我们可以将修改了配置以后的 redis 再次压缩成为一个压缩包,它便成了一个新的镜像。

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。

总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

 

 最常用的包括Images和Container,

Images中存放下载的环境,仅可读

Container(容器),可读可写,主要操作是在部份进行。

Repository (仓库)     集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库(Github)。

Docker 使用 C/S 结构,即客户端/服务器体系结构。 Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。 Docker 客户端和服务端可以运行在一台机器上,也可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。

docker-framework

这张图展示了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud ),默认情况下Docker 会在 Docker 中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于 Git ,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。

1、开始安装,整起:

删除有关docker的旧版本依赖:

        sudo yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

 sudo yum install -y yum-utils \

      device-mapper-persistent-data \

      lvm2

设置docker仓库:

        sudo yum-config-manager \

        --add-repo \

        https://download.docker.com/linux/centos/docker-ce.repo

启用docker仓库:

    sudo yum-config-manager --enable docker-ce-nightly

安装最新的docker ce:

    sudo yum install docker-ce docker-ce-cli containerd.io

启动docker服务:

    sudo systemctl start docker

测试docker是否安装好:

 docker run hello-world

执行该命令以后会出现以下的提示:

    Unable to find image 'hello-world:latest' locally

    latest: Pulling from library/hello-world

    1b930d010525: Pull complete

    Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e

    Status: Downloaded newer image for hello-world:latest

    Hello from Docker!

    This message shows that your installation appears to be working correctly.

2、常用指令

image 命令:

- docker images : 查看docker镜像

- docker build :由Dockerfile构建镜像

- docker rmi :删除镜像

- docker create : 由镜像构建容器

- docker search : 搜索镜像

- docker pull : 拉取镜像

container 命令:

- docker ps : 查看容器

- docker rm : 删除容器

- docker attach: 连接正在运行的容器

- docker exec : 在容器中执行命令

- docker commit : 由容器构建新的镜像

- docker stop : 关闭容器

- ctrl + p + q : 退出容器(不会关闭容器)

- exit : 退出容器(会关闭容器)

info     显示 Docker 系统信息,包括镜像和容器数

docker info

version    显示 Docker 版本信息

docker version

search     从Docker Hub查找镜像

docker search [OPTIONS] TERM
    

OPTIONS说明

参数 解释
--automated 只列出 automated build类型的镜像
--no-trunc 显示完整的镜像描述
-s 列出收藏数不小于指定值的镜像

登陆操作

和github有点类似,可以再阿里云上建立自己的docker仓库:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

 

login     登陆到一个 Docker 镜像仓库

docker login

docker login -u 用户名 -p 密码

logout   退出Docker 镜像仓库

docker logout

pull        从镜像仓库中拉取或者更新指定镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS说明

参数 解释
-a 拉取所有 tagged 镜像
--disable-content-trust 忽略镜像的校验,默认开启

    样例docker pull hub.c.163.com/library/mysql:latest

push

将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

docker pull NAME[:TAG|@DIGEST]
eg: docker push myapache:v1
 

build

使用Dockerfile创建镜像

docker build [OPTIONS] PATH | URL | -

OPTIONS说明

参数 解释
--build-arg=[] 设置镜像创建时的变量
--cpu-shares 设置 CPU 使用权重
--cpu-period 限制 CPU CFS 周期
--cpu-quota 限制 CPU CFS 配额
--cpuset-cpus 指定使用的 CPU id
--cpuset-mems 指定使用的内存 id
--disable-content-trust 忽略校验,默认开启
-f 指定要使用的 Dockerfile 路径
--force-rm 设置镜像过程中删除中间容器
--isolation 使用容器隔离技术
--label=[] 设置镜像使用的元数据
-m 设置内存最大值
--memory-swap 设置 Swap 的最大值为内存 +swap,"-1"表示不限 swap
--no-cache 创建镜像的过程不使用缓存
--pull 尝试去更新镜像的新版本
-q 安静模式,成功后只输出镜像 ID
--rm 设置镜像成功后删除中间容器
--shm-size 设置 /dev/shm 的大小,默认值是 64M
--ulimit Ulimit 配置

样例

从已经创建的容器中更新镜像,并且提交这个镜像

docker commit -m="has update" -a="shitao" ede0be5f1842 mysql:v2

OPTIONS说明

参数 解释
-m 提交的描述信息
-a 指定镜像作者
ede0be5f1842 容器 ID (通过docker ps -a查看)
mysql:v2 mysql 镜像的仓库源名 v2 镜像的标签

样例

使用 Dockerfile 指令来创建一个新的镜像

我们使用命令 docker build,从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

docker build -t imagesname:2.0 /home/shitao/file/

OPTIONS说明

参数 解释
-t 指定要创建的目标镜像名
imagesname:2.0 imagesname 镜像的仓库源名 2.0 镜像的标签
/home/shitao/file/ dockerfile 路径

tag

标记本地镜像,将其归入某一仓库

docker tag 9e64176cd8a2 mysql163:2.0.1

OPTIONS说明

参数 解释
9e64176cd8a2 镜像 id (镜像名)
mysql163:2.0.1 mysql163 镜像的仓库源名 2.0.1 镜像的标签

使用 docker images 命令可以看到,ID为 9e64176cd8a2 的镜像多个标签

save

将指定镜像保存成 tar 归档文件

docker save -o /home/shitao/Downloads/mysql.tar 9e64176cd8a2

将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档

OPTIONS说明

参数 解释
9e64176cd8a2 镜像 id (镜像名)
/home/shitao/Downloads/mysql.tar 保存的地址

import

从归档文件中创建镜像

docker import /home/shitao/Downloads/mysql.tar mysql:0.2

OPTIONS说明

参数 解释
mysql:0.2 mysql 镜像的仓库源名 0.2 镜像的标签
/home/shitao/Downloads/mysql.tar 归档文件地址

inspect

获取容器/镜像的元数据

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明

参数 解释
-f 指定返回值的模板文件
-s 显示总的文件大小
--type 为指定类型返回JSON

样例

docker inspect 9e6

容器生命周期管理

run

docker run -it hub.c.163.com/library/mysql /bin/bash

OPTIONS说明

参数 解释
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
hub.c.163.com/library/mysql 镜像名
-P 将容器内部使用的网络端口映射到我们使用的主机上
-d 后台运行容器,并返回容器ID

start

启动一个或多少已经被停止的容器

docker start {容器ID|容器名称}

stop

停止一个运行中的容器

docker stop {容器ID|容器名称}

restart

重启容器

docker restart {容器ID|容器名称}

kill

杀掉一个运行中的容器

docker kill {容器ID|容器名称}

rm

删除一个或多少容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明

参数 解释
-f 通过 SIGKILL 信号强制删除一个运行中的容器
-l 移除容器间的网络连接,而非容器本身
-v 删除与容器关联的卷

删除指定容器

docker rm {容器ID|容器名称}

删除所有容器

docker rm $(docker ps -a -q)

exec

在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明

参数 解释
-d 分离模式: 在后台运行
-i 即使没有附加也保持 STDIN 打开
-t 分配一个伪终端

样例

docker exec -it {容器ID|容器名称} /bin/bash

容器操作

ps

查看正在运行的容器

docker ps [OPTIONS]

OPTIONS说明

参数 解释
-a 显示所有的容器,包括未运行的
-f 根据条件过滤显示的内容
--format 指定返回值的模板文件
-l 显示最近创建的容器
-n 列出最近创建的n个容器
--no-trunc 不截断输出
-q 静默模式,只显示容器编号
-s 显示总的文件大小

样例

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a0ec27520c6 hub.c.163.com/library/mysql "docker-entrypoint..." 12 seconds ago Up 9 seconds 3306/tcp amazing_ardinghelli

各个项目说明:

项目 解释
CONTAINER ID 容器ID
IMAGE 镜像名称
COMMAND 命令
CREATED 容器创建时间
PORTS 端口
NAMES 容器名称

inspect

获取容器/镜像的元数据

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明

参数 解释
-f 指定返回值的模板文件
-s 显示总的文件大小
--type 为指定类型返回JSON

样例

docker inspect 9e6

top

查看容器中运行的进程信息,支持 ps 命令参数

docker top CONTAINER

logs

获取容器的日志

docker logs [OPTIONS] CONTAINER

OPTIONS说明

参数 解释
-f 跟踪日志输出
--since 显示某个开始时间的所有日志
-t 显示时间戳
--tail 仅列出最新N条容器日志

样例

docker logs -f 9e6

Docker 命令

Docker与宿主机相互拷贝文件:

  docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径      (可相互变化即实现文件的相互拷贝)

批量删除Docker中已经停止的容器

方法一:

#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,

sudo docker ps -a|grep Exited|awk '{print $1}'

#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器

sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`

方法二: 

#删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)

sudo docker rm $(sudo docker ps -a -q)

方法三:

#根据容器的状态,删除Exited状态的容器

sudo docker rm $(sudo docker ps -qf status=exited)

方法四:

#Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。

sudo docker container prune

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!