Docker基本操作 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基本操作
Docker

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

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

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

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

Docker基本操作
Docker

 最常用的包括Images和Container,

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

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

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

Docker基本操作
Docker

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

Docker基本操作
Docker

这张图展示了 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 镜像仓库

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 配置

样例

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

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

杀掉一个运行中的容器

kill {容器ID|容器名称}

rm

删除一个或多少容器

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

OPTIONS说明

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

删除指定容器

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

删除所有容器

docker rm $(docker ps -a -q)

exec

在运行的容器中执行命令

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

OPTIONS说明

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

样例

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与宿主机相互拷贝文件:

  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

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 配置

样例

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

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

杀掉一个运行中的容器

kill {容器ID|容器名称}

rm

删除一个或多少容器

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

OPTIONS说明

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

删除指定容器

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

删除所有容器

docker rm $(docker ps -a -q)

exec

在运行的容器中执行命令

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

OPTIONS说明

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

样例

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