EchoDemo's Blogs

docker常用命令

docker镜像常用命令

什么是docker镜像?

操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root文件系统。比如官方镜像centos:latest 就包含了完整的一套centos:latest最小系统的root文件系统。

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像由多层文件系统联合组成。被称之为分层存储。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储这一特点会在下载镜像的时候显现出来。

1、搜索镜像

docker search java

2、下载镜像

// 由于docker search命令只能查找出是否有该镜像,不能找到该镜像支持的版本,所以我们需要通过docker hub来搜索支持的版本。进入docker hub的官网,地址:https://hub.docker.com。然后搜索需要的镜像,查看镜像支持的版本。

docker pull java:8

3、列出镜像

// 查看所有镜像
docker images 或 docker image ls

// 查看某一个指定镜像
docker image ls nginx:1.14.2

// 过滤匹配镜像(nginx:latest之后下载的镜像,之前用before)
docker image ls -f since=nginx:latest

4、删除镜像

// 指定名称删除镜像
docker rmi java:8

// 指定名称删除镜像(强制)
docker rmi -f java:8

// 强制删除所有镜像
docker rmi -f $(docker images)

// 删除所有未被 tag 标记和未被容器使用的镜像
docker image prune

// 删除所有未被容器使用的镜像
docker image prune -a

docker容器常用命令

什么是docker容器(Container)?

镜像(Image)和容器(Container)有紧密的关系,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

1、新建并启动容器

docker run -it --rm -p 80:80 --name nginx -d nginx:1.17.0 /bin/bash

-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。使用 --rm 可以避免浪费空间。
-p:指定端口映射,格式为:hostPort:containerPort
--name:指定运行后容器的名字为nginx,之后可以通过名字来操作容器
-d:表示后台运行
/bin/bash:以交互模式启动一个容器,在容器内执行/bin/bash命令。

2、列出容器

// 列出运行中的容器
docker ps

// 列出所有容器
docker ps -a

3、停止/启动容器

// $ContainerName及$ContainerId可以用docker ps命令查询出来
docker stop $ContainerName(或者$ContainerId)

// 强制停止容器
docker kill $ContainerName(或者$ContainerId)

// 启动已停止的容器
docker start $ContainerName(或者$ContainerId)

// 重启容器
docker restart $ContainerName(或者$ContainerId)

4、进入/导入/导出容器

// 进入容器(推荐)
docker exec -it $ContainerId /bin/bash

// 进入容器
docker attach $ContainerId

// 导出容器
docker export $ContainerId > filename.tar

// 导入容器(生成镜像)
cat filename.tar | docker import - $imagename:$tag

5、删除容器

// 删除指定容器
docker rm $ContainerName(或者$ContainerID)

// 强制删除所有容器
docker rm -f $(docker ps -a -q)

// 删除所有已退出或者终止的容器
docker container prune

6、查看容器的日志

docker logs $ContainerName(或者$ContainerId)

7、查看容器的IP地址

docker inspect --format '{{ .NetworkSettings.IPAddress }}' $ContainerName(或者$ContainerId)

8、同步宿主机时间到容器

docker cp /etc/localtime $ContainerName(或者$ContainerId):/etc/

9、在宿主机查看docker使用cpu、内存、网络、io情况

// 查看指定容器情况
docker stats $ContainerName(或者$ContainerId)

// 查看所有容器情况
docker stats -a

10、进入Docker容器内部的bash

docker exec -it $ContainerName /bin/bash

修改Docker镜像的存放位置

1、查看docker镜像的存放位置

docker info | grep "Docker Root Dir"

2、关闭Docker服务

systemctl stop docker

3、移动目录到目标路径

mv /var/lib/docker /mydata/docker

4、建立软连接

ln -s /mydata/docker /var/lib/docker

什么是docker仓库(Repository)?

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。以Ubuntu镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

仓库名经常以两段式路径形式出现,比如jwilder/nginx-proxy,前者往往意味着Docker Registry多用户环境下的用户名,后者则是对应的软件名。

镜像加速器配置

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:Docker官方提供的中国registry mirror(https://registry.docker-cn.com);七牛云加速器(https://reg-mirror.qiniu.com/)

我们以 Docker 官方加速器 https://registry.docker-cn.com 为例进行介绍。对于使用systemd的系统(Debian 8+、CentOS 7),可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。之后重新启动服务。

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,如果从结果中看到了如下内容,说明配置成功。

[root@localhost home]# docker info
......
Registry Mirrors:
https://registry.docker-cn.com/
Live Restore Enabled: false
Product License: Community Engine
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------