Docker基础总结

等你发现时光是贼了,它早已偷光你的选择。

最近一直在学习Docker, 使用Docker搭建漏洞环境, 踩了点坑, 也写点总结

简介

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

Docker 镜像

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

Docker 容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

Docker 仓库

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

安装

Ubuntu 上安装

1
2
3
4
5
sudo apt-get install apt-transport-https
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker

或者使用脚本安装最新Docker

1
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh –

Mac 上安装

前往官网下载安装包:https://www.docker.com/products/docker#/mac

下载完以后直接安装,安装完成后运行docker run hello-world,如果没有报错,说明安装成功。

常用命令

镜像

  • 查看本地镜像列表:
1
2
3
root@Kali:~# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo latest cdc6740b66a7 2 weeks ago 361MB
  • 其他镜像操作:
1
2
3
4
5
6
7
8
9
docker search (image-name) 查询镜像 example:docker search ubuntu
docker history (image-name) 查看镜像的历史版本
docker push (image-name) 将镜像推送到registry
docker pull image-name:tag pull镜像 example:docker pull ubuntu:latest
docker rmi <image id> 删除镜像(先stop并删除镜像上的所有容器)
docker rmi $(docker images -q) 删除全部镜像
docker tag image-id imagename:tag 修改镜像的tag标签
docker load -i test.tar 从tar文件中载入镜像
docker save image > test.tar 保存镜像为tar文件

容器

  • 检查容器运行状态:
1
2
3
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c6423736109 1fe624b994f8 "/bin/sh -c 'dep ens…" 4 days ago Exited (1) 4 days ago jolly_agnesi
  • 创建容器
    • –rm 一旦进程退出,则删除容器
    • -it 进入交互模式
    • ubuntu 容器立足的镜像名字
    • /bin/bash 要运行的命令
    • -d 后台运行
    • -p 映射的端口,:前为本机,后为容器
    • –name 自定义名称
1
docker run --rm -it ubuntu /bin/bash
1
docker run -d -p 8000:80 --name test image-name
  • 更多容器操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
docker attach container 进入容器交互式界面
docker diff container 列出容器内发生变化的文件与目录
dcoker logs ID(容器的ID,可以用docker ps查看) 查看docker上的容器的状态
docker stop ID(或者容器名字) 关闭运行中的容器
docker start ID 开启容器
docker restart ID 重启运行中的容器
docker stop ID docker rm ID 移除容器(先关闭再删除)
docker kill [options] container 杀死容器的主进程
docker stop $(docker ps -a -q) 停止所有container
docker rm $(docker ps -a -q) 移除所有container
docker commit ID new镜像名字(只能字母加数字) 将容器的状态保存为镜像
docker export container > test.tar 将容器打包成tar文件
docker cp container:path hostpath 从容器内复制文件到指定的路径