Fork me on GitHub

Docker常用命令

docker简介

Docker是由PaaS提供商dotCloud在2013年创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量、可移植、自包涵的容器引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机器、生产环境、虚拟机和云等。
Docker一个基于LinuX Container(LXC)技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源。它提供了一种在安全、可重复的环境中自动部署软件的方式。
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

docker优势

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

docker virtual

基本概念

三个基本组件:镜像、容器、仓库

1.镜像
Docker镜像(Image)就是一个只读的模版。镜像可以用来创建Docker容器

2.容器
Docker利用容器(Container)来运行应用
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

3.仓库
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库又包含了多个镜像,每个镜像有不同的标签(tag)
仓库分为公有(Public)/私有仓库(Private)两种形式

搭建docker

安装docker

ubuntu安装docker

wget -qO- https://get.docker.com/ | sh 或者 curl -sSL https://get.docker.com/ | sh

centos安装docker

yum install docker -y

mac下安装docker: 可以下载安装包安装

启用/停止/重启docker

service docker start/stop/reload
或者
systemctl start/stop/reload  docker.service 

镜像

docker search [IMAGE NAME]

查询镜像

下载镜像(以安装centos7为例)

docker pull centos:latest

下载完毕,利用docker images查看:

REPOSITORY          TAG     IMAGE ID      CREATED      SIZE
docker.io/centos    latest  2d194b392dd1  2 hours ago  195.4 MB

备注:镜像版本下载来源, 可以查看支持的镜像,例如:

docker-iso

修改镜像REPOSITORY/TAG

docker tag 原REPOSITORY:TAG 自义定名:自定义TAG名  #实际上是新建了镜像
docker tag IMAGE ID(镜像id) REPOSITORY:TAG  #实际上是新建了镜像

删除镜像

docker rmi REPOSITORY #删除的即:REPOSITORY名称:latest(lastest是默认TAG)
docker rmi REPOSITORY:TAG
docker rmi [IMAGE ID]

#清理所有悬挂(<none>)镜像:
docker image prune  #docker image prune -a 清理所有无用镜(慎用)
docker rmi $(docker images -qf "dangling=true")

例如:当存在IMAGE ID相同的多个镜像,删除某一个时:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos/lnmp         v1.0.0              1b5426efccfe        35 minutes ago      536 MB
jasonhzy/lnmp       v1.0.0              1b5426efccfe        35 minutes ago      536 MB

删除其中一个即:

docker rmi  centos/lnmp:v1.0.0 

容器

查看运行的容器

docker ps

例如:

CONTAINER ID  IMAGE         COMMAND      CREATED         STATUS        PORTS  NAMES
86d91c2b5295  2d194b392dd1  "/bin/bash"  2 minutes ago   Up 2 minutes         goofy_jennings    

查看所有容器(包括停止的)

docker ps -a

例如:

CONTAINER ID  IMAGE         COMMAND      CREATED         STATUS                     PORTS  NAMES
b2273f60a8ff  2d194b392dd1  "/bin/bash"  4 seconds ago   Up 4 seconds                      gigantic_wilson
86d91c2b5295  2d194b392dd1  "/bin/bash"  2 minutes ago   Exited (0) 10 seconds ago         goofy_jennings

进入容器(前提是容器必须是启动状态)

docker exec -it 86d91c2b5295 /bin/bash #其中字符串为容器ID
#退出命令行,exit或者ctrl + p、ctrl + q来退出容器。

启用容器

docker start [NAME]/[CONTAINER ID]

停用运行中的容器:

docker stop [NAME]/[CONTAINER ID] #停用某一个容器
docker stop $(docker ps -q) #停用全部运行中的容器

删除容器:

docker rm [NAME]/[CONTAINER ID] #不能删除一个正在运行的容器,会报错。需要先停止容器。
docker rm $(docker ps -aq) #删除全部容器, 或者docker container prune

一条命令实现停用并删除容器:

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

其他

# Docker提供了docker system prune,可以用于清理dangling镜像(参考What are Docker <none>:<none> images?)和容器,以及失效的数据卷和网络。
docker system prune

# 这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络
docker system prune -a

清理所有无用数据卷
docker volume prune   #docker volume ls查看数据卷 

提交镜像 【将容器提交成镜像】

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]   

例如:

# docker commit -a "jasonhzy" -m "centos php nginx" b2273f60a8ff centos/lnmp:v1.0.0
sha256:1b5426efccfe07977227edbe13e48c68e2beefbe4dd8a89ae6081d7c2a0cc40d

各个参数说明:

-m 提交的描述信息
-a 指定镜像作者
b2273f60a8ff 容器ID
centos/lnmp:v1.0.0 指定要创建的目标镜像名

获取完整的容器ID

docker inspect -f   '{{.Id}}' [ID/NAME] 

例如:

CONTAINER ID  IMAGE                COMMAND    CREATED       STATUS       PORTS                                    NAMES
de07f0a1f26a  jasonhzy/php5.6-fpm  "php-fpm"  11 hours ago  Up 4 minutes 22/tcp, 80/tcp, 0.0.0.0:9100->9000/tcp   phpfpm

docker inspect -f   '{{.Id}}' de07f0a1f26a(或者phpfpm)
de07f0a1f26af3d3a2bae5546f8b05106fec20bb6293a2e1893a54dd443697b1 #完整的容器ID    

容器与主机之间的数据拷贝

1.从主机往容器中拷贝

docker cp <主机文件/文件夹路径>    <CONTAINER ID>:<容器内文件/文件夹路径>

例如:复制主机/var/www/html目录下的文件夹test到容器的根目录文件夹tmp下

docker cp /var/www/html/test  de07f0a1f26a:/tmp/
docker cp /var/www/html/test  de07f0a1f26a:/tmp/xxx #文件夹test复制并重命名为xxx

2.将容器中文件拷往主机

docker cp <CONTAINER ID>:<容器内文件/文件夹路径>    <主机文件/文件夹路径>

例如:复制容器/var/www/html下的文件夹test到主机根目录文件夹tmp下

docker cp de07f0a1f26a:/var/www/html/test /tmp/   

资源限制与监控

  1. 可用于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间占用情况

    docker system df #可以进一步通过-v参数查看空间占用细节

  2. 设置CPU、内存之后,动态修改

    docker update -m 100m [容器ID/NAME]

  3. 查看docker容器使用的资源

    docker stats

可实时地显示容器的资源使用(内存, CPU, 网络等),默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c

Docker on MacOS

macOS中docker架构与在其它Linux系统中略有不同,在Linux系统中,操作系统本身即是docker容器的宿主机,docker镜像都是直接存储在宿主机本身的文件系统中,
比如我们通过docker info命令可以看到docker的根目录是:

$ docker info | grep "Root Dir"
Docker Root Dir: /var/lib/docker

但是在macOS下,我们直接查看这个目录,其实是根本不存在的。在macOS中安装docker并启动,其实就是启动了一个虚拟机,这个虚拟机的整个内容全部都在一个文件里即:

/Users/Kamus/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

macOS下的screen命令可以进入该台虚拟机:

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty      

备注:1、断开当前会话,会话在后台运行:ctrl+a, d(先按control+a,再按d)
2、重新打开窗口:screen r
3、查看所有后台运行会话:screen ls
4、关闭当前会话,并退出:ctrl+a, k(先按control+a,再按k)

参考资料

1.Docker中文
2.Docker on MacOS

轻轻的我走了,正如我轻轻的来