Docker是什么?
Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
容器与虚拟机对比
docker的三个重要概念
Image(镜像):
那么镜像到底是什么呢?Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
Container(容器)
容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
Repository(仓库)
镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 Latest 作为默认标签。
docker的组成部分
docker是传统的CS架构分为docker client和docker server
Docker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 Docker 命令行运行命令时,Docker 客户端将这些命令发送给服务器端,服务端将执行这些命令。
Docker 命令使用 Docker API 。Docker 客户端可以与多个服务端进行通信。
废话不多说,开始操作!
Docker安装
阿里云官方下载教程
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast sudo yum -y install docker-ce sudo systemctl start docker sudo systemctl enable docker
添加阿里云下载源
cat >> /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://8m3kgh6j.mirror.aliyuncs.com"] } EOF systemctl restart docker
docker version #查看docker版本号
[root@docker ~ ]# docker version #查看docker版本号 Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:27:04 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:25:42 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683
docker info # 查看详细信息
[root@docker ~ ]# docker info Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 19.03.8 Storage Driver: overlay2 Backing Filesystem: <unknown> Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-862.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 974.6MiB Name: docker ID: OAEC:CKHI:I3LT:MV35:WGP2:V2UV:JZQI:7LJW:UTDS:57ZX:LOP4:5RN3 Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled
Docker帮助命令
docker --help #查看帮助命令
Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/root/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") --tlskey string Path to TLS key file (default "/root/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Management Commands: builder Manage builds config Manage Docker configs container Manage containers context Manage contexts engine Manage the docker engine image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes Commands: attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes Run 'docker COMMAND --help' for more information on a command.
Docker 镜像命令
[root@docker ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 表示镜像仓库源 镜像的标签 镜像ID 创建时间 镜像大小 docker images -a 列出本地所有镜像(含中间映像层) -q 只显示镜像ID --digests 显示镜像摘要信息 --no-trunc 显示完成镜像信
docker search nginx # 查找nginx镜像
docker search -s 30 nginx docker search --no-trunc 显示完整的镜像描述 -s 列出收藏数不小于指定值的镜像 -automated 只列出automated bulid 类型的镜像
docker pull nginx #拉取nginx镜像
docker pull nginx:laster 等价于 docker pull nginx docker pull nginx:1.16
docker rmi -f nginx #删除nginx镜像 / ID
[root@docker ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 927899a31456 10 days ago 647MB nginx latest 602e111c06b6 11 days ago 127MB # 删除多个镜像 docker rmi -f nginx tomcat # 删除多个镜像 docker rmi -f $(docker images -qa)
容器命令
# 拉取centos镜像 docker pull centos [root@docker ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 927899a31456 10 days ago 647MB nginx latest 602e111c06b6 11 days ago 127MB centos latest 470671670cac 3 months ago 237MB # 启动镜像 docker run [options] image [command] [arg...] [options] -- name="容器新名字" 为容器指定一个名字 -d: 后台u运行容器,并返回ID,也即启动守护式容器 -i: 以交互式模式运行容器,通常与-t 同时使用 -t: 为容器重新分配一个伪输入终端,通常与-i 同时使用 -P:随机端口映射 -p:指定端口映射,有四种格式 ip:hostPort:containePort ip::containePort hostPort:containePort containePort docker run -it 470671670cac [root@docker ~ ]# docker run -it 470671670cac [root@89d274b1eb30 /]# docker run -it --name=mycentos centos [root@docker ~ ]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 00e351ad1cbc centos "/bin/bash" 10 seconds ago Up 10 seconds mycentos # 后台运行 docker run -d centos # 查看容器日志 docker logs -f -t --tail 容器ID # 查看容器内运行的进程 docker top 容器ID # 查看容器内部细节 docker inspect 容器ID # 进入正在运行的容器并以命令行交互 docker exec -it 容器ID /bin/bash # 重新进入容器 docker attach 容器ID #区别 attach 直接进入容器启动命令的终端,不会启动新的进程 exec 是在容器中打开新的终端,并可以启动新的进程 # 列出当前正在运行的容器 docker ps [options] -a 列出当前所有正在运行的容器+历史运行记录 -l 显示最近创建的容器 -n 显示最近n个创建的容器 -q 静默模式 只显示容器编号 --no-trunc 不截断输出 [root@docker ~ ]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 89d274b1eb30 470671670cac "/bin/bash" 从容器内拷贝文件到主机上 docker cp 容器ID:容器内的路径 目的主机的路径 # 退出容器 exit # 关闭容器 [root@docker ~ ]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b5b974d4d563 centos "/bin/bash" 8 seconds ago Up 8 seconds reverent_kirch [root@docker ~ ]# docker stop reverent_kirch reverent_kirch [root@docker ~ ]# docker stop b5b974d4d563 b5b974d4d563 # 启动容器 docker start centos docker start 470671670cac # 重启容器 docker restart centos docker restart 470671670cac # 强制关闭容器 docker kill 容器名/容器ID docker kill 470671670cac # 删除已停止的容器 docker rm 470671670cac # 删除多个容器 docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
Docker 镜像
什么是镜像? 镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件 它包含运行某个软件所需要的内容,包括代码,运行时的库,环境变量和配置文件。 UnionFS(联合文件系统) Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统, 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。 Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 Docker镜像加载原理 docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。 bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。 rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。 。 平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?? 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。 Docker镜像都是只读的 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。 分层的镜像 Docker为了节约存储空间共享数据会对镜像和容器进行分层,不同镜像可以共享相同数据,并且在镜像上为容器分配一个RW层来加快容器的启动顺序 镜像层和容器层 每个镜像都由多个镜像层组成,从下往上以栈的方式组合在一起形成容器的根文件系统,Docker的存储驱动用于管理这些镜像层,对外提供单一的文件系统 当容器启动时,Docker就会创建thin类型的可读写容器层,使用预分配存储空间,也就是开始时并不分配存储空间,当需要新建文件或修改文件时,才从存储池中分配一部分存储空间 每个容器运行时都有自己的容器层,保存容器运行相关数据(所有文件变化数据),因为镜像层是只读的,所以多个容器可以共享同一个镜像 删除容器时,Docker Daemon会删除容器层,保留镜像层 Docker镜像为什么要采用分层结果呢? 每个软件都是基于某个镜像去运行的,因此一旦某个底层环境出现问题,就不需要去修改全部基于该镜像的软件的镜像,只需要修改底层环境的镜像。 共享资源,其它相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像要去创建一个底层环境 特点 共享资源