Docker 笔记

Docker简介

  • Docker是一个新的容器化的技术,容器有效的将单个操作系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求。
  • Docker 容器本质上是宿主机上的一个进程。Docker 通过 namespace 实现了资源隔离,通过 cgroups 实现了资源的限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
  • Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,Docker运用Namespace将进程隔离,为进程或进程组创建已隔离的运行空间,为进程提供不同的命名空间视图。这样,每一个隔离出来的进程组,对外就表现为一个container(容器)。

两个应用之间的环境是环境是完全隔离的,建立通信机制来互相调用。容器的创建和停止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机本身占用的资源少。

镜像和容器

  • Image: 镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
  • Container:容器是镜像的运行时实例 - 实际执行时镜像会在内存中变成什么。默认情况下,它完全独立于主机环境运行,仅在配置为访问主机文件和端口的情况下才执行此操作。

容器可以获取本机访问,每个容器都在独立进程中运行,占用的内存不超过任何其他可执行文件。

Doker的使用

启动和放入启动项

#centos7.0版本
systemctl start docker 
systemctl enable docker

#兼容老版本
service docker start
chkconfig docker on

查看docker信息

docker version          # 查看docker版本
docker info             # 显示docker系统的信息  

image操作

docker search [镜像]      #搜索镜像
docker pull [镜像]        #下载镜像
docker run -p 4000:80 username/repository:tag #从远程镜像仓库中拉取并运行镜像

sudo docker pull ubuntu:12.04 等同于
docker pull registry.hub.docker.com/ubuntu:12.04 

docker push [镜像]            #发布镜像
docker rmi [镜像]             #删除镜像
docker images                 #查看本地镜像(列目录)
docker images    -q           #只显示镜像ID
docker history [镜像]         #历史镜像
docker tag [镜像] username/repository:tag #标记镜像

docker rmi $(docker images -q)      #删除所有停止的镜像
docker rmi -f $(docker images -q)   #强制删除所有的镜像

容器操作

#创建容器
docker run [镜像] /bin/echo hello world       #输出hello world
docker run -i -t [镜像] /bin/bash             #交互式进入容器 #-i: 以交互模式运行容器  -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
docker run [镜像]  apt-get install -y app_name    #在容器安装新的程序

docker exec -it kali /bin/bash          #进入容器
docker run -it -d kali                  #启动容器,后台运行 #-d: 后台运行容器,并返回容器ID;
docker run -it -p 53:53 kali            #启动容器的时候可以映射端口 #-p: 端口映射,格式为:主机(宿主)端口:容器端口

#数据卷
docker run -it -v /data:/data kali      #共享目录,本机和容器共享data目录 #-v 挂载宿主机目录 宿主机目录:容器目录
docker run -it -v /data:/data:ro kali       #只读共享目录,本机和容器共享data目录(容器只读)

docker run -it -v /data --name web1 kali        #虚拟机web1创建共享目录
docker run -it --volumes-from web1 --name web2 kali     #共享web1的目录(不需要通过本机共享)
#1、数据卷虚拟机开启或者关闭对共享无影响
#2、数据卷虚拟机多次作为共享目录,也可以做共享
#3、数据卷多次挂在,有重复名字,则以最后一个--volumes-from的为最后结果
#4、如果已经挂在数据卷的容器,删除数据卷对其无影响

#查看容器
docker ps                   #列出当前运行的容器
docker ps -a                #列出所有的容器
docker ps -l                #列出最近一次启动的容器
docker ps -a -q             #查看所有的容器ID

#容器操作
docker inspect [容器名字]/ID        #显示容器信息

docker start [容器名字]/ID      #启动容器
docker stop [容器名字]/ID       #停止容器
docker kill [容器名字]/ID       #杀死容器
docker restart [容器名字]/ID        #重新启动容器
docker attach [容器名字]/ID     #进入容器
docker logs [容器名字]/ID       #查看容器日志
docker diff [容器名字]/ID       #查看容器修改操作
docker top [容器名字]/ID            #显示容器进程信息
docker cp ID:/path to_path      #从容器中拷贝数据到本地
docker cp [容器名字]:/path to_path  #从容器中拷贝数据到本地

#删除容器
docker rm [容器]/ID       #删除容器
docker rm $(docker ps -a -q)    #删除所有停止的容器
docker rm -f $(docker ps -a -q) #强制删除所有的容器

网络

docker是分为客户端和服务端两部分。

#重启
systemctl daemon-reload
systemctl restart docker.service 

#Docker开启远程访问
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock #tcp 是远程连接,unix 是本地socket 链接

#连接方式
unix:///var/run/docker.sock docker默认的客户端与守护进程链接的方式
tcp://host:port
fd://socketfd


#同时监听多个socket
dockerd -H unix:///var/run/docker.sock -H tcp://127.0.0.1:2376 -H tcp://127.0.0.1:2377

docker客户端使用dockerinfo默认访问的是本地Server。可以修改环境变量DOCKER_HOST改变默认连接。
export DOCKER_HOST="tcp://127.0.0.1:2375"

#Docker远程连接
docker -H 192.168.1.1:2376 images

Referer

docker命令说明
docker安装与使用
docker中文文档